From a2bca87d988bba9c43d83d98701cc4a7f6c254a5 Mon Sep 17 00:00:00 2001 From: Frontier <103474701+frontier159@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:54:59 +1100 Subject: [PATCH 1/2] feat: epoch-26b (#1124) --- apps/dapp/src/constants/env/production.tsx | 4 ++++ protocol/scripts/deploys/helpers.ts | 2 ++ .../deploys/mainnet/team-payments/deploy.ts | 2 +- .../mainnet/team-payments/json/epoch26b.json | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 protocol/scripts/deploys/mainnet/team-payments/json/epoch26b.json diff --git a/apps/dapp/src/constants/env/production.tsx b/apps/dapp/src/constants/env/production.tsx index 5cc0534e0..d961619fa 100644 --- a/apps/dapp/src/constants/env/production.tsx +++ b/apps/dapp/src/constants/env/production.tsx @@ -166,6 +166,10 @@ const env: Environment = { name: 'Epoch 26a', address: '0xf78d757da74d5f3a67599240eab918FC347f2BdE', }, + { + name: 'Epoch 26b', + address: '0xa493DaEeEb5BaDf74fdB872555090A7850ac49f0', + }, ], temple: '0x470ebf5f030ed85fc1ed4c2d36b9dd02e77cf1b7', templeStaking: '0x4D14b24EDb751221B3Ff08BBB8bd91D4b1c8bc77', diff --git a/protocol/scripts/deploys/helpers.ts b/protocol/scripts/deploys/helpers.ts index 19b617369..38a860148 100644 --- a/protocol/scripts/deploys/helpers.ts +++ b/protocol/scripts/deploys/helpers.ts @@ -46,6 +46,7 @@ interface TeamPayments { TEMPLE_TEAM_EPOCH_25B: string; TEMPLE_TEAM_EPOCH_25C: string; TEMPLE_TEAM_EPOCH_26A: string; + TEMPLE_TEAM_EPOCH_26B: string; } export interface DeployedContracts { @@ -319,6 +320,7 @@ export const DEPLOYED_CONTRACTS: { [key: string]: DeployedContracts } = { TEMPLE_TEAM_EPOCH_25B: '0x0197B9F8d504e020C875fcafb3403e55Bef31c36', TEMPLE_TEAM_EPOCH_25C: '0xb486C1D3F49D20b442ba77f169998a16550ddAd8', TEMPLE_TEAM_EPOCH_26A: '0xf78d757da74d5f3a67599240eab918FC347f2BdE', + TEMPLE_TEAM_EPOCH_26B: '0xa493DaEeEb5BaDf74fdB872555090A7850ac49f0', }, TEMPLE_TEAM_PAYMENTS_IMPLEMENTATION: '', diff --git a/protocol/scripts/deploys/mainnet/team-payments/deploy.ts b/protocol/scripts/deploys/mainnet/team-payments/deploy.ts index a397747b3..433a12262 100644 --- a/protocol/scripts/deploys/mainnet/team-payments/deploy.ts +++ b/protocol/scripts/deploys/mainnet/team-payments/deploy.ts @@ -6,7 +6,7 @@ import { expectAddressWithPrivateKey, toAtto, } from '../../helpers'; -import snapshot from './json/epoch26a.json'; +import snapshot from './json/epoch26b.json'; // TODO: Add command line arguments for json allocations file async function main() { diff --git a/protocol/scripts/deploys/mainnet/team-payments/json/epoch26b.json b/protocol/scripts/deploys/mainnet/team-payments/json/epoch26b.json new file mode 100644 index 000000000..4c7b7cdbb --- /dev/null +++ b/protocol/scripts/deploys/mainnet/team-payments/json/epoch26b.json @@ -0,0 +1,17 @@ +{ + "0xDd10BE8f410CEa5340343aE676eccD8D68CEC239": 8000, + "0x6e85a8c802dcA39bEB4cE6Eb4C6acD1eB2742564": 10000, + "0xe345e9605391c13Fd2502e7141D54b752AaDB184": 12000, + "0xfd6A18e866b44225fd0A2ce3DEda383a40A126Fb": 49632, + "0x5be727eC4a70572927d2425d2Daed9a278e9b931": 14000, + "0x97Ec4001aD1d2a1FBb581ea34C5C0Bd4a210C25C": 42500, + "0x588282ADA5B9D872d0eBF506c5C1b541e2a60BBa": 14000, + "0xB8C400E4E9360ae7a3480A2F63e2A5aA85696148": 100, + "0x07dA99dff5F996FaD9FCe0e15a20edC4DBeAe028": 16500, + "0x0DA2d90C1CfAe8c5d1A844c1f622d56A0143179C": 11520, + "0xd8997EF690647d1B85aCF906e7Dd5cC6CAee43E0": 6300, + "0x7276fECAA8BaE32908c82b7b55e88e3e86Bf7A60": 1000, + "0xF94A14fdEbf75007329E50f0aC9f459fF566B157": 2000, + "0x120bE21b3159e26e5EE2906d991D3be63Cb1a116": 9375, + "0xe07d083d4A8810E5b35300a6De579fB2AF525e2F": 4000 +} From f42b59ba35cf32dfce1b012a93de4e9fea1265c2 Mon Sep 17 00:00:00 2001 From: princetonbishop <92975084+princetonbishop@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:44:56 +0200 Subject: [PATCH 2/2] temple gold contracts (#990) * first draft temple gold contracts * templegold update * reorganize templegold files * reorganize files * integrating OZ gov after merge * restructure, distribution update, spice auction contract * override lz functions, add lz config, peers * add vote weight implementation * use templeGold proxy with elevated access * remove external manual lz imports * remove unused contract * temple teleporter * modify vote token, chief approvals * remove governance contracts, cleanup * cleanup * change whitelist func name * interface update * first README * updates from review * yarn lock * slither run * daigoldauction tests * dai gold auctio tests update * spice auction factory test * update spice auctions contract * spice and spice factory tests update * spice auctions tests * vote token tests * tests update * tests update * vote weight tests, staking tests * test update and proxy tests * tgold proxy tests, temple gold tests * tests update, before lzdevtools install * forge install: devtools * lz send test crosschain * add comments, minor changes * update slither * test coverage * coverage tests, fix remove auction config bug * cross chain tests, update sol version in contracts * use latest block for forks * remove old fork method * review changes * remove vote token, epoch lib * recover token, remove auction config, review updates * review changes * delegates functions and tests * update readme * review updates * feat: fork lz devtools to get coverage working * some tests, remove distribution params check in mint() * fix templegold mint math, some tests * tgld audit fix M01 * tgld audit fix m02 * tgld audit fix m03 * tgld audit fix m04 * tgld audit fix h01 * tgld audit fix m05 * tgld audit fix m08 * tgld audit fix m09 * tgld audit fix m10 * tgld-audit-fix-m10 update * tgld audit fix m12 * tgld audit fix m13 * tgld audit fix m11 * cleanup * cleanup * tgld aucit fix h15 * tgld audit fix m01 update * slither run * slither run * slither update * slither * slither file * slither file * slither * tgld audit fix m06 * tgld audit refix m05 * test update * slither file * slither file * pre merge * remove duplicate * update test * slither * slither file * tgld-audit-fix-i03 * slither run * cleanup * test update * last update time in reward notification * update fork block number * update block number * fix: link arb one rpc to gh actions * yarnlock conflict * gas savings * cleanup * update readme * test update, deploy scripts * remove audit scope file * update readme * remove tgld compiler warnings * redemption in spice auction, test update * slither * hawks l01 * hawks l02 * hawks l03 * hawks l04 * hawks l05 * hawks m01 * hawks m02 * new staking * redemption test * redemption tests * cleanup * review update, new staking * review update * deploy scripts udpate * remove redemption on claim * spice operator, update tests * upgrade lz * update readme, notify distribution * update test emission constant values * deploy script, anvil, cleanup * update deploy scripts * audit h01 * audit h02 * audit m01 * audit l01 * audit l02 * slither * audit m01 test * ignore elder test * skip elder election test * pre merge * test cross chain truncation * sepolia deploy script and addresses * review update * review update, slither * remove new block numbers * fix: feedback update * add mainnet config and addresses * review feedback * sepolia deploy scripts and addresses * update testnet deploy addresses, use encode in teleporter * review feedback * add helper function * deploy on sepolia, staking invariant test * update invariant test * invariant auction, rename gold auction * slither run * fix forge test compiler error * uni and invariant test folder, git workflow update * deep invariant workflow --------- Co-authored-by: frontier159 <103474701+frontier159@users.noreply.github.com> --- .../workflows/protocol-deep-invarianats.yaml | 159 + .github/workflows/protocol-tests.yaml | 66 +- protocol/.gitignore | 5 +- protocol/contracts/amo/AuraStaking.sol | 2 +- protocol/contracts/amo/Ramos.sol | 2 +- .../common/CommonEventsAndErrors.sol | 3 +- protocol/contracts/common/SafeCast.sol | 2 +- protocol/contracts/common/TempleMath.sol | 16 + .../common/access/ElevatedAccess.sol | 86 + protocol/contracts/core/MultiOtcOffer.sol | 2 +- protocol/contracts/core/OtcOffer.sol | 2 +- protocol/contracts/fakes/FakeERC20.sol | 2 +- .../fakes/FakeERC20CustomDecimals.sol | 2 +- .../fakes/templegold/SpiceAuctionMock.sol | 125 + .../fakes/templegold/TempleGoldMock.sol | 186 + .../templegold/TempleGoldStakingMock.sol | 560 + .../fakes/templegold/TempleTokenMock.sol | 28 + .../fakes/v2/TempleDebtTokenTestnetAdmin.sol | 2 +- .../v2/strategies/DsrBaseStrategyTestnet.sol | 2 +- .../common/access/IElevatedAccess.sol | 45 + .../interfaces/core/IMultiOtcOffer.sol | 2 +- .../interfaces/core/ITempleERC20Token.sol | 2 +- .../interfaces/templegold/IAuctionBase.sol | 69 + .../interfaces/templegold/ISpiceAuction.sol | 151 + .../templegold/ISpiceAuctionFactory.sol | 40 + .../templegold/IStableGoldAuction.sol | 131 + .../interfaces/templegold/ITempleGold.sol | 154 + .../templegold/ITempleGoldAdmin.sol | 98 + .../templegold/ITempleGoldStaking.sol | 249 + .../templegold/ITempleTeleporter.sol | 60 + .../v2/access/ITempleElevatedAccess.sol | 2 +- protocol/contracts/templegold/AuctionBase.sol | 32 + protocol/contracts/templegold/EpochLib.sol | 20 + protocol/contracts/templegold/README.md | 162 + .../contracts/templegold/SpiceAuction.sol | 501 + .../templegold/SpiceAuctionFactory.sol | 91 + .../templegold/StableGoldAuction.sol | 342 + protocol/contracts/templegold/TempleGold.sol | 387 + .../contracts/templegold/TempleGoldAdmin.sol | 138 + .../templegold/TempleGoldStaking.sol | 551 + .../contracts/templegold/TempleTeleporter.sol | 110 + .../contracts/templegold/docs/high-level.jpeg | Bin 0 -> 2376304 bytes protocol/contracts/v2/TempleDebtToken.sol | 17 +- .../contracts/v2/TreasuryPriceIndexOracle.sol | 2 +- .../contracts/v2/TreasuryReservesVault.sol | 2 +- .../v2/access/TempleElevatedAccess.sol | 2 +- .../TempleCircuitBreakerAllUsersPerPeriod.sol | 2 +- .../TempleCircuitBreakerProxy.sol | 2 +- .../v2/interestRate/BaseInterestRateModel.sol | 2 +- .../v2/interestRate/CompoundedInterest.sol | 2 +- .../LinearWithKinkInterestRateModel.sol | 2 +- .../contracts/v2/safeGuards/SafeForked.sol | 2 +- .../v2/safeGuards/ThresholdSafeGuard.sol | 2 +- .../v2/strategies/AbstractStrategy.sol | 2 +- .../v2/strategies/DsrBaseStrategy.sol | 2 +- .../v2/strategies/GnosisStrategy.sol | 2 +- .../contracts/v2/strategies/RamosStrategy.sol | 2 +- .../v2/strategies/TempleTokenBaseStrategy.sol | 2 +- .../contracts/v2/strategies/TlcStrategy.sol | 2 +- .../templeLineOfCredit/TempleLineOfCredit.sol | 17 +- protocol/foundry.toml | 2 + protocol/hardhat.config.ts | 16 +- protocol/layerzero.config.ts | 41 + protocol/package.json | 12 +- ...0223FD9CDBCb97F15FE188769B0170F2a993A3E.js | 11 + ...6061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js | 8 + ...1ebd148AE75B3e2CfDF972c94D7775B16060672.js | 11 + ...7cde11128c70948B910Bf34cF6F834c78B66b0f.js | 7 + ...879B1ae381DDbBa701170160162025d297ce3D3.js | 8 + ...afB7E03a6e115577361C5648924eBA3163381Fc.js | 12 + ...5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js | 10 + ...2f7B537B530481b12A5538bE7309fB6a34849f3.js | 8 + .../templegold/01a-temple-token.ts | 38 + .../templegold/01b-dai-token.ts | 38 + .../templegold/01c-temple-gold.ts | 43 + .../templegold/02-temple-teleporter.ts | 33 + .../templegold/03-temple-gold-staking.ts | 38 + .../templegold/04-dai-gold-auction.ts | 37 + .../templegold/05-spice-factory.ts | 40 + .../templegold/99a-post-deploy.ts | 121 + .../localhost/templegold/01-localhost.ts | 133 + .../deploys/localhost/templegold/02-ops.ts | 30 + .../localhost/templegold/999-localhost.ts | 80 + .../localhost/templegold/deploy-anvil.sh | 5 + .../mainnet/templegold/01-temple-gold.ts | 44 + .../mainnet/templegold/02-temple-admin.ts | 35 + .../templegold/03-temple-gold-staking.ts | 37 + .../templegold/04-temple-teleporter.ts | 36 + .../mainnet/templegold/05-dai-gold-auction.ts | 38 + .../mainnet/templegold/06-spice-auction.ts | 41 + .../templegold/07-spice-auction-factory.ts | 41 + .../templegold/999-transfer-ownership.ts | 25 + .../templegold/99a-post-temple-gold.ts | 42 + .../99b-post-temple-gold-staking.ts | 33 + .../templegold/99c-post-dai-gold-auction.ts | 36 + .../mainnet/templegold/contract-addresses.ts | 232 + ...090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js | 12 + ...231340BBAf990B3Aa9f2B095b9DC11e493059c1.js | 11 + ...92aA9BfDcA5540406E211950C226C8E0cd5047F.js | 12 + ...ae6318e34bb97ae3755AFcE75559452aA223A5D.js | 12 + ...De0066A6BD454B2Ecaeb3E54814458a71D345A5.js | 7 + ...d3671d794d511Bb0E3D28e260F8E2233C0653aB.js | 10 + ...8c5E61b1B3731A1f379E8770861164d23118cdc.js | 8 + ...e9162230D9e637218D74C7f41f62ef2385fEe64.js | 8 + ...bc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js | 7 + ...bDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js | 8 + .../sepolia/templegold/01a-temple-gold.ts | 43 + .../sepolia/templegold/01b-dai-token.ts | 38 + .../sepolia/templegold/02-temple-token.ts | 38 + .../templegold/03-temple-teleporter.ts | 36 + .../templegold/03b-temple-gold-staking.ts | 38 + .../sepolia/templegold/04-dai-gold-auction.ts | 37 + .../sepolia/templegold/05-spice-factory.ts | 40 + protocol/slither.db.json | 67262 ++++++++++------ .../templegold/AuctionInvariant.t.sol | 155 + .../invariant/templegold/BaseInvariant.t.sol | 58 + .../templegold/StakingInvariant.t.sol | 157 + .../templegold/handlers/BaseHandler.sol | 70 + .../handlers/GoldAuctionHandler.sol | 62 + .../templegold/handlers/StakingHandler.sol | 85 + .../templegold/stores/StateStore.sol | 33 + .../templegold/stores/TimestampStore.sol | 15 + protocol/test/forge/lz-devtools/README.md | 7 + .../test/forge/lz-devtools/TestHelperOz5.sol | 500 + .../lz-devtools/mocks/EndpointV2Mock.sol | 378 + .../mocks/MessagingComposerMock.sol | 83 + .../lz-devtools/mocks/SendUln302Mock.sol | 106 + .../mocks/SimpleMessageLibMock.sol | 159 + protocol/test/forge/{ => unit}/TempleTest.sol | 8 +- .../admin/TempleTeamPaymentsFactory.t.sol | 0 .../forge/{ => unit}/core/MultiOtcOffer.t.sol | 0 .../test/forge/{ => unit}/core/OtcOffer.t.sol | 0 .../forge/unit/templegold/SpiceAuction.t.sol | 1026 + .../unit/templegold/SpiceAuctionFactory.t.sol | 74 + .../unit/templegold/StableGoldAuction.t.sol | 706 + .../forge/unit/templegold/TempleGold.t.sol | 644 + .../unit/templegold/TempleGoldAdmin.t.sol | 274 + .../unit/templegold/TempleGoldCommon.t.sol | 79 + .../unit/templegold/TempleGoldLayerZero.t.sol | 213 + .../unit/templegold/TempleGoldStaking.t.sol | 1425 + .../unit/templegold/TempleTeleporter.t.sol | 95 + .../v2/TreasuryPriceIndexOracle.t.sol | 0 .../v2/access/TempleElevatedAccess.t.sol | 0 ...empleCircuitBreakerAllUsersPerPeriod.t.sol | 0 .../TempleCircuitBreakerProxy.t.sol | 0 .../v2/interestRate/CompoundedInterest.t.sol | 0 .../LinearWithKinkInterestRateModel.t.sol | 0 .../CompatibilityFallbackHandler.forked.sol | 0 .../v2/safeGuards/ThresholdSafeGuard.t.sol | 0 .../v2/strategies/AbstractStrategy.t.sol | 0 .../v2/strategies/DsrBaseStrategy.t.sol | 0 .../strategies/DsrBaseStrategyTestnet.t.sol | 0 .../v2/strategies/GnosisStrategy.t.sol | 0 .../v2/strategies/MockBaseStrategy.t.sol | 0 .../v2/strategies/MockStrategy.t.sol | 0 .../v2/strategies/RamosStrategy.t.sol | 0 .../v2/strategies/SkyFarmBaseStrategy.t.sol | 0 .../strategies/TempleTokenBaseStrategy.t.sol | 0 .../v2/strategies/TlcStrategy.t.sol | 0 .../TempleDebtToken.Base.t.sol | 0 ...empleDebtToken.BaseAndDebtorInterest.t.sol | 0 ...TempleDebtTokenTest.BaseInterestOnly.t.sol | 0 ...mpleDebtTokenTest.DebtorInterestOnly.t.sol | 0 .../TempleLineOfCreditV2.t.sol | 0 .../v2/templeLineOfCredit/TlcBaseTest.t.sol | 0 .../v2/templeLineOfCredit/TlcBorrow.t.sol | 0 .../v2/templeLineOfCredit/TlcCollateral.t.sol | 0 .../templeLineOfCredit/TlcLiquidations.t.sol | 0 .../v2/templeLineOfCredit/TlcRepay.t.sol | 0 .../v2/treasuryReservesVault/TrvBase.t.sol | 0 .../v2/treasuryReservesVault/TrvBorrow.t.sol | 0 .../v2/treasuryReservesVault/TrvRepay.t.sol | 0 .../treasuryReservesVault/TrvShutdown.t.sol | 0 .../v2/treasuryReservesVault/TrvViews.t.sol | 0 174 files changed, 55227 insertions(+), 24889 deletions(-) create mode 100644 .github/workflows/protocol-deep-invarianats.yaml create mode 100644 protocol/contracts/common/TempleMath.sol create mode 100644 protocol/contracts/common/access/ElevatedAccess.sol create mode 100644 protocol/contracts/fakes/templegold/SpiceAuctionMock.sol create mode 100644 protocol/contracts/fakes/templegold/TempleGoldMock.sol create mode 100644 protocol/contracts/fakes/templegold/TempleGoldStakingMock.sol create mode 100644 protocol/contracts/fakes/templegold/TempleTokenMock.sol create mode 100644 protocol/contracts/interfaces/common/access/IElevatedAccess.sol create mode 100644 protocol/contracts/interfaces/templegold/IAuctionBase.sol create mode 100644 protocol/contracts/interfaces/templegold/ISpiceAuction.sol create mode 100644 protocol/contracts/interfaces/templegold/ISpiceAuctionFactory.sol create mode 100644 protocol/contracts/interfaces/templegold/IStableGoldAuction.sol create mode 100644 protocol/contracts/interfaces/templegold/ITempleGold.sol create mode 100644 protocol/contracts/interfaces/templegold/ITempleGoldAdmin.sol create mode 100644 protocol/contracts/interfaces/templegold/ITempleGoldStaking.sol create mode 100644 protocol/contracts/interfaces/templegold/ITempleTeleporter.sol create mode 100644 protocol/contracts/templegold/AuctionBase.sol create mode 100644 protocol/contracts/templegold/EpochLib.sol create mode 100644 protocol/contracts/templegold/README.md create mode 100644 protocol/contracts/templegold/SpiceAuction.sol create mode 100644 protocol/contracts/templegold/SpiceAuctionFactory.sol create mode 100644 protocol/contracts/templegold/StableGoldAuction.sol create mode 100644 protocol/contracts/templegold/TempleGold.sol create mode 100644 protocol/contracts/templegold/TempleGoldAdmin.sol create mode 100644 protocol/contracts/templegold/TempleGoldStaking.sol create mode 100644 protocol/contracts/templegold/TempleTeleporter.sol create mode 100644 protocol/contracts/templegold/docs/high-level.jpeg create mode 100644 protocol/layerzero.config.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x30223FD9CDBCb97F15FE188769B0170F2a993A3E.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x51ebd148AE75B3e2CfDF972c94D7775B16060672.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x57cde11128c70948B910Bf34cF6F834c78B66b0f.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x5879B1ae381DDbBa701170160162025d297ce3D3.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x8afB7E03a6e115577361C5648924eBA3163381Fc.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xa2f7B537B530481b12A5538bE7309fB6a34849f3.js create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/01a-temple-token.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/01b-dai-token.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/01c-temple-gold.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/02-temple-teleporter.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/03-temple-gold-staking.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/04-dai-gold-auction.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/05-spice-factory.ts create mode 100644 protocol/scripts/deploys/arbitrumSepolia/templegold/99a-post-deploy.ts create mode 100644 protocol/scripts/deploys/localhost/templegold/01-localhost.ts create mode 100644 protocol/scripts/deploys/localhost/templegold/02-ops.ts create mode 100644 protocol/scripts/deploys/localhost/templegold/999-localhost.ts create mode 100755 protocol/scripts/deploys/localhost/templegold/deploy-anvil.sh create mode 100644 protocol/scripts/deploys/mainnet/templegold/01-temple-gold.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/02-temple-admin.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/03-temple-gold-staking.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/04-temple-teleporter.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/05-dai-gold-auction.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/06-spice-auction.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/07-spice-auction-factory.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/999-transfer-ownership.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/99a-post-temple-gold.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/99b-post-temple-gold-staking.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/99c-post-dai-gold-auction.ts create mode 100644 protocol/scripts/deploys/mainnet/templegold/contract-addresses.ts create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x192aA9BfDcA5540406E211950C226C8E0cd5047F.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x2ae6318e34bb97ae3755AFcE75559452aA223A5D.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0x98c5E61b1B3731A1f379E8770861164d23118cdc.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0xBe9162230D9e637218D74C7f41f62ef2385fEe64.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js create mode 100644 protocol/scripts/deploys/sepolia/deploymentArgs/0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js create mode 100644 protocol/scripts/deploys/sepolia/templegold/01a-temple-gold.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/01b-dai-token.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/02-temple-token.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/03-temple-teleporter.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/03b-temple-gold-staking.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/04-dai-gold-auction.ts create mode 100644 protocol/scripts/deploys/sepolia/templegold/05-spice-factory.ts create mode 100644 protocol/test/forge/invariant/templegold/AuctionInvariant.t.sol create mode 100644 protocol/test/forge/invariant/templegold/BaseInvariant.t.sol create mode 100644 protocol/test/forge/invariant/templegold/StakingInvariant.t.sol create mode 100644 protocol/test/forge/invariant/templegold/handlers/BaseHandler.sol create mode 100644 protocol/test/forge/invariant/templegold/handlers/GoldAuctionHandler.sol create mode 100644 protocol/test/forge/invariant/templegold/handlers/StakingHandler.sol create mode 100644 protocol/test/forge/invariant/templegold/stores/StateStore.sol create mode 100644 protocol/test/forge/invariant/templegold/stores/TimestampStore.sol create mode 100644 protocol/test/forge/lz-devtools/README.md create mode 100644 protocol/test/forge/lz-devtools/TestHelperOz5.sol create mode 100644 protocol/test/forge/lz-devtools/mocks/EndpointV2Mock.sol create mode 100644 protocol/test/forge/lz-devtools/mocks/MessagingComposerMock.sol create mode 100644 protocol/test/forge/lz-devtools/mocks/SendUln302Mock.sol create mode 100644 protocol/test/forge/lz-devtools/mocks/SimpleMessageLibMock.sol rename protocol/test/forge/{ => unit}/TempleTest.sol (91%) rename protocol/test/forge/{ => unit}/admin/TempleTeamPaymentsFactory.t.sol (100%) rename protocol/test/forge/{ => unit}/core/MultiOtcOffer.t.sol (100%) rename protocol/test/forge/{ => unit}/core/OtcOffer.t.sol (100%) create mode 100644 protocol/test/forge/unit/templegold/SpiceAuction.t.sol create mode 100644 protocol/test/forge/unit/templegold/SpiceAuctionFactory.t.sol create mode 100644 protocol/test/forge/unit/templegold/StableGoldAuction.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleGold.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleGoldAdmin.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleGoldCommon.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleGoldLayerZero.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleGoldStaking.t.sol create mode 100644 protocol/test/forge/unit/templegold/TempleTeleporter.t.sol rename protocol/test/forge/{ => unit}/v2/TreasuryPriceIndexOracle.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/access/TempleElevatedAccess.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/circuitBreaker/TempleCircuitBreakerProxy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/interestRate/CompoundedInterest.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/interestRate/LinearWithKinkInterestRateModel.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/safeGuards/CompatibilityFallbackHandler.forked.sol (100%) rename protocol/test/forge/{ => unit}/v2/safeGuards/ThresholdSafeGuard.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/AbstractStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/DsrBaseStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/DsrBaseStrategyTestnet.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/GnosisStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/MockBaseStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/MockStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/RamosStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/SkyFarmBaseStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/TempleTokenBaseStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/strategies/TlcStrategy.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeDebtToken/TempleDebtToken.Base.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeDebtToken/TempleDebtToken.BaseAndDebtorInterest.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeDebtToken/TempleDebtTokenTest.BaseInterestOnly.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeDebtToken/TempleDebtTokenTest.DebtorInterestOnly.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TempleLineOfCreditV2.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TlcBaseTest.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TlcBorrow.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TlcCollateral.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TlcLiquidations.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/templeLineOfCredit/TlcRepay.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/treasuryReservesVault/TrvBase.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/treasuryReservesVault/TrvBorrow.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/treasuryReservesVault/TrvRepay.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/treasuryReservesVault/TrvShutdown.t.sol (100%) rename protocol/test/forge/{ => unit}/v2/treasuryReservesVault/TrvViews.t.sol (100%) diff --git a/.github/workflows/protocol-deep-invarianats.yaml b/.github/workflows/protocol-deep-invarianats.yaml new file mode 100644 index 000000000..388ffb91f --- /dev/null +++ b/.github/workflows/protocol-deep-invarianats.yaml @@ -0,0 +1,159 @@ +name: Protocol Deep Invariant Tests +on: + schedule: + - cron: "0 8 * * 0" # at 8:00pm UTC every Sunday + workflow_dispatch: + inputs: + invariantRuns: + default: "5000" + description: "Invariant runs: number of sequences of function calls generated and run." + required: false + invariantDepth: + default: "90" + description: "Invariant depth: number of function calls made in a given run." + required: false + +jobs: + build: + name: Build Contracts + runs-on: ${{ matrix.os }} + permissions: + # required for all workflows + security-events: write + # only required for workflows in private repositories + actions: read + contents: read + strategy: + matrix: + os: + - ubuntu-latest + node_version: + - 20 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Use Node.js ${{ matrix.node_version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + cache: 'yarn' + cache-dependency-path: apps/protocol/yarn.lock + + - name: Install yarn project + run: yarn install + working-directory: protocol + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show the Foundry CI config + run: forge config + env: + FOUNDRY_PROFILE: ci + + - name: Show the Foundry version + run: forge --version + working-directory: protocol + + - name: "Forge Build" + run: "forge build" + working-directory: protocol + env: + FOUNDRY_PROFILE: ci + + - name: Increase swapfile + run: | + sudo swapoff -a + sudo fallocate -l 15G /swapfile + sudo chmod 600 /swapfile + sudo mkswap /swapfile + sudo swapon /swapfile + sudo swapon --show + + - name: "Cache the build and the node modules so that they can be re-used by the other jobs" + uses: "actions/cache/save@v3" + with: + key: "build-and-modules-${{ github.sha }}" + path: | + protocol/node_modules + protocol/cache-foundry + protocol/artifacts-foundry + + - name: "Store the contract artifacts in CI" + uses: "actions/upload-artifact@v4" + with: + name: "contract-artifacts" + path: "protocol/artifacts-foundry" + + - name: "Add build summary" + run: | + echo "## Build result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + foundry-test-invariant: + name: Foundry Invariant Tests + needs: ["build"] + runs-on: ${{ matrix.os }} + permissions: + # required for all workflows + security-events: write + # only required for workflows in private repositories + actions: read + contents: read + strategy: + matrix: + os: + - ubuntu-latest + node_version: + - 20 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Use Node.js ${{ matrix.node_version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + cache: 'yarn' + cache-dependency-path: protocol/yarn.lock + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: "Restore the cached build and the node modules" + uses: "actions/cache/restore@v3" + with: + fail-on-cache-miss: true + key: "build-and-modules-${{ github.sha }}" + path: | + protocol/node_modules + protocol/cache-foundry + protocol/artifacts-foundry + - name: "Generate fuzz seed" + run: echo "FOUNDRY_FUZZ_SEED=$EPOCHSECONDS" >> $GITHUB_ENV + + - name: "Log fuzz seed" + run: echo "FOUNDRY_FUZZ_SEED=$FOUNDRY_FUZZ_SEED" + + - name: Foundry invariant tests + run: "forge test --match-path \"test/foundry/invariant/**/*.sol\"" + working-directory: protocol + env: + FOUNDRY_PROFILE: ci + FOUNDRY_INVARIANT_DEPTH: ${{ inputs.invariantDepth || '90' }} + FOUNDRY_INVARIANT_RUNS: ${{ inputs.invariantRuns || '5000' }} + MAINNET_RPC_URL: ${{ secrets.TESTS_MAINNET_RPC_URL }} + POLYGON_RPC_URL: ${{ secrets.TESTS_POLYGON_RPC_URL }} + + - name: "Add test summary" + run: | + echo "## Deep Invariant tests result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/protocol-tests.yaml b/.github/workflows/protocol-tests.yaml index 9654425cc..207bd1b1b 100644 --- a/.github/workflows/protocol-tests.yaml +++ b/.github/workflows/protocol-tests.yaml @@ -50,6 +50,7 @@ jobs: working-directory: protocol env: TESTS_MAINNET_RPC_URL: ${{ secrets.TESTS_MAINNET_RPC_URL }} + ARBITRUM_ONE_RPC_URL: ${{ secrets.TESTS_ARBITRUM_ONE_RPC_URL }} foundryTests: name: Foundry Tests @@ -100,12 +101,73 @@ jobs: run: forge --version working-directory: protocol - - name: Foundry tests - run: forge test --gas-report + - name: Foundry unit tests + run: forge test --match-path "test/forge/unit/**/*.t.sol" working-directory: protocol env: FOUNDRY_PROFILE: ci MAINNET_RPC_URL: ${{ secrets.TESTS_MAINNET_RPC_URL }} + ARBITRUM_ONE_RPC_URL: ${{ secrets.TESTS_ARBITRUM_ONE_RPC_URL }} + + foundryInvariantTests: + name: Foundry Invariant Tests + runs-on: ${{ matrix.os }} + permissions: + # required for all workflows + security-events: write + # only required for workflows in private repositories + actions: read + contents: read + strategy: + matrix: + os: + - ubuntu-latest + node_version: + - 20 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Use Node.js ${{ matrix.node_version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + cache: 'yarn' + cache-dependency-path: protocol/yarn.lock + + - name: Install yarn project + run: yarn install + working-directory: protocol + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + # version: nightly-ca67d15f4abd46394b324c50e21e66f306a1162d + cache: true + + - name: Show the Foundry CI config + run: forge config + env: + FOUNDRY_PROFILE: ci + + - name: Show the Foundry version + run: forge --version + working-directory: protocol + + - name: Foundry invariant tests + run: forge test --match-path "test/forge/invariant/**/*.sol" + working-directory: protocol + env: + FOUNDRY_PROFILE: ci + FOUNDRY_INVARIANT_RUNS: 150 # Defer larger runs for another pipeline + FOUNDRY_INVARIANT_DEPTH: 80 + MAINNET_RPC_URL: ${{ secrets.TESTS_MAINNET_RPC_URL }} + ARBITRUM_ONE_RPC_URL: ${{ secrets.TESTS_ARBITRUM_ONE_RPC_URL }} + slither: name: Slither diff --git a/protocol/.gitignore b/protocol/.gitignore index 07125fd88..a4cda54cd 100644 --- a/protocol/.gitignore +++ b/protocol/.gitignore @@ -27,4 +27,7 @@ lcov.info report # autogenerated fork args -scripts/deploys/localhost/deploymentArgs \ No newline at end of file +scripts/deploys/localhost/deploymentArgs + +# templegold scripts +test/forge/templegold/scripts/ \ No newline at end of file diff --git a/protocol/contracts/amo/AuraStaking.sol b/protocol/contracts/amo/AuraStaking.sol index 22245be0f..711bd8a8d 100644 --- a/protocol/contracts/amo/AuraStaking.sol +++ b/protocol/contracts/amo/AuraStaking.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (amo/AuraStaking.sol) diff --git a/protocol/contracts/amo/Ramos.sol b/protocol/contracts/amo/Ramos.sol index 1cd6d1256..9b1fe26fb 100644 --- a/protocol/contracts/amo/Ramos.sol +++ b/protocol/contracts/amo/Ramos.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (amo/Ramos.sol) diff --git a/protocol/contracts/common/CommonEventsAndErrors.sol b/protocol/contracts/common/CommonEventsAndErrors.sol index 29964c720..b38dd1845 100644 --- a/protocol/contracts/common/CommonEventsAndErrors.sol +++ b/protocol/contracts/common/CommonEventsAndErrors.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (common/CommonEventsAndErrors.sol) @@ -12,5 +12,4 @@ library CommonEventsAndErrors { error ExpectedNonZero(); error Unimplemented(); event TokenRecovered(address indexed to, address indexed token, uint256 amount); - error AccountBlacklisted(address account); } diff --git a/protocol/contracts/common/SafeCast.sol b/protocol/contracts/common/SafeCast.sol index 9c4f06c19..943b76e49 100644 --- a/protocol/contracts/common/SafeCast.sol +++ b/protocol/contracts/common/SafeCast.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (common/SafeCast.sol) diff --git a/protocol/contracts/common/TempleMath.sol b/protocol/contracts/common/TempleMath.sol new file mode 100644 index 000000000..34190204d --- /dev/null +++ b/protocol/contracts/common/TempleMath.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (common/TempleMath.sol) + +import { mulDiv } from "@prb/math/src/Common.sol"; + +library TempleMath { + /// @notice mulDiv with an option to round the result up or down to the nearest wei + function mulDivRound(uint256 x, uint256 y, uint256 denominator, bool roundUp) internal pure returns (uint256 result) { + result = mulDiv(x, y, denominator); + // See OZ Math.sol for the equivalent mulDiv() with rounding. + if (roundUp && mulmod(x, y, denominator) > 0) { + result += 1; + } + } +} \ No newline at end of file diff --git a/protocol/contracts/common/access/ElevatedAccess.sol b/protocol/contracts/common/access/ElevatedAccess.sol new file mode 100644 index 000000000..5f7080443 --- /dev/null +++ b/protocol/contracts/common/access/ElevatedAccess.sol @@ -0,0 +1,86 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (common/access/ElevatedAccess.sol) + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { IElevatedAccess } from "contracts/interfaces/common/access/IElevatedAccess.sol"; + +/** + * @notice Inherit to add Owner roles for DAO elevated access. + */ +abstract contract ElevatedAccess is IElevatedAccess { + /** + * @notice The address of the current owner. + */ + address public override owner; + + /** + * @notice Explicit approval for an address to execute a function. + * allowedCaller => function selector => true/false + */ + mapping(address => mapping(bytes4 => bool)) public override explicitFunctionAccess; + + /// @dev Track proposed owner + address private _proposedNewOwner; + + function _init(address initialOwner) internal { + if (owner != address(0)) revert CommonEventsAndErrors.InvalidAccess(); + if (initialOwner == address(0)) revert CommonEventsAndErrors.InvalidAddress(); + owner = initialOwner; + } + + /** + * @notice Proposes a new Owner. + * Can only be called by the current owner + */ + function proposeNewOwner(address account) external override onlyElevatedAccess { + if (account == address(0)) revert CommonEventsAndErrors.InvalidAddress(); + emit NewOwnerProposed(owner, _proposedNewOwner, account); + _proposedNewOwner = account; + } + + /** + * @notice Caller accepts the role as new Owner. + * Can only be called by the proposed owner + */ + function acceptOwner() external override { + if (msg.sender != _proposedNewOwner) revert CommonEventsAndErrors.InvalidAccess(); + + emit NewOwnerAccepted(owner, msg.sender); + owner = msg.sender; + delete _proposedNewOwner; + } + + /** + * @notice Grant `allowedCaller` the rights to call the function selectors in the access list. + * @dev fnSelector == bytes4(keccak256("fn(argType1,argType2,...)")) + */ + function setExplicitAccess(address allowedCaller, ExplicitAccess[] calldata access) external override onlyElevatedAccess { + if (allowedCaller == address(0)) revert CommonEventsAndErrors.InvalidAddress(); + uint256 _length = access.length; + ExplicitAccess memory _access; + for (uint256 i; i < _length; ++i) { + _access = access[i]; + emit ExplicitAccessSet(allowedCaller, _access.fnSelector, _access.allowed); + explicitFunctionAccess[allowedCaller][_access.fnSelector] = _access.allowed; + } + } + + function isElevatedAccess(address caller, bytes4 fnSelector) internal view returns (bool) { + return ( + caller == owner || + explicitFunctionAccess[caller][fnSelector] + ); + } + + /** + * @notice The owner is allowed to call, or if explicit access has been given to the caller. + * @dev Important: Only for use when called from an *external* contract. + * If a function with this modifier is called internally then the `msg.sig` + * will still refer to the top level externally called function. + */ + modifier onlyElevatedAccess() { + if (!isElevatedAccess(msg.sender, msg.sig)) revert CommonEventsAndErrors.InvalidAccess(); + _; + } +} \ No newline at end of file diff --git a/protocol/contracts/core/MultiOtcOffer.sol b/protocol/contracts/core/MultiOtcOffer.sol index 6ad880610..916459d9a 100644 --- a/protocol/contracts/core/MultiOtcOffer.sol +++ b/protocol/contracts/core/MultiOtcOffer.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (core/MultiOtcOffer.sol) diff --git a/protocol/contracts/core/OtcOffer.sol b/protocol/contracts/core/OtcOffer.sol index a910057e4..5ccff322a 100644 --- a/protocol/contracts/core/OtcOffer.sol +++ b/protocol/contracts/core/OtcOffer.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (core/OtcOffer.sol) diff --git a/protocol/contracts/fakes/FakeERC20.sol b/protocol/contracts/fakes/FakeERC20.sol index 2f572941a..8513c57a8 100644 --- a/protocol/contracts/fakes/FakeERC20.sol +++ b/protocol/contracts/fakes/FakeERC20.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/protocol/contracts/fakes/FakeERC20CustomDecimals.sol b/protocol/contracts/fakes/FakeERC20CustomDecimals.sol index 1c9f7e164..73120abe5 100644 --- a/protocol/contracts/fakes/FakeERC20CustomDecimals.sol +++ b/protocol/contracts/fakes/FakeERC20CustomDecimals.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/protocol/contracts/fakes/templegold/SpiceAuctionMock.sol b/protocol/contracts/fakes/templegold/SpiceAuctionMock.sol new file mode 100644 index 000000000..8b49f65cb --- /dev/null +++ b/protocol/contracts/fakes/templegold/SpiceAuctionMock.sol @@ -0,0 +1,125 @@ +pragma solidity ^0.8.18; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/SpiceAuctionMock.sol) + + +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { SendParam } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; + +/** + * @title SpiceAuction + * @notice Temple Gold is deposited into this contract to bid on a share of distributed Spice token, + * or vice versa, for an epoch. Temple Gold can be the bid or auction token at any auction epoch. + * Reward tokens acquired in past epochs can always be claimed. Once bid, users cannot + * claim their bid token and can only claim their share of reward token for epoch after epoch finishes. + * Bid and auction tokens could change per auction. These are set in `AuctionConfig`. + * Config is set before the next auction starts using `setAuctionConfig` by DAO execution. + */ +contract SpiceAuctionMock { + using SafeERC20 for IERC20; + using OptionsBuilder for bytes; + + /// @notice Temple GOLD + address public immutable templeGold; + + /// @notice Auctions run for minimum 1 week + uint32 public constant MINIMUM_AUCTION_PERIOD = 1 weeks; + /// @notice Maximum wait period between last and next auctions + uint32 public constant MAXIMUM_AUCTION_WAIT_PERIOD = 90 days; + /// @notice Maximum auction duration + uint32 public constant MAXIMUM_AUCTION_DURATION = 30 days; + uint32 private immutable _arbitrumOneLzEid; + uint32 private immutable _mintChainId; + uint32 public lzReceiveExecutorGas; + + /// @notice If true, let first claim for an auction notify total TGLD redeemed + bool public claimShouldNotifyTotalRedeemed; + + /// @notice Name of this Spice Bazaar auction + string public name; + + /// @notice Last time auction was started. For zero auctions, it is the contract deploy timestamp + uint256 private immutable _deployTimestamp; + + event RedeemedTempleGoldBurned(uint256 amount); + error ExpectedNonZero(); + error WithdrawFailed(uint256 amount); + + constructor( + address _templeGold, + uint32 _arbEid, + uint32 mintChainId_, + string memory _name + ) { + templeGold = _templeGold; + _arbitrumOneLzEid = _arbEid; + _mintChainId = mintChainId_; + name = _name; + _deployTimestamp = block.timestamp; + lzReceiveExecutorGas = 85_412; + } + + /// @notice withdraw ETH used for layer zero sends + function withdrawEth(address payable _to, uint256 _amount) external { + (bool success,) = _to.call{ value: _amount }(""); + if (!success) { revert WithdrawFailed(_amount); } + } + + /** + * @notice Burn redeemd TGLD and notify circulating supply + * @param amount Amount + * @param useContractEth If to use contract eth for layerzero send + */ + function burnAndNotify(uint256 amount, bool useContractEth) external payable { + if (amount == 0) { revert ExpectedNonZero(); } + + emit RedeemedTempleGoldBurned(amount); + _burnAndNotify(amount, useContractEth); + } + + function _burnAndNotify(uint256 amount, bool useContractEth) private { + // burn directly and call TempleGold to update circulating supply + if (block.chainid == _mintChainId) { + ITempleGold(templeGold).burn(amount); + return; + } + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(lzReceiveExecutorGas, 0); + SendParam memory sendParam = SendParam( + _arbitrumOneLzEid, //, + bytes32(uint256(uint160(address(0)))), // bytes32(address(0)) to burn + amount, + 0, + options, + bytes(""), // compose message + "" + ); + MessagingFee memory fee = ITempleGold(templeGold).quoteSend(sendParam, false); + if (useContractEth && address(this).balance < fee.nativeFee) { + revert CommonEventsAndErrors.InsufficientBalance(address(0), fee.nativeFee, address(this).balance); + } else if (!useContractEth && msg.value < fee.nativeFee) { + revert CommonEventsAndErrors.InsufficientBalance(address(0), fee.nativeFee, msg.value); + } + + if (useContractEth) { + ITempleGold(templeGold).send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + } else { + ITempleGold(templeGold).send{ value: fee.nativeFee }(sendParam, fee, payable(msg.sender)); + uint256 leftover; + unchecked { + leftover = msg.value - fee.nativeFee; + } + if (leftover > 0) { + (bool success,) = payable(msg.sender).call{ value: leftover }(""); + if (!success) { revert WithdrawFailed(leftover); } + } + } + } + + // allow this contract to receive ether + receive() external payable {} +} \ No newline at end of file diff --git a/protocol/contracts/fakes/templegold/TempleGoldMock.sol b/protocol/contracts/fakes/templegold/TempleGoldMock.sol new file mode 100644 index 000000000..d57515bcc --- /dev/null +++ b/protocol/contracts/fakes/templegold/TempleGoldMock.sol @@ -0,0 +1,186 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleGoldMock.sol) + + +import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppReceiver.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { OFTMsgCodec } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/OFTMsgCodec.sol"; +import { SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; + +/** + * @title Temple Gold + * @notice Temple Gold is a non-transferrable ERC20 token with LayerZero integration for cross-chain transfer. + * Temple Gold can be only transferred to or from whitelisted addresses. On mint, Temple Gold is distributed between Staking, Auction and Gnosis Safe + * addresses using distribution share percentages set at `DistributionParams`. LayerZero's OFT token standard is modified to allow changing delegates + * with the same elevated access from v2. + * @notice + */ + contract TempleGoldMock is OFT { + using OFTMsgCodec for bytes; + using OFTMsgCodec for bytes32; + + //// @notice Distribution as a percentage of 100 + uint256 public constant DISTRIBUTION_MULTIPLIER = 100 ether; + /// @notice Minimum percentage of minted Temple Gold to distribute. 1 ether means 1% + uint256 public constant MINIMUM_DISTRIBUTION_SHARE = 1 ether; + /// @notice 1B max supply + uint256 public constant MAX_SUPPLY = 1_000_000_000 ether; // 1B + /// @notice Minimum Temple Gold minted per call to mint + uint256 public constant MINIMUM_MINT = 1_000; + + /// @notice Total TGLD burned from all spice auctions + uint256 private _totalBurnedFromSpiceAuctions; + uint256 private _circulatingSupply; + + /// @notice 1B max circulating supply + uint256 public constant MAX_CIRCULATING_SUPPLY = 1_000_000_000 ether; // 1B + + /// @notice Whitelisted addresses for transferrability + mapping(address => bool) public authorized; + + event ContractAuthorizationSet(address _contract, bool _whitelist); + event CirculatingSupplyUpdated(address indexed sender, uint256 amount, uint256 circulatingSuppply, uint256 totalBurned); + error CannotCompose(); + + constructor( + address _layerZeroEndpoint, + address _executor, + string memory _name, + string memory _symbol + ) OFT(_name, _symbol, _layerZeroEndpoint, _executor) Ownable(_executor){} + + /** + * @notice Whitelist an address to allow transfer of Temple Gold to or from + * @param _contract Contract address to whitelist + * @param _whitelist Boolean whitelist state + */ + function authorizeContract(address _contract, bool _whitelist) external onlyOwner { + if (_contract == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + authorized[_contract] = _whitelist; + emit ContractAuthorizationSet(_contract, _whitelist); + } + + /** + * @notice Mint new tokens to be distributed. Open to call from any address + * Enforces minimum mint amount and uses vesting factor to calculate mint token amount. + * Minting is only possible on source chain Arbitrum + */ + function mint(address to, uint256 amount) external { + _mint(to, amount); + _circulatingSupply += amount; + } + + /** + * @notice Get circulating supply on this chain + * @dev When this function is called on source chain (arbitrum), you get the real circulating supply across chains + * @return Circulating supply + */ + function circulatingSupply() public view returns (uint256) { + return _circulatingSupply; + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal override { + /// can only transfer to or from whitelisted addreess + /// @dev skip check on mint and burn. function `send` checks from == to + if (from != address(0) && to != address(0)) { + if (!authorized[from] && !authorized[to]) { revert ITempleGold.NonTransferrable(from, to); } + } + super._update(from, to, value); + } + + function burn(uint256 amount) external { + if (!authorized[msg.sender]) { revert CommonEventsAndErrors.InvalidAccess(); } + _burn(msg.sender, amount); + _updateCirculatingSupply(msg.sender, amount); + } + + function send( + SendParam calldata _sendParam, + MessagingFee calldata _fee, + address _refundAddress + ) external payable virtual override returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) { + if (_sendParam.composeMsg.length > 0) { revert CannotCompose(); } + /// cast bytes32 to address + address _to = _sendParam.to.bytes32ToAddress(); + /// @dev user can cross-chain transfer to self + /// @dev whitelisted address like spice auctions can burn by setting `_to` to address(0) + // only burn TGLD on source chain + // if (_to == address(0) && _sendParam.dstEid != _mintChainLzEid) { revert CommonEventsAndErrors.InvalidParam(); } + if (_to != address(0) && msg.sender != _to) { revert ITempleGold.NonTransferrable(msg.sender, _to); } + + // @dev Applies the token transfers regarding this send() operation. + // - amountSentLD is the amount in local decimals that was ACTUALLY sent/debited from the sender. + // - amountReceivedLD is the amount in local decimals that will be received/credited to the recipient on the remote OFT instance. + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + // @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + // @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + + /** + * @dev Internal function to handle the receive on the LayerZero endpoint. + * @param _origin The origin information. + * - srcEid: The source chain endpoint ID. + * - sender: The sender address from the src chain. + * - nonce: The nonce of the LayerZero message. + * @param _guid The unique identifier for the received LayerZero message. + * @param _message The encoded message. + * @dev _executor The address of the executor. + * @dev _extraData Additional data. + */ + function _lzReceive( + Origin calldata _origin, + bytes32 _guid, + bytes calldata _message, + address /*_executor*/, // @dev unused in the default implementation. + bytes calldata /*_extraData*/ // @dev unused in the default implementation. + ) internal virtual override { + /// @dev Disallow further execution on destination by ignoring composed message + if (_message.isComposed()) { revert CannotCompose(); } + if (_message.sendTo().bytes32ToAddress() == address(0)) { + /// @dev no need to burn, that happened in source chain + // already checked destination Eid for burn case in `send` + // update circulating supply + // _origin.sender is spice auction + _updateCirculatingSupply(_origin.sender.bytes32ToAddress(), _toLD(_message.amountSD())); + } else { + // @dev The src sending chain doesnt know the address length on this chain (potentially non-evm) + // Thus everything is bytes32() encoded in flight. + address toAddress = _message.sendTo().bytes32ToAddress(); + // @dev Credit the amountLD to the recipient and return the ACTUAL amount the recipient received in local decimals + uint256 amountReceivedLD = _credit(toAddress, _toLD(_message.amountSD()), _origin.srcEid); + + emit OFTReceived(_guid, _origin.srcEid, toAddress, amountReceivedLD); + } + } + + function _updateCirculatingSupply(address sender, uint256 amount) private { + uint256 _totalBurnedCache = _totalBurnedFromSpiceAuctions = _totalBurnedFromSpiceAuctions + amount; + uint256 _circulatingSuppplyCache = _circulatingSupply = _circulatingSupply - amount; + emit CirculatingSupplyUpdated(sender, amount, _circulatingSuppplyCache, _totalBurnedCache); + } + } \ No newline at end of file diff --git a/protocol/contracts/fakes/templegold/TempleGoldStakingMock.sol b/protocol/contracts/fakes/templegold/TempleGoldStakingMock.sol new file mode 100644 index 000000000..460ae6b3d --- /dev/null +++ b/protocol/contracts/fakes/templegold/TempleGoldStakingMock.sol @@ -0,0 +1,560 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleGoldStakingMock.sol) + + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; + +/** + * @title Temple Gold Staking + * @notice Temple Gold Staking contract. Stakers deposit Temple and claim rewards in Temple Gold. + * Temple Gold is distributed to staking contract for stakers on mint. Minted Temple Gold are sent directly to Staking contract. + * A non-transferrable vote token is minted 1;1 to stakers on the amount they staked. Duration for distributing staking rewards is 7 days. + */ +contract TempleGoldStakingMock is TempleElevatedAccess, Pausable { + using SafeERC20 for IERC20; + + /// @notice The staking token. Temple + IERC20 public immutable stakingToken; + /// @notice Reward token. Temple Gold + IERC20 public immutable rewardToken; + + /// @notice Distribution starter + address public distributionStarter; + /// @notice Week length + uint256 constant public WEEK_LENGTH = 7 days; + /// @notice Total supply of staking token + uint256 public totalSupply; + + ITempleGoldStaking public previousStaking; + + /// @notice Time tracking + uint256 public periodFinish; + /// @notice Last rewards update time + uint256 public lastUpdateTime; + + /// @notice Store next reward amount for next epoch + uint256 public nextRewardAmount; + /// @notice Duration for rewards distribution + uint256 public rewardDuration; + /// @notice Cooldown time before next distribution of rewards + /// @dev If set to zero, rewards distribution is callable any time + uint160 public rewardDistributionCoolDown; + /// @notice Timestamp for last reward notification + uint96 public lastRewardNotificationTimestamp; + + /// @notice For use when migrating to a new staking contract if TGLD changes. + address public migrator; + /// @notice Data struct for rewards + Reward internal rewardData; + /// @notice Staker balances + mapping(address account => uint256 balance) private _balances; + /// @notice Account vote delegates + mapping(address account => address delegate) public delegates; + /// @notice Stakers claimable rewards + mapping(address account => uint256 amount) public claimableRewards; + /// @notice Staker reward per token paid + mapping(address account => uint256 amount) public userRewardPerTokenPaid; + /// @notice Track voting + mapping(address account => mapping(uint256 epoch => Checkpoint)) private _checkpoints; + mapping(address account => uint256 number) public numCheckpoints; + + event GoldDistributionNotified(uint256 amount, uint256 timestamp); + event Staked(address indexed staker, uint256 amount); + event MigratorSet(address migrator); + event Withdrawn(address indexed staker, address to, uint256 amount); + event RewardDistributionCoolDownSet(uint160 cooldown); + event DistributionStarterSet(address indexed starter); + event VestingPeriodSet(uint32 _period); + event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + event RewardPaid(address indexed staker, address toAddress, uint256 reward); + event RewardDurationSet(uint256 duration); + event UnvestedRewardsAdded(address indexed staker, uint256 unvestedRewards, uint256 nextRewardAmount); + + error CannotDistribute(); + error CannotDelegate(); + error InvalidOperation(); + error InvalidBlockNumber(); + error NoStaker(); + + struct Reward { + uint40 periodFinish; + uint216 rewardRate; // The reward amount (1e18) per total reward duration + uint40 lastUpdateTime; + uint216 rewardPerTokenStored; + } + + /// @notice A checkpoint for marking number of votes from a given block + struct Checkpoint { + uint256 fromBlock; + uint256 votes; + } + + constructor( + address _rescuer, + address _executor, + address _stakingToken, + address _rewardToken, + address _previousStaking + ) TempleElevatedAccess(_rescuer, _executor){ + stakingToken = IERC20(_stakingToken); + rewardToken = IERC20(_rewardToken); + previousStaking = ITempleGoldStaking(_previousStaking); + } + + /** + * @notice For migrations to a new staking contract if TGLD changes + * 1. Withdraw `staker`s tokens to the new staking contract (the migrator) + * 2. Any existing rewards are claimed and sent directly to the `staker` + * @dev Called only from the new staking contract (the migrator). + * `setMigrator(new_staking_contract)` needs to be called first + */ + function migrateWithdraw() external view onlyMigrator { + revert CommonEventsAndErrors.Unimplemented(); + } + + function migrateFromPreviousStaking() external { + uint256 amount = previousStaking.migrateWithdraw(msg.sender); + _applyStake(msg.sender, amount); + _moveDelegates(address(0), delegates[msg.sender], amount); + } + + /** + * @notice Set reward duration + * @param _duration Reward duration + */ + function setRewardDuration(uint256 _duration) external onlyElevatedAccess { + // minimum reward duration + if (_duration < WEEK_LENGTH) { revert CommonEventsAndErrors.InvalidParam(); } + // only change after reward epoch ends + if (rewardData.periodFinish >= block.timestamp) { revert InvalidOperation(); } + rewardDuration = _duration; + emit RewardDurationSet(_duration); + } + + /** + * @notice Set starter of rewards distribution for the next epoch + * @dev If starter is address zero, anyone can call `distributeRewards` to apply and + * distribute rewards for next reward duration + * @param _starter Starter address + * @dev could be: + * 1. a bot (if set to non zero address) that checks requirements are met before starting auction + * 2. or anyone if set to zero address + */ + function setDistributionStarter(address _starter) external onlyElevatedAccess { + /// @notice Starter can be address zero + distributionStarter = _starter; + emit DistributionStarterSet(_starter); + } + + /** + * @notice Set migrator + * @param _migrator Migrator + */ + function setMigrator(address _migrator) external onlyElevatedAccess { + if (_migrator == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + migrator = _migrator; + emit MigratorSet(_migrator); + } + + /** + * @notice Delegate votes from `msg.sender` to `delegatee` + * @param delegatee The address to delegate votes to + */ + function delegate(address delegatee) external { + return _delegate(msg.sender, delegatee); + } + + /** + * @notice Set reward distribution cooldown + * @param _cooldown Cooldown in seconds + */ + function setRewardDistributionCoolDown(uint160 _cooldown) external onlyElevatedAccess { + /// @dev zero cooldown is allowed + rewardDistributionCoolDown = _cooldown; + emit RewardDistributionCoolDownSet(_cooldown); + } + + /** + * @notice For migrations to a new staking contract + * 1. Withdraw `staker`s tokens to the new staking contract (the migrator) + * 2. Any existing rewards are claimed and sent directly to the `staker` + * @dev Called only from the new staking contract (the migrator). + * `setMigrator(new_staking_contract)` needs to be called first + * @param staker The staker who is being migrated to a new staking contract. + * @return Staker balance + */ + function migrateWithdraw(address staker) external onlyMigrator returns (uint256) { + if (staker == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + uint256 stakerBalance = _balances[staker]; + _withdrawFor(staker, msg.sender, stakerBalance, true, staker); + return stakerBalance; + } + + /** + * @notice Distributed TGLD rewards minted to this contract to stakers + * @dev This starts another epoch of rewards distribution. Calculates new `rewardRate` from any left over rewards up until now + */ + function distributeRewards() external whenNotPaused updateReward(address(0)) { + if (msg.sender != distributionStarter) { revert CommonEventsAndErrors.InvalidAccess(); } + if (totalSupply == 0) { revert NoStaker(); } + // Mint and distribute TGLD if no cooldown set + if (lastRewardNotificationTimestamp + rewardDistributionCoolDown > block.timestamp) + { revert CannotDistribute(); } + _distributeGold(); + uint256 rewardAmount = nextRewardAmount; + // revert if next reward is 0 or less than reward duration (final dust amounts) + if (rewardAmount < rewardDuration ) { revert CommonEventsAndErrors.ExpectedNonZero(); } + nextRewardAmount = 0; + _notifyReward(rewardAmount); + lastRewardNotificationTimestamp = uint32(block.timestamp); + } + + /** + * @notice Gets the current votes balance for `account` + * @param account The address to get votes balance + * @return The number of current votes for `account` + */ + function getCurrentVotes(address account) external view returns (uint256) { + uint256 nCheckpoints = numCheckpoints[account]; + return nCheckpoints > 0 ? _checkpoints[account][nCheckpoints - 1].votes : 0; + } + + /** + * @notice Determine the prior number of votes for an account as of a block number + * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. + * @param account The address of the account to check + * @param blockNumber The block number to get the vote balance at + * @return The number of votes the account had as of the given block + */ + function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { + if (blockNumber >= block.number) { revert InvalidBlockNumber(); } + + uint256 nCheckpoints = numCheckpoints[account]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (_checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { + return _checkpoints[account][nCheckpoints - 1].votes; + } + + // Next check implicit zero balance + if (_checkpoints[account][0].fromBlock > blockNumber) { + return 0; + } + + uint256 lower = 0; + uint256 upper = nCheckpoints - 1; + while (upper > lower) { + uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = _checkpoints[account][center]; + if (cp.fromBlock == blockNumber) { + return cp.votes; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return _checkpoints[account][lower].votes; + } + + /** + * @notice Stake for account when contract is not paused + * @param amount Amount of staking token + */ + function stake(uint256 amount) external whenNotPaused { + _stake(msg.sender, amount); + } + + /** + * @notice Private staking function. + * @param _for Staking account + * @param _amount Amount of staking token + */ + function _stake(address _for, uint256 _amount) private { + if (_amount == 0) revert CommonEventsAndErrors.ExpectedNonZero(); + + // pull tokens and apply stake + stakingToken.safeTransferFrom(msg.sender, address(this), _amount); + _applyStake(_for, _amount); + _moveDelegates(address(0), delegates[_for], _amount); + } + + /** + * @notice Withdraw staked tokens + * @param amount Amount to withdraw + * @param claimRewards Whether to claim rewards + */ + function withdraw(uint256 amount, bool claimRewards) external whenNotPaused { + _withdrawFor(msg.sender, msg.sender, amount, claimRewards, msg.sender); + } + + /// @notice Owner can pause user swaps from occuring + function pause() external onlyElevatedAccess { + _pause(); + } + + /// @notice Owner can unpause so user swaps can occur + function unpause() external onlyElevatedAccess { + _unpause(); + } + + /** + * @notice Get account checkpoint data + * @param account Account + * @param epoch Epoch + * @return Checkpoint data + */ + function getCheckpoint(address account, uint256 epoch) external view returns (Checkpoint memory) { + return _checkpoints[account][epoch]; + } + + /** + * @notice Get account staked balance + * @param account Account + * @return Staked balance of account + */ + function balanceOf(address account) public view returns (uint256) { + return _balances[account]; + } + + /** + * @notice Get earned rewards of account + * @param account Account + * @return Earned rewards of account + */ + function earned(address account) external view returns (uint256) { + return _earned(account); + } + + /** + * @notice Get Temple Gold reward per token of Temple + * @return Reward per token + */ + function rewardPerToken() external view returns (uint256) { + return _rewardPerToken(); + } + + /** + * @notice Get finish timestamp of rewards + * @return Finish timestamp + */ + function rewardPeriodFinish() external view returns (uint40) { + return rewardData.periodFinish; + } + + /** + * @notice Elevated access can recover tokens which are not staking or reward tokens + * @param _token Token to recover + * @param _to Recipient + * @param _amount Amount of tokens + */ + function recoverToken(address _token, address _to, uint256 _amount) external onlyElevatedAccess { + if (_token == address(stakingToken) || _token == address(rewardToken )) + { revert CommonEventsAndErrors.InvalidAddress(); } + + IERC20(_token).safeTransfer(_to, _amount); + emit CommonEventsAndErrors.TokenRecovered(_to, _token, _amount); + } + + /** + * @notice Get rewards + * @param staker Staking account + */ + function getReward( + address staker + ) external whenNotPaused updateReward(staker) { + _getReward(staker, staker); + } + + /** + * @notice Mint and distribute Temple Gold rewards + */ + function distributeGold() external whenNotPaused { + _distributeGold(); + } + + /** + * @notice Notify rewards distribution. Called by TempleGold contract after successful mint + * @param amount Amount minted to this contract + */ + function notifyDistribution(uint256 amount) external { + if (msg.sender != address(rewardToken)) { revert CommonEventsAndErrors.InvalidAccess(); } + /// @notice Temple Gold contract mints TGLD amount to contract before calling `notifyDistribution` + nextRewardAmount += amount; + emit GoldDistributionNotified(amount, block.timestamp); + } + + /** + * @notice Get reward data + * @return Reward data + */ + function getRewardData() external view returns (Reward memory) { + return rewardData; + } + + function _getReward(address _staker, address _to) internal { + uint256 amount = claimableRewards[_staker]; + if (amount > 0) { + claimableRewards[_staker] = 0; + rewardToken.safeTransfer(_to, amount); + emit RewardPaid(_staker, _to, amount); + } + } + + function _withdrawFor( + address _staker, + address _to, + uint256 _amount, + bool _claimRewards, + address _rewardsTo + ) private updateReward(_staker) { + if (_amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + uint256 _balance = _balances[_staker]; + if (_amount > _balance) + { revert CommonEventsAndErrors.InsufficientBalance(address(stakingToken), _amount, _balance); } + unchecked { + _balances[_staker] = _balance - _amount; + } + totalSupply -= _amount; + _moveDelegates(delegates[_staker], address(0), _amount); + + stakingToken.safeTransfer(_to, _amount); + emit Withdrawn(_staker, _to, _amount); + + // claim reward + if (_claimRewards) { + // can call internal because user reward already updated + _getReward(_staker, _rewardsTo); + } + } + + function _earned( + address _account + ) internal view returns (uint256) { + return _balances[_account] * (_rewardPerToken() - userRewardPerTokenPaid[_account]) / 1e18 + + claimableRewards[_account]; + } + + function _applyStake(address _for, uint256 _amount) internal updateReward(_for) { + totalSupply += _amount; + _balances[_for] += _amount; + emit Staked(_for, _amount); + } + + function _rewardPerToken() internal view returns (uint256) { + if (totalSupply == 0) { + return rewardData.rewardPerTokenStored; + } + + return + rewardData.rewardPerTokenStored + + (((_lastTimeRewardApplicable(rewardData.periodFinish) - + rewardData.lastUpdateTime) * + rewardData.rewardRate * 1e18) + / totalSupply); + } + + function _notifyReward(uint256 amount) private { + if (block.timestamp >= rewardData.periodFinish) { + rewardData.rewardRate = uint216(amount / rewardDuration); + // collect dust + nextRewardAmount = amount - (rewardData.rewardRate * rewardDuration); + } else { + uint256 remaining = uint256(rewardData.periodFinish) - block.timestamp; + uint256 leftover = remaining * rewardData.rewardRate; + rewardData.rewardRate = uint216((amount + leftover) / rewardDuration); + // collect dust + nextRewardAmount = (amount + leftover) - (rewardData.rewardRate * rewardDuration); + } + rewardData.lastUpdateTime = uint40(block.timestamp); + rewardData.periodFinish = uint40(block.timestamp + rewardDuration); + } + + function _lastTimeRewardApplicable(uint256 _finishTime) internal view returns (uint256) { + if (_finishTime < block.timestamp) { + return _finishTime; + } + return block.timestamp; + } + + function _distributeGold() internal { + /// @dev no op silent fail if nothing to distribute + ITempleGold(address(rewardToken)).mint(); + } + + function _delegate(address delegator, address delegatee) internal { + address currentDelegate = delegates[delegator]; + uint256 delegatorBalance = _balances[delegator]; + delegates[delegator] = delegatee; + + emit DelegateChanged(delegator, currentDelegate, delegatee); + _moveDelegates(currentDelegate, delegatee, delegatorBalance); + } + + function _moveDelegates( + address srcRep, + address dstRep, + uint256 amount + ) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) { + uint256 srcRepNum = numCheckpoints[srcRep]; + uint256 srcRepOld = srcRepNum > 0 ? _checkpoints[srcRep][srcRepNum - 1].votes : 0; + uint256 srcRepNew = srcRepOld - amount; + _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); + } + + if (dstRep != address(0)) { + uint256 dstRepNum = numCheckpoints[dstRep]; + uint256 dstRepOld = dstRepNum > 0 ? _checkpoints[dstRep][dstRepNum - 1].votes : 0; + uint256 dstRepNew = dstRepOld + amount; + _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); + } + } + } + + function _writeCheckpoint( + address delegatee, + uint256 nCheckpoints, + uint256 oldVotes, + uint256 newVotes + ) internal { + if (nCheckpoints > 0 && _checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number) { + _checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; + } else { + _checkpoints[delegatee][nCheckpoints] = Checkpoint(block.number, newVotes); + numCheckpoints[delegatee] = nCheckpoints + 1; + } + emit DelegateVotesChanged(delegatee, oldVotes, newVotes); + } + + modifier updateReward(address _account) { + { + rewardData.rewardPerTokenStored = uint216(_rewardPerToken()); + rewardData.lastUpdateTime = uint40(_lastTimeRewardApplicable(rewardData.periodFinish)); + if (_account != address(0)) { + claimableRewards[_account] = _earned(_account); + userRewardPerTokenPaid[_account] = uint256(rewardData.rewardPerTokenStored); + } + } + _; + } + + modifier onlyMigrator() { + if (msg.sender != migrator) { revert CommonEventsAndErrors.InvalidAccess(); } + _; + } + +} \ No newline at end of file diff --git a/protocol/contracts/fakes/templegold/TempleTokenMock.sol b/protocol/contracts/fakes/templegold/TempleTokenMock.sol new file mode 100644 index 000000000..bfbb9c7a8 --- /dev/null +++ b/protocol/contracts/fakes/templegold/TempleTokenMock.sol @@ -0,0 +1,28 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; + +contract TempleTokenMock is ERC20, ERC20Burnable, Ownable, AccessControl { + bytes32 public constant CAN_MINT = keccak256("CAN_MINT"); + + constructor() ERC20("Temple", "TEMPLE") Ownable(msg.sender) { + _grantRole(DEFAULT_ADMIN_ROLE, owner()); + } + + function mint(address to, uint256 amount) external { + require(hasRole(CAN_MINT, msg.sender), "Caller cannot mint"); + _mint(to, amount); + } + + function addMinter(address account) external onlyOwner { + grantRole(CAN_MINT, account); + } + + function removeMinter(address account) external onlyOwner { + revokeRole(CAN_MINT, account); + } +} \ No newline at end of file diff --git a/protocol/contracts/fakes/v2/TempleDebtTokenTestnetAdmin.sol b/protocol/contracts/fakes/v2/TempleDebtTokenTestnetAdmin.sol index 6bd94ad11..df56cc507 100644 --- a/protocol/contracts/fakes/v2/TempleDebtTokenTestnetAdmin.sol +++ b/protocol/contracts/fakes/v2/TempleDebtTokenTestnetAdmin.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later import { ITempleDebtToken } from "contracts/interfaces/v2/ITempleDebtToken.sol"; diff --git a/protocol/contracts/fakes/v2/strategies/DsrBaseStrategyTestnet.sol b/protocol/contracts/fakes/v2/strategies/DsrBaseStrategyTestnet.sol index f2bf1d486..cbe63b870 100644 --- a/protocol/contracts/fakes/v2/strategies/DsrBaseStrategyTestnet.sol +++ b/protocol/contracts/fakes/v2/strategies/DsrBaseStrategyTestnet.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/DSRStrategy.sol) diff --git a/protocol/contracts/interfaces/common/access/IElevatedAccess.sol b/protocol/contracts/interfaces/common/access/IElevatedAccess.sol new file mode 100644 index 000000000..bb747f61d --- /dev/null +++ b/protocol/contracts/interfaces/common/access/IElevatedAccess.sol @@ -0,0 +1,45 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interface/common/access/IElevatedAccess.sol) + + +interface IElevatedAccess { + event ExplicitAccessSet(address indexed account, bytes4 indexed fnSelector, bool indexed value); + + event NewOwnerProposed(address indexed oldOwner, address indexed oldProposedOwner, address indexed newProposedOwner); + event NewOwnerAccepted(address indexed oldOwner, address indexed newOwner); + + struct ExplicitAccess { + bytes4 fnSelector; + bool allowed; + } + + /** + * @notice The address of the current owner. + */ + function owner() external returns (address); + + /** + * @notice Explicit approval for an address to execute a function. + * allowedCaller => function selector => true/false + */ + function explicitFunctionAccess(address contractAddr, bytes4 functionSelector) external returns (bool); + + /** + * @notice Proposes a new Owner. + * Can only be called by the current owner + */ + function proposeNewOwner(address account) external; + + /** + * @notice Caller accepts the role as new Owner. + * Can only be called by the proposed owner + */ + function acceptOwner() external; + + /** + * @notice Grant `allowedCaller` the rights to call the function selectors in the access list. + * @dev fnSelector == bytes4(keccak256("fn(argType1,argType2,...)")) + */ + function setExplicitAccess(address allowedCaller, ExplicitAccess[] calldata access) external; +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/core/IMultiOtcOffer.sol b/protocol/contracts/interfaces/core/IMultiOtcOffer.sol index a872ce8d6..2c9b1dc42 100644 --- a/protocol/contracts/interfaces/core/IMultiOtcOffer.sol +++ b/protocol/contracts/interfaces/core/IMultiOtcOffer.sol @@ -1,6 +1,6 @@ pragma solidity 0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later -// Temple (interfaces/IMultiOtcOffer.sol) +// Temple (interfaces/core/IMultiOtcOffer.sol) import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; interface IMultiOtcOffer { diff --git a/protocol/contracts/interfaces/core/ITempleERC20Token.sol b/protocol/contracts/interfaces/core/ITempleERC20Token.sol index 436adf6c5..600c67c8f 100644 --- a/protocol/contracts/interfaces/core/ITempleERC20Token.sol +++ b/protocol/contracts/interfaces/core/ITempleERC20Token.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (interfaces/core/ITempleERC20Token.sol) diff --git a/protocol/contracts/interfaces/templegold/IAuctionBase.sol b/protocol/contracts/interfaces/templegold/IAuctionBase.sol new file mode 100644 index 000000000..39413ae5e --- /dev/null +++ b/protocol/contracts/interfaces/templegold/IAuctionBase.sol @@ -0,0 +1,69 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interfaces/templegold/IAuctionBase.sol) + + +interface IAuctionBase { + event Deposit(address indexed depositor, uint256 epochId, uint256 amount); + event Claim(address indexed user, uint256 epochId, uint256 bidTokenAmount, uint256 auctionTokenAmount); + event AuctionStarted(uint256 epochId, address indexed starter, uint128 startTime, uint128 endTime, uint256 auctionTokenAmount); + + error CannotDeposit(); + error CannotClaim(uint256 epochId); + error CannotStartAuction(); + error InvalidEpoch(); + error AuctionActive(); + error InvalidOperation(); + error AuctionEnded(); + error AlreadyClaimed(); + error AlreadyRecovered(); + + struct EpochInfo { + /// @notice Start time for epoch + uint128 startTime; + /// @notice End time for epoch + uint128 endTime; + /// @notice Total amount of bid token deposited + uint256 totalBidTokenAmount; + /// @notice Total amount of auction tokens to distribute. Constant value + uint256 totalAuctionTokenAmount; + } + + /// @notice Keep track of epochs details + function getEpochInfo(uint256 epochId) external view returns (EpochInfo memory); + /// @notice Keep track of depositors for each epoch + function depositors(address depositor, uint256 epochId) external view returns (uint256); + /// @notice Keep track of claimed accounts per epoch + function claimed(address depositor, uint256 epochId) external view returns (bool); + /// @notice claimed amounts + function claimedAmount(address depositor, uint256 epochId) external view returns (uint256); + + /** + * @notice Deposit bid token for current running epoch auction + * @param amount Amount of bid token to deposit + */ + function bid(uint256 amount) external; + + /** + * @notice Start auction. Auction start can be triggered by anyone if `auctionStarter` not set + * Uses up to date distributed Temple Gold tokens since last auction as total Temple Gold for distribution + */ + function startAuction() external; + + /** + * @notice Get current epoch + * @return Epoch Id + */ + function currentEpoch() external view returns (uint256); + + /** + * @notice Recover auction tokens for last but not started auction + * @param token Token to recover + * @param to Recipient + * @param amount Amount to auction tokens + */ + function recoverToken(address token, address to, uint256 amount) external; + + /// @notice Check if TGLD for epoch without bid is recovered + function epochsWithoutBidsRecovered(uint256 epochId) external view returns (bool); +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ISpiceAuction.sol b/protocol/contracts/interfaces/templegold/ISpiceAuction.sol new file mode 100644 index 000000000..f57774d34 --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ISpiceAuction.sol @@ -0,0 +1,151 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interface/templegold/ISpiceAuction.sol) + +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +interface ISpiceAuction is IAuctionBase { + event AuctionConfigSet(uint256 epoch, SpiceAuctionConfig config); + event DaoExecutorSet(address daoExecutor); + event AuctionConfigRemoved(uint256 configId, uint256 epochId); + event LzReceiveExecutorGasSet(uint32 gas); + event RedeemedTempleGoldBurned(uint256 epochId, uint256 amount); + event OperatorSet(address indexed operator); + + error InvalidConfigOperation(); + error NotEnoughAuctionTokens(); + error MissingAuctionTokenConfig(); + error NoConfig(); + error RemoveAuctionConfig(); + error WithdrawFailed(uint256 amount); + error EtherNotNeeded(); + + struct SpiceAuctionConfig { + /// @notice Duration of auction + uint32 duration; + /// @notice Minimum time between successive auctions + uint32 waitPeriod; + /// @notice Cooldown after auction start is triggered, to allow deposits + uint32 startCooldown; + /// @notice Minimum Gold distributed to enable auction start + uint160 minimumDistributedAuctionToken; + /// @notice Address to start next auction when all criteria are met. Address zero means anyone can trigger start + address starter; + /// @notice Is Temple Gold auction token + bool isTempleGoldAuctionToken; + /// @notice Auction proceeds recipient + address recipient; + } + + /// @notice Spice auction contracts are set up for 2 tokens. Either can be bid or sell token for a given auction + /// @notice Temple GOLD + function templeGold() external view returns (address); + + /// @notice Spice Token + function spiceToken() external view returns (address); + + /// @notice DAO contract to execute configurations update + function daoExecutor() external view returns (address); + + /// @notice Operator + function operator() external view returns (address); + + /// @notice Name of this Spice Bazaar auction + function name() external view returns (string memory); + + /** + * @notice Set config for an epoch. This enables dynamic and multiple auctions especially for vested scenarios + * @dev Must be set before epoch auction starts + * @param _config Config to set + */ + function setAuctionConfig(SpiceAuctionConfig calldata _config) external; + + /// @notice Remove auction config set for last epoch + function removeAuctionConfig() external; + + /** + * @notice Get auction token for current epoch + * @return Auction token + */ + function getAuctionTokenForCurrentEpoch() external view returns (address); + + /** + * @notice Get spice auction config for an auction + * @param auctionId Id of auction + */ + function getAuctionConfig(uint256 auctionId) external view returns (SpiceAuctionConfig memory); + + /** + * @notice Get claimable amount for an epoch + * @dev function will return claimable for epoch. This can change with more user deposits + * @param depositor Address to check amount for + * @param epochId Epoch id + * @return Claimable amount + */ + function getClaimableForEpoch(address depositor, uint256 epochId) external view returns (uint256); + + /** + * @notice Set DAO executor for DAO actions + * @param _daoExecutor New dao executor + */ + function setDaoExecutor(address _daoExecutor) external; + + /** + * @notice Recover auction tokens for epoch with zero bids + * @param epochId Epoch Id + * @param to Recipient + */ + function recoverAuctionTokenForZeroBidAuction(uint256 epochId, address to) external; + + /** + * @notice Get total auction token amount for epoch auction + * @param epochId Epoch to get for + */ + function getAuctionTokenAmount(uint256 epochId) external view returns (uint256); + + /** + * @notice Get total bid token amount for epoch auction + * @param epochId Epoch to get for + */ + function getAuctionBidAmount(uint256 epochId) external view returns (uint256); + + /** + * @notice Claim share of Temple Gold for epoch + * Can only claim for past epochs, not current auction epoch. + * @param epochId Id of epoch + */ + function claim(uint256 epochId) external; + + /** + * @notice Set lzReceive gas used by executor + * @param _gas Redemption notifier + */ + function setLzReceiveExecutorGas(uint32 _gas) external; + + /// @notice Max gas limit used by layer zero executor for calling `lzReceive` + function lzReceiveExecutorGas() external view returns (uint32); + + /// @notice Epochs which have redemption called to update circulating supply. + function redeemedEpochs(uint256 epochId) external view returns (bool); + + /** + * @notice Check if current epoch is active + * @return Bool for active status + */ + function isActive() external view returns (bool); + + /** + * @notice Burn redeemd TGLD and notify circulating supply + * @param epochId Epoch Id + * @param useContractEth If to use contract eth for layerzero send + */ + function burnAndNotify(uint256 epochId, bool useContractEth) external payable; + + /// @notice withdraw ETH used for layer zero sends + function withdrawEth(address payable _to, uint256 _amount) external; + + /** + * @notice Set operator + * @param _operator operator to set + */ + function setOperator(address _operator) external; +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ISpiceAuctionFactory.sol b/protocol/contracts/interfaces/templegold/ISpiceAuctionFactory.sol new file mode 100644 index 000000000..d8699c70f --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ISpiceAuctionFactory.sol @@ -0,0 +1,40 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interface/templegold/ISpiceAuctionFactory.sol) + +interface ISpiceAuctionFactory { + event AuctionCreated(bytes32 id, address auction); + + /// @notice Temple Gold + function templeGold() external view returns (address); + + /// @notice Dao executing contract + function daoExecutor() external view returns (address); + + /// @notice Operator + function operator() external view returns (address); + + /// @notice Keep track of deployed spice auctions + function deployedAuctions(bytes32 id) external view returns (address); + + /** + * @notice Create Spice Auction contract + * @param spiceToken Spice token + * @param name Name of spice auction contract + */ + function createAuction(address spiceToken, string memory name) external returns (address); + + /** + * @notice Given a pair of tokens, retrieve spice auction contract + * @param spiceToken Spice token + * @return Address of auction contract + */ + function findAuctionForSpiceToken(address spiceToken) external view returns (address); + + /** + * @notice Given a pair of tokens, retrieve pair hash Id + * @param spiceToken Spice token + * @return Id of token pair + */ + function getPairId(address spiceToken) external view returns (bytes32); +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/IStableGoldAuction.sol b/protocol/contracts/interfaces/templegold/IStableGoldAuction.sol new file mode 100644 index 000000000..48426b7d3 --- /dev/null +++ b/protocol/contracts/interfaces/templegold/IStableGoldAuction.sol @@ -0,0 +1,131 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interfaces/templegold/IStableGoldAuction.sol) + +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +interface IStableGoldAuction is IAuctionBase { + event BidTokenSet(address bidToken); + event GoldDistributionNotified(uint256 amount, uint256 timestamp); + event AuctionConfigSet(uint256 epochId, AuctionConfig config); + event AuctionStarterSet(address indexed starter); + + error LowGoldDistributed(uint256 epochGoldAmount); + + struct AuctionConfig { + /// @notice Time diff between two auctions. Usually 2 weeks + uint32 auctionsTimeDiff; + /// @notice Cooldown after auction start is triggered, to allow deposits + uint32 auctionStartCooldown; + /// @notice Minimum Gold distributed to enable auction start + uint192 auctionMinimumDistributedGold; + } + + /// @notice Temple Gold address + function templeGold() external view returns (ITempleGold); + + /// @notice Token to bid for Temple GOLD + function bidToken() external view returns (IERC20); + + /// @notice Destination address for proceeds of auctions + function treasury() external view returns (address); + + /// @notice Address that can trigger start of auction. address(0) means anyone + function auctionStarter() external view returns (address); + + /// @notice Keep track of next epoch auction Temple Gold amount + function nextAuctionGoldAmount() external view returns (uint256); + + /** + * @notice Recover auction tokens for epoch with zero bids + * @param epochId Epoch Id + * @param to Recipient + */ + function recoverTempleGoldForZeroBidAuction(uint256 epochId, address to) external; + + /** + * @notice Get auction configuration + * @return Auction configuration + */ + function getAuctionConfig() external view returns (AuctionConfig memory); + + /** + * @notice Set auction configuration + * @param _config Auction configuration + */ + function setAuctionConfig(AuctionConfig calldata _config) external; + + /** + * @notice Set token used for bidding + * @param _bidToken Bid token + */ + function setBidToken(address _bidToken) external; + + /** + * @notice Set address to trigger auction start. Zero address accepted + * @param _starter Auction starter + */ + function setAuctionStarter(address _starter) external; + + /** + * @notice Get Temple Gold supply for epoch + * @param epochId Epoch Id + * @return Temple Gold supply + */ + function epochGoldSupply(uint256 epochId) external view returns (uint256); + + /** + * @notice Get next epoch + * @return Next epoch Id + */ + function nextEpoch() external view returns (uint256); + + /** + * @notice Check if current epoch ended. That is, if current auction ended. + * @return Bool if epoch ended + */ + function isCurrentEpochEnded() external view returns (bool); + + /** + * @notice Checkpoint total Temple Gold distributed for next epoch. + * Can only be called by Temple Gold contract + * @param amount Amount of Temple Gold to checkpoint + */ + function notifyDistribution(uint256 amount) external; + + /** + * @notice Check if current auction epoch is allowing bid deposits + * @return Bool if allowing deposit + */ + function canDeposit() external view returns (bool); + + /** + * @notice Mint and distribute TGLD + */ + function distributeGold() external; + + /** + * @notice Get claimable amount for current epoch + * @dev For current epoch, function will return claimable at current time. This can change with more user deposits + * @param depositor Address to check amount for + * @return Claimable amount + */ + function getClaimableAtCurrentEpoch(address depositor) external view returns (uint256); + + /** + * @notice Get claimable amount for an epoch + * @dev For current epoch, function will return claimable at current time. This can change with more user deposits + * @param depositor Address to check amount for + * @param epochId Epoch id + * @return Claimable amount + */ + function getClaimableAtEpoch(address depositor, uint256 epochId) external view returns (uint256); + + /** + * @notice Claim share of Temple Gold for epoch + * Can only claim for past epochs, not current auction epoch. + * @param epochId Id of epoch + */ + function claim(uint256 epochId) external; +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ITempleGold.sol b/protocol/contracts/interfaces/templegold/ITempleGold.sol new file mode 100644 index 000000000..03a609b6e --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ITempleGold.sol @@ -0,0 +1,154 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interface/templegold/ITempleGold.sol) + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IOFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; +import { IOAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppCore.sol"; +import { IOAppOptionsType3 } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; + +interface ITempleGold is IOFT, IOAppCore, IOAppOptionsType3, IERC20 { + struct DistributionParams { + /// @notice staking contract + uint256 staking; + /// @notice DAI_TGLD auction contract + uint256 auction; + /// @notice Team gnosis + uint256 gnosis; + } + + struct VestingFactor { + uint128 value; + uint128 weekMultiplier; + } + + /// @notice To avoid stack too deep in constructor + struct InitArgs { + address executor; // executor is also used as delegate in LayerZero Endpoint + address layerZeroEndpoint; // local endpoint address + uint128 mintChainId; + uint128 mintChainLzEid; // source arb one chain Eid for layerzero + string name; + string symbol; + } + + event ContractAuthorizationSet(address indexed _contract, bool _whitelisted); + event VestingFactorSet(uint128 numerator, uint128 denominator); + event DistributionParamsSet(uint256 staking, uint256 auction, uint256 gnosis); + event Distributed(uint256 stakingAmount, uint256 auctionAmount, uint256 gnosisAmount, uint256 timestamp); + event StakingSet(address staking); + event StableGoldAuctionSet(address auction); + event TeamGnosisSet(address gnosis); + event CirculatingSupplyUpdated(address indexed sender, uint256 amount, uint256 circulatingSuppply, uint256 totalBurned); + + error InvalidTotalShare(); + error MissingParameter(); + error NonTransferrable(address from, address to); + error WrongChain(); + error CannotCompose(); + + /// @notice These addresses are mutable to allow change/upgrade. + /// @notice Staking contract + function staking() external view returns (ITempleGoldStaking); + + /// @notice Dai Gold auction contract + function auction() external view returns (IStableGoldAuction); + + /// @notice Multisig gnosis address + function teamGnosis() external view returns (address); + + /// @notice Last block timestamp Temple Gold was minted + function lastMintTimestamp() external view returns (uint32); + + /// @notice Whitelisted addresses for transferrability + function authorized(address who) external view returns (bool); + + /** + * @notice Set staking proxy contract address + * @param _staking Staking proxy contract + */ + function setStaking(address _staking) external; + + /** + * @notice Set auctions dai gold auction contract address + * @param _auction contract address + */ + function setStableGoldAuction(address _auction) external; + + /** + * @notice Set team gnosis address + * @param _gnosis Team gnosis address + */ + function setTeamGnosis(address _gnosis) external; + + /** + * @notice Whitelist an address to allow transfer of Temple Gold to or from + * @param _contract Contract address to whitelist + * @param _whitelist Boolean whitelist state + */ + function authorizeContract(address _contract, bool _whitelist) external; + + /** + * @notice Set distribution percentages of newly minted Temple Gold + * @param _params Distribution parameters + */ + function setDistributionParams(DistributionParams calldata _params) external; + + /** + * @notice Set vesting factor + * @param _factor Vesting factor + */ + function setVestingFactor(VestingFactor calldata _factor) external; + + /** + * @notice Mint new tokens to be distributed. + * Enforces minimum mint amount and uses vestin factor to calculate mint token amount. + * Minting is only possible on source chain Arbitrum + */ + function mint() external; + + /** + * @notice Get vesting factor + * @return Vesting factor + */ + function getVestingFactor() external view returns (VestingFactor memory); + + /** + * @notice Get distribution parameters + * @return Distribution parametersr + */ + function getDistributionParameters() external view returns (DistributionParams memory); + + /** + * @notice Get circulating supply across chains + * @return Circulating supply + */ + function circulatingSupply() external view returns (uint256); + + /** + * @notice Check if TGOLD can be distributed + * @return True if can distribtue + */ + function canDistribute() external view returns (bool); + + /** + * @notice Get amount of TGLD tokens that will mint if `mint()` called + * @return Mint amount + */ + function getMintAmount() external view returns (uint256); + + /** + * @notice Burn and update circulating supply on source chain + * @param amount Amount to burn + */ + function burn(uint256 amount) external; + + /** + * @notice Get total distributed Temple Gold. This value has no spice auction redemptions subtracted + * @dev When this function is called on source chain (arbitrum), you get the actual total distributed + * @return Total distributed + */ + function totalDistributed() external view returns (uint256); +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ITempleGoldAdmin.sol b/protocol/contracts/interfaces/templegold/ITempleGoldAdmin.sol new file mode 100644 index 000000000..65c68531d --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ITempleGoldAdmin.sol @@ -0,0 +1,98 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interfaces/templegold/ITempleGoldAdmin.sol) + + +import { EnforcedOptionParam } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; + +interface IOFTCore { + /** + * @dev Sets the message inspector address for the OFT. + * @param _msgInspector The address of the message inspector. + * + * @dev This is an optional contract that can be used to inspect both 'message' and 'options'. + * @dev Set it to address(0) to disable it, or set it to a contract address to enable it. + */ + function setMsgInspector(address _msgInspector) external; +} +interface ITempleGoldAdmin { + /// @notice Temple Gold + function templeGold() external view returns (ITempleGold); + + /** + * @notice Set staking contract address + * @param _staking Staking contract + */ + function setStaking(address _staking) external; + + /** + * @notice Set auctions Dai Gold contract address + * @param _auction contract address + */ + function setStableGoldAuction(address _auction) external; + + /** + * @notice Set team gnosis address + * @param _gnosis Team gnosis address + */ + function setTeamGnosis(address _gnosis) external; + + /** + * @notice Whitelist an address to allow transfer of Temple Gold to or from + * @param _contract Contract address to whitelist + * @param _whitelist Boolean whitelist state + */ + function authorizeContract(address _contract, bool _whitelist) external; + + /** + * @notice Set distribution percentages of newly minted Temple Gold + * @param _params Distribution parameters + */ + function setDistributionParams(ITempleGold.DistributionParams calldata _params) external; + + /** + * @notice Set vesting factor + * @param _factor Vesting factor + */ + function setVestingFactor(ITempleGold.VestingFactor calldata _factor) external; + + /** + * @dev Sets the preCrime contract address. + * @param _preCrime The address of the preCrime contract. + */ + function setPreCrime(address _preCrime) external; + + /** + * @notice Sets the delegate address for the OApp. + * @param _delegate The address of the delegate to be set. + * + * @dev Only elevated access of the OApp can call this function. + * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract. + */ + function setDelegate(address _delegate) external; + + /** + * @notice Sets the peer address (OApp instance) for a corresponding endpoint. + * @param _eid The endpoint ID. + * @param _peer The address of the peer to be associated with the corresponding endpoint. + * + * @dev Only the owner/admin of the OApp can call this function. + * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp. + * @dev Set this to bytes32(0) to remove the peer address. + * @dev Peer is a bytes32 to accommodate non-evm chains. + */ + function setPeer(uint32 _eid, bytes32 _peer) external; + + /** + * @dev Sets the enforced options for specific endpoint and message type combinations. + * @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options. + * + * @dev Only the owner/admin of the OApp can call this function. + * @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc. + * @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType. + * eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay + * if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose(). + */ + function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) external; +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ITempleGoldStaking.sol b/protocol/contracts/interfaces/templegold/ITempleGoldStaking.sol new file mode 100644 index 000000000..a84d37a5b --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ITempleGoldStaking.sol @@ -0,0 +1,249 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interfaces/templegold/ITempleGoldStaking.sol) + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface ITempleGoldStaking { + event GoldDistributionNotified(uint256 amount, uint256 timestamp); + event Staked(address indexed staker, uint256 amount); + event MigratorSet(address migrator); + event Withdrawn(address indexed staker, address to, uint256 amount); + event RewardDistributionCoolDownSet(uint160 cooldown); + event DistributionStarterSet(address indexed starter); + event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + event RewardPaid(address indexed staker, address toAddress, uint256 reward); + event RewardDurationSet(uint256 duration); + event UnstakeCooldownSet(uint32 period); + event DAOExecutorSet(address indexed daoExecutor); + + error CannotDistribute(); + error CannotDelegate(); + error InvalidOperation(); + error InvalidBlockNumber(); + error NoStaker(); + error UnstakeCooldown(uint256 timestampnow, uint256 unstakeTime); + error CannotStake(); + + /// @notice Reward parameters + struct Reward { + /// @notice The timestamp reward distribution finishes + uint40 periodFinish; + /// @notice The reward amount (1e18) per second during the reward period + uint216 rewardRate; + /// @notice The timestamp reward parameters were last updated + uint40 lastUpdateTime; + /// @notice The reward per token + uint216 rewardPerTokenStored; + } + + /// @notice A checkpoint for marking number of votes from a given block + struct Checkpoint { + uint256 fromBlock; + uint256 votes; + } + + /// @notice The staking token. Temple + function stakingToken() external view returns (IERC20); + /// @notice Reward token. Temple Gold + function rewardToken() external view returns (IERC20); + + /// @notice Distribution starter + function distributionStarter() external view returns (address); + + /// @notice Dao Executor + function daoExecutor() external view returns (address); + + /// @notice Total supply of staking token + function totalSupply() external view returns (uint256); + + /// @notice Store next reward amount for next epoch + function nextRewardAmount() external view returns (uint256); + /// @notice Cooldown time before next distribution of rewards + /// @dev If set to zero, rewards distribution is callable any time + function rewardDistributionCoolDown() external view returns (uint160); + /// @notice Timestamp for last reward notification + function lastRewardNotificationTimestamp() external view returns (uint96); + + /// @notice For use when migrating to a new staking contract if TGLD changes. + function migrator() external view returns (address); + + /// @notice Stakers claimable rewards at stake index + function claimableRewards(address account) external view returns (uint256); + /// @notice Staker reward per token paid at stake index + function userRewardPerTokenPaid(address account) external view returns (uint256); + + /** + * @notice Set migrator + * @param _migrator Migrator + */ + function setMigrator(address _migrator) external; + + /** + * @notice Set DAO executor + * @param _executor DAO executor + */ + function setDaoExecutor(address _executor) external; + + /** + * @notice Stake for an account when contract is not paused + * @param amount Amount of staking token + */ + function stake(uint256 amount) external; + + /** + * @notice Withdraw staked tokens + * @param amount Amount to withdraw + * @param claimRewards Whether to claim rewards + */ + function withdraw(uint256 amount, bool claimRewards) external; + + /// @notice Owner can pause user swaps from occuring + function pause() external; + + /// @notice Owner can unpause so user swaps can occur + function unpause() external; + + /** + * @notice Get account staked balance + * @param account Account + * @return Staked balance of account + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @notice Get earned rewards of account + * @param _account Account + * @return Earned rewards of account + */ + function earned(address _account) external view returns (uint256); + + /** + * @notice Get Temple Gold reward per token of Temple + * @return Reward per token + */ + function rewardPerToken() external view returns (uint256); + + /** + * @notice Get finish timestamp of rewards + * @return Finish timestamp + */ + function rewardPeriodFinish() external view returns (uint40); + + /** + * @notice Elevated access can recover tokens which are not staking or reward tokens + * @param _token Token to recover + * @param _to Recipient + * @param _amount Amount of tokens + */ + function recoverToken(address _token, address _to, uint256 _amount) external; + + /** + * @notice Get rewards + * @param staker Staking account + */ + function getReward(address staker) external; + + /** + * @notice Notify rewards distribution. Called by TempleGold contract after successful mint + * @param amount Amount minted to this contract + */ + function notifyDistribution(uint256 amount) external; + + /** + * @notice Set reward distribution cooldown + * @param _cooldown Cooldown in seconds + */ + function setRewardDistributionCoolDown(uint160 _cooldown) external; + + /** + * @notice Mint and distribute TGLD + */ + function distributeGold() external; + + /** + * @notice Get reward data + * @return Reward data + */ + function getRewardData() external view returns (Reward memory); + + /** + * @notice For migrations to a new staking contract + * 1. Withdraw `staker`s tokens to the new staking contract (the migrator) + * 2. Any existing rewards are claimed and sent directly to the `staker` + * @dev Called only from the new staking contract (the migrator). + * `setMigrator(new_staking_contract)` needs to be called first + * @param staker The staker who is being migrated to a new staking contract. + * @return Staker balance + */ + function migrateWithdraw(address staker) external returns (uint256); + + /** + * @notice Distributed TGLD rewards minted to this contract to stakers + * @dev This starts another epoch of rewards distribution. Calculates new `rewardRate` from any left over rewards up until now + */ + function distributeRewards() external; + + /** + * @notice Get account checkpoint data + * @param account Account + * @param epoch Epoch + * @return Checkpoint data + */ + function getCheckpoint(address account, uint256 epoch) external view returns (Checkpoint memory); + + /** + * @notice Get account number of checkpoints + * @param account Account + * @return Number of checkpoints + */ + function numCheckpoints(address account) external view returns (uint256); + + /** + * @notice Get account unstake time + * @param account Account + * @return Unstake time + */ + function getAccountUnstakeTime(address account) external view returns (uint256); + + /** + * @notice Set reward duration + * @param _duration Reward duration + */ + function setRewardDuration(uint256 _duration) external; + + /** + * @notice Delegate votes from `msg.sender` to `delegatee` + * @param delegatee The address to delegate votes to + */ + function delegate(address delegatee) external; + + /** + * @notice Gets the current votes balance for `account` + * @param account The address to get votes balance + * @return The number of current votes for `account` + */ + function getCurrentVotes(address account) external view returns (uint256); + + /** + * @notice Determine the prior number of votes for an account as of a block number + * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. + * @param account The address of the account to check + * @param blockNumber The block number to get the vote balance at + * @return The number of votes the account had as of the given block + */ + function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256); + /// @notice Time staker staked + function stakeTimes(address account) external view returns (uint256); + /// @notice Cooldown time before unstake + function unstakeCooldown() external view returns (uint32); + + /** + * @notice Set unstake cooldown + * @param _period Cooldown period + */ + function setUnstakeCooldown(uint32 _period) external; + + function rewardDuration() external view returns (uint256); +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/templegold/ITempleTeleporter.sol b/protocol/contracts/interfaces/templegold/ITempleTeleporter.sol new file mode 100644 index 000000000..a3f63fa45 --- /dev/null +++ b/protocol/contracts/interfaces/templegold/ITempleTeleporter.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (interfaces/templegold/ITempleTeleporter.sol) + +import { MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { ITempleERC20Token } from "contracts/interfaces/core/ITempleERC20Token.sol"; + +interface ITempleTeleporter { + event TempleTeleported(uint32 dstEid, address indexed sender, address indexed recipient, uint256 amount); + + /// @notice Temple token + function temple() external view returns (ITempleERC20Token); + + /** + * @notice Teleport temple tokens cross chain + * @dev Temple tokens are burned from source chain and minted on destination chain + * @param dstEid Destination chain id + * @param to Recipient + * @param amount Amount of tokens + * @param options Additional options for the message + */ + function teleport( + uint32 dstEid, + address to, + uint256 amount, + bytes calldata options + ) external payable returns(MessagingReceipt memory receipt); + + /** + * @dev External function to interact with the LayerZero EndpointV2.quote() for fee calculation. + * @param _dstEid The destination endpoint ID. + * @param _message The message payload. + * @param _options Additional options for the message. + * @return fee The calculated MessagingFee for the message. + * - nativeFee: The native fee for the message. + * - lzTokenFee: The LZ token fee for the message. + */ + function quote( + uint32 _dstEid, + bytes memory _message, + bytes memory _options + ) external view returns (MessagingFee memory fee); + + /** + * @dev External function to interact with the LayerZero EndpointV2.quote() for fee calculation. + * @param _dstEid The destination endpoint ID. + * @param _to Recipient + * @param _amount Amount to send + * @param _options Additional options for the message. + * @return fee The calculated MessagingFee for the message. + * - nativeFee: The native fee for the message. + * - lzTokenFee: The LZ token fee for the message. + */ + function quote( + uint32 _dstEid, + address _to, + uint256 _amount, + bytes memory _options + ) external view returns (MessagingFee memory fee); +} \ No newline at end of file diff --git a/protocol/contracts/interfaces/v2/access/ITempleElevatedAccess.sol b/protocol/contracts/interfaces/v2/access/ITempleElevatedAccess.sol index 935d635d7..dc7e52b89 100644 --- a/protocol/contracts/interfaces/v2/access/ITempleElevatedAccess.sol +++ b/protocol/contracts/interfaces/v2/access/ITempleElevatedAccess.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (interfaces/v2/access/ITempleElevatedAccess.sol) diff --git a/protocol/contracts/templegold/AuctionBase.sol b/protocol/contracts/templegold/AuctionBase.sol new file mode 100644 index 000000000..4300035fa --- /dev/null +++ b/protocol/contracts/templegold/AuctionBase.sol @@ -0,0 +1,32 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/AuctionBase.sol) + +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; + +/** + * @title AuctionBase + * @notice Base auction contract. Inherited by `DaiGoldAuction.sol` and `SpiceAuction.sol` + */ +abstract contract AuctionBase is IAuctionBase { + /// @notice Current epoch id + uint256 internal _currentEpochId; + /// @notice Keep track of epochs details + mapping(uint256 epochId => EpochInfo info) internal epochs; + /// @notice Keep track of depositors for each epoch + mapping(address depositor => mapping(uint256 epochId => uint256 amount)) public override depositors; + /// @notice Keep track of claimed accounts per epoch + mapping(address depositor => mapping(uint256 epochId => bool claimed)) public override claimed; + /// @notice claimed amounts + mapping(address depositor => mapping(uint256 epochId => uint256 claimedAmount)) public override claimedAmount; + /// @notice For epochs without bids that are recovered + mapping(uint256 epochId => bool recovered) public override epochsWithoutBidsRecovered; + + /** + * @notice Get info on epoch + * @param epochId Id of epoch + */ + function getEpochInfo(uint256 epochId) external override view returns (EpochInfo memory) { + return epochs[epochId]; + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/EpochLib.sol b/protocol/contracts/templegold/EpochLib.sol new file mode 100644 index 000000000..ff71414d8 --- /dev/null +++ b/protocol/contracts/templegold/EpochLib.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/EpochLib.sol) + +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; + +library EpochLib { + + function isActive(IAuctionBase.EpochInfo storage info) internal view returns (bool) { + return info.startTime <= block.timestamp && block.timestamp < info.endTime; + } + + function hasEnded(IAuctionBase.EpochInfo storage info) internal view returns (bool) { + return info.endTime <= block.timestamp; + } + + function hasStarted(IAuctionBase.EpochInfo storage info) internal view returns (bool) { + return info.startTime > 0 && block.timestamp >= info.startTime; + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/README.md b/protocol/contracts/templegold/README.md new file mode 100644 index 000000000..b794df958 --- /dev/null +++ b/protocol/contracts/templegold/README.md @@ -0,0 +1,162 @@ +# TEMPLE GOLD (TGLD) + +## Background + +Temple Gold (TGLD) is non-transferrable ERC-20 token that serves as “points” that can only interact with whitelisted contracts +- Staking +- Auctions Escrow +- Team Gnosis +- Spice Bazaar Auctions Contract(s) +Which means TGLD tokens can be sent to staking and auction contracts as staking rewards and as auction rewards. +The mint source chain of Temple Gold is `Arbitrum One`. With layer zero integration, Temple Gold can be transferred cross-chain. A holder can only transfer cross-chain to their own address. + + +## High level design +![High level design](docs/high-level.jpeg) + +## Temple Gold Token (TGLD) + +Section here talks about technicals on Temple Gold. + + +### Admin + +Temple Gold (TGLD) extends layer zero's `OFT` contracts, which depend on Open Zeppelin's (OZ) `Ownable`. Temple contracts are controlled with `TempleElevatedAccess`, which is a more flexible upgrade to `Ownable`. To avoid manual changes to imported Layer Zero contracts, Temple Gold is controlled by `TempleGoldAdmin` which uses `TempleElevatedAccess` + +### Constants + +TGLD has the below constant values. When `mint()` is called, distribution happens only when mint amount is greater than `MINIMUM_MINT` + +```solidity +//// @notice Distribution as a percentage of 100 +uint256 public constant DISTRIBUTION_DIVISOR = 100 ether; +/// @notice 1B max supply +uint256 public constant MAX_CIRCULATING_SUPPLY = 1_000_000_000 ether; // 1B +/// @notice Minimum Temple Gold minted per call to mint +uint256 public constant MINIMUM_MINT = 10_000 ether; +``` + +### Minting + +Amount of tokens to mint are accrued per second depending on a vesting schedule. The vesting schedule (factor) is set using function `setVestingFactor(VestingFactor calldata _factor)`. + +```solidity +struct VestingFactor { + /// @notice Value of vesting factor. Typically 35 + uint128 value; + /// @notice Week multiplier. Typically 1 week + uint128 weekMultiplier; +} + +``` + +`mint()` is a public function when called, tokens are distributed according to the vesting factor, if accrued tokens at current time are more than `MINIMUM_MINT`. +`distributeGold()` in TempleGoldStaking and DaiGoldAuction contracts also call `mint()`. + +Minting is only done on the source chain Arbitrum One. +Minted tokens are distributed to staking, DaiGold auction contract and team gnosis depending on the set distribution parameters. Distribution parameters are set with `setDistributionParameters()` by admin. + + +## Staking + +Templars stake Temple tokens for Temple Gold rewards. +Temple can be transferred cross-chain to Arbitrum One using the `TempleTeleporter` contract. Temple tokens are burned on mainnet and same amount of tokens are minted on arbitrum one. + +Staking contract has voting capabilities built in. +When a user stakes or withdraws, their delegate's vote is updated. A staker participating in governance must set delegate to either own address or another address using `delegate()`. Setting delegate to address zero means no participation in governance(default). A user can set delegate (to self or another address) before or after staking. The plan for UI flow is to let stakers set delegate first if they want to do governance voting. + +Migration is built in, if there is an upgrade to staking contract. First, `setMigrator()` is called. Migrator is the next staking contract. Migrator calls `migrateWithdraw()` to withdraw and migrate staker's stake amount and optionally claim rewards. +Rewards can be claimed after migration. + +Staking contract will also be deployed to Arbitrum One chain. + +Staking contract has unstake cooldown feature. This means cooldown time after staking, before staker can unstake. + +## Auctions + +### DaiGold Auctions +In DaiGold auctions, bidders bid DAI in exchange for Temple Gold when an auction is active. These Temple Gold tokens available for each auction are sent to `DaiGoldAuction` contract prior to auction starting. + +`TempleGold.mint()` distributes TGLD tokens on mint to DaiGoldAuction, Staking contracts and team multisig using distribution share parameters percentages set at `DistributionParams`. +Temple Gold reward tokens for each auction are shared amongst DAI bidders/depositors after the auction has ended. DAI depositors can claim their share of the TGOLD rewards after auction and also retroactively. + +A `DaiGold` auction has the following configuration options. +```solidity + struct AuctionConfig { + /// @notice Time diff between two auctions. Usually 2 weeks + uint32 auctionsTimeDiff; + /// @notice Cooldown after auction start is triggered, to allow deposits + uint32 auctionStartCooldown; + /// @notice Minimum Gold distributed to enable auction start + uint192 auctionMinimumDistributedGold; + } +``` + +Bid token can be updated later using `setBidToken`. It can be assumed that the bid token has no funky internal taxes or fees, callbacks or complex functionalities beyond the usual OZ ERC20 functions. + +Each auction lasts for 1 week. Proceeds from auctions are sent directly to treasury. + +#### Constants + +```solidity +/// @notice Auction duration +uint64 public constant AUCTION_DURATION = 1 weeks; +``` + +### Spice Auctions + +In a spice auction, a "spice" token is bid for Temple Gold or vice versa. Each spice auction epoch has a different configuration. +```solidity +struct SpiceAuctionConfig { + /// @notice Duration of auction + uint32 duration; + /// @notice Minimum time between successive auctions + uint32 waitPeriod; + /// @notice Cooldown after auction start is triggered, to allow deposits + uint32 startCooldown; + /// @notice Minimum Gold distributed to enable auction start + uint160 minimumDistributedAuctionToken; + /// @notice Address to start next auction when all criteria are met. Address zero means anyone can trigger start + address starter; + /// @notice Is Temple Gold auction token + bool isTempleGoldAuctionToken; + /// @notice Auction proceeds recipient + address recipient; +} + +``` +Spice auction configuration are set and controlled by the DAO executor (part of the governance process). +Each spice auction contract is configured with one spice token and templegold. Spice auction contracts are deployed via `SpiceAuctionFactory`. + +The Layer Zero integration allows Temple Gold (TGLD) usage in spice bazaar auctions cross-chain. + +After a spice auction (epoch), `burnAndNotify()` is called to perform a call to `TempleGold` to burn and update the circulating supply. `TempleGold.circulatingSupply()` on source chain Arbitrum One is the actual circulating supply. + +#### Constants +```solidity +/// @notice Auctions run for minimum 1 week +uint32 public constant MINIMUM_AUCTION_PERIOD = 1 weeks; +/// @notice Maximum wait period between last and next auctions +uint32 public constant MAXIMUM_AUCTION_WAIT_PERIOD = 90 days; +/// @notice Maximum auction duration +uint32 public constant MAXIMUM_AUCTION_DURATION = 30 days; + +``` + +## Layer Zero Interactions + +Minting of Temple Gold tokens happens on arbitrum. This is the source chain. Minted Temple Gold tokens are transferred to Staking, DaiGold auction contract and gnosis team multisig according to set configuration percentages. Staking and DaiGold contracts are both deployed on arbitrum. + +Majority of Temple is on Ethereum mainnet. Gas prices are expected to rise in the coming months. Temple is staked for TGLD rewards on staking contract which is on arbitrum. We introduce `TempleTeleporter` contract with layer zero integration to for templars to `teleport` Temple tokens from mainnet to arbitrum in one transaction with no bridging. +`TempleTeleporter` burns temple tokens on Ethereum mainnet and mints the same amount on Arbitrum One to a destination address. Usually the destination address is the same as source address, that is, `teleporting` Temple tokens between chains. + +DaiGold auctions also are on arbitrum. Users can easily move Dai tokens from mainnet to arbitrum using [Stargate finance](https://stargate.finance/) in a single transaction with no bridging. + +The Layer Zero integration allows Temple Gold (TGLD) usage in future spice bazaar auctions cross-chain. Volatile tokens can be bid for Temple Gold or vice versa in an auction. Volatile tokens can have any source chain. TGLD can be transferred cross-chain for spice auctions. + +A summary of interactions: +- Minting on Arbitrum and distributed to staking contract, gnosis team wallet and DaiGold auction contract. +- Users staking teleport Temple tokens from mainnet to arbitrum using `TempleTeleporter` +- Users unstaking teleport unstaked Temple tokens from arbitrum to mainnet using `TempleTeleporter` +- Auction participants transfer Dai to arbitrum using [Stargate finance](https://stargate.finance/) +- Reverse spice bazaar auctions (bidding TGLD for volatile token) can be on any chain. Layer zero integration allows transferring TGLD cross-chain to participate in reverse spice bazaar auctions \ No newline at end of file diff --git a/protocol/contracts/templegold/SpiceAuction.sol b/protocol/contracts/templegold/SpiceAuction.sol new file mode 100644 index 000000000..660e362e7 --- /dev/null +++ b/protocol/contracts/templegold/SpiceAuction.sol @@ -0,0 +1,501 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/SpiceAuction.sol) + + +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ISpiceAuction } from "contracts/interfaces/templegold/ISpiceAuction.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { AuctionBase } from "contracts/templegold/AuctionBase.sol"; +import { TempleMath } from "contracts/common/TempleMath.sol"; +import { EpochLib } from "contracts/templegold/EpochLib.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { SendParam } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +/** + * @title SpiceAuction + * @notice Temple Gold is deposited into this contract to bid on a share of distributed Spice token, + * or vice versa, for an epoch. Temple Gold can be the bid or auction token at any auction epoch. + * Reward tokens acquired in past epochs can always be claimed. Once bid, users cannot + * claim their bid token and can only claim their share of reward token for epoch after epoch finishes. + * Bid and auction tokens could change per auction. These are set in `AuctionConfig`. + * Config is set before the next auction starts using `setAuctionConfig` by DAO execution. + */ +contract SpiceAuction is ISpiceAuction, AuctionBase, ReentrancyGuard { + using SafeERC20 for IERC20; + using TempleMath for uint256; + using EpochLib for IAuctionBase.EpochInfo; + using OptionsBuilder for bytes; + + /// @notice Spice auction contracts are set up for 2 tokens. Either token can be bid or sell token for a given auction + address public immutable override spiceToken; + /// @notice Temple GOLD + address public immutable override templeGold; + /// @notice DAO contract to execute configurations update + address public override daoExecutor; + /// @notice operator + address public override operator; + + /// @notice Auctions run for minimum 1 week + uint32 public constant MINIMUM_AUCTION_PERIOD = 1 weeks; + /// @notice Maximum wait period between last and next auctions + uint32 public constant MAXIMUM_AUCTION_WAIT_PERIOD = 90 days; + /// @notice Maximum auction duration + uint32 public constant MAXIMUM_AUCTION_DURATION = 30 days; + /// @notice Arbitrum One layer zero EID + uint32 private immutable _arbitrumOneLzEid; + /// @notice Arbitrum One chain ID + uint32 private immutable _mintChainId; + /// @notice Max gas limit for use by executor in calling `lzReceive` + uint32 public override lzReceiveExecutorGas; + + /// @notice Name of this Spice Bazaar auction + string public override name; + + /// @notice Last time auction was started. For zero auctions, it is the contract deploy timestamp + uint256 private immutable _deployTimestamp; + + /// @notice Keep track of the different configurations for each auction + mapping(uint256 auctionId => SpiceAuctionConfig config) public auctionConfigs; + /// @notice Keep track of claimed amounts per auction token. This helps calculate amount of auction tokens for next epoch. + mapping(address token => uint256 amount) private _claimedAuctionTokens; + /// @notice Keep track of total allocation per auction token + mapping(address token => uint256 amount) private _totalAuctionTokenAllocation; + /// @notice Keep track of redeemed and notified epochs + mapping(uint256 epochId => bool redeemed) public override redeemedEpochs; + + constructor( + address _templeGold, + address _spiceToken, + address _daoExecutor, + address _operator, + uint32 _arbEid, + uint32 mintChainId_, + string memory _name + ) { + spiceToken = _spiceToken; + daoExecutor = _daoExecutor; + operator = _operator; + templeGold = _templeGold; + _arbitrumOneLzEid = _arbEid; + _mintChainId = mintChainId_; + name = _name; + _deployTimestamp = block.timestamp; + lzReceiveExecutorGas = 85_889; + } + + /** + * @notice Set lzReceive gas used by executor + * @param _gas Redemption notifier + */ + function setLzReceiveExecutorGas(uint32 _gas) external override onlyOperatorOrDaoExecutor { + if (_gas == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + lzReceiveExecutorGas = _gas; + emit LzReceiveExecutorGasSet(_gas); + } + + /** + * @notice Set operator + * @param _operator operator to set + */ + function setOperator(address _operator) external override onlyDAOExecutor { + if (_operator == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + operator = _operator; + emit OperatorSet(_operator); + } + + /** + * @notice Set DAO executor for DAO actions + * @param _daoExecutor New dao executor + */ + function setDaoExecutor(address _daoExecutor) external onlyDAOExecutor { + if (_daoExecutor == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + daoExecutor = _daoExecutor; + emit DaoExecutorSet(_daoExecutor); + } + + /** + * @notice Set config for an epoch. This enables dynamic and multiple auctions especially for vested scenarios + * @dev Must be set before epoch auction starts + * @param _config Config to set + */ + function setAuctionConfig(SpiceAuctionConfig calldata _config) external onlyDAOExecutor { + /// @dev epoch Id is only updated when auction starts. + /// @dev cannot set config for past or ongoing auction + uint256 currentEpochIdCache = _currentEpochId; + if (currentEpochIdCache > 0) { + EpochInfo storage info = epochs[currentEpochIdCache]; + /// Cannot set config for ongoing auction + if (info.isActive()) { revert InvalidConfigOperation(); } + } + if (_config.duration < MINIMUM_AUCTION_PERIOD + || _config.duration > MAXIMUM_AUCTION_DURATION + || _config.waitPeriod > MAXIMUM_AUCTION_WAIT_PERIOD) { revert CommonEventsAndErrors.InvalidParam(); } + /// @dev startCooldown can be zero + if (_config.waitPeriod == 0 + || _config.minimumDistributedAuctionToken == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + if (_config.recipient == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + + currentEpochIdCache += 1; + auctionConfigs[currentEpochIdCache] = _config; + emit AuctionConfigSet(currentEpochIdCache, _config); + } + + /// @notice Remove auction config set for last epoch + function removeAuctionConfig() external override onlyDAOExecutor { + /// only delete latest epoch if auction is not started + uint256 id = _currentEpochId; + + EpochInfo storage info = epochs[id]; + // if _currentEpochId = 0 + if (info.startTime == 0) { revert InvalidConfigOperation(); } + // Cannot reset an ongoing auction + if (info.isActive()) { revert InvalidConfigOperation(); } + /// @dev could be that `auctionStart` is triggered but there's cooldown, which is not reached (so can delete epochInfo for _currentEpochId) + // or `auctionStart` is not triggered but `auctionConfig` is set (where _currentEpochId is not updated yet) + bool configSetButAuctionStartNotCalled = auctionConfigs[id+1].duration > 0; + if (!configSetButAuctionStartNotCalled) { + /// @dev unlikely because this is a DAO execution, but avoid deleting old ended auctions + if (info.hasEnded()) { revert AuctionEnded(); } + SpiceAuctionConfig storage config = auctionConfigs[id]; + (,address auctionToken) = _getBidAndAuctionTokens(config); + _totalAuctionTokenAllocation[auctionToken] -= info.totalAuctionTokenAmount; + /// auction was started but cooldown has not passed yet + delete auctionConfigs[id]; + delete epochs[id]; + _currentEpochId = id - 1; + emit AuctionConfigRemoved(id, id); + } else { + // `auctionStart` is not triggered but `auctionConfig` is set + id += 1; + delete auctionConfigs[id]; + emit AuctionConfigRemoved(id, 0); + } + } + + /** + * @notice Start auction. Checks caller is set config starter. Address zero for anyone to call + */ + function startAuction() external override { + uint256 epochId = _currentEpochId; + /// @dev config is always set for next auction + /// @notice Configuration is set before auctions so configId = currentEpochId + 1; + SpiceAuctionConfig storage config = auctionConfigs[epochId+1]; + if (config.duration == 0) { revert CannotStartAuction(); } + /// @notice only starter + if (config.starter != address(0) && msg.sender != config.starter) { revert CommonEventsAndErrors.InvalidAccess(); } + /// @notice enough wait period since last auction + if (epochId > 0) { + /// @dev `_currentEpochId` is still last epoch + EpochInfo memory lastEpochInfo = epochs[epochId]; + /// use waitperiod from last auction config + uint64 _waitPeriod = auctionConfigs[epochId].waitPeriod; + if (lastEpochInfo.endTime + _waitPeriod > block.timestamp) { revert CannotStartAuction(); } + } else { + /// For first auction + if (_deployTimestamp + config.waitPeriod > block.timestamp) { revert CannotStartAuction(); } + } + (,address auctionToken) = _getBidAndAuctionTokens(config); + uint256 totalAuctionTokenAllocation = _totalAuctionTokenAllocation[auctionToken]; + uint256 balance = IERC20(auctionToken).balanceOf(address(this)); + uint256 epochAuctionTokenAmount = balance - (totalAuctionTokenAllocation - _claimedAuctionTokens[auctionToken]); + if (config.minimumDistributedAuctionToken == 0) { revert MissingAuctionTokenConfig(); } + if (epochAuctionTokenAmount < config.minimumDistributedAuctionToken) { revert NotEnoughAuctionTokens(); } + // epoch start settings + // now update currentEpochId + epochId = _currentEpochId = _currentEpochId + 1; + EpochInfo storage info = epochs[epochId]; + uint128 startTime = info.startTime = uint128(block.timestamp) + config.startCooldown; + uint128 endTime = info.endTime = startTime + config.duration; + info.totalAuctionTokenAmount = epochAuctionTokenAmount; + // Keep track of total allocation auction tokens per epoch + _totalAuctionTokenAllocation[auctionToken] = totalAuctionTokenAllocation + epochAuctionTokenAmount; + + emit AuctionStarted(epochId, msg.sender, startTime, endTime, epochAuctionTokenAmount); + } + + /** + * @notice Bid using `bidToken` for `auctionToken` + * Once a bid is placed for an auction, user cannot withdraw or cancel bid. + * @param amount Amount of `bidToken` to bid + */ + function bid(uint256 amount) external virtual override { + /// @dev Cache, gas savings + uint256 epochId = _currentEpochId; + EpochInfo storage info = epochs[epochId]; + + if(!info.isActive()) { revert CannotDeposit(); } + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + + SpiceAuctionConfig storage config = auctionConfigs[epochId]; + (address bidToken,) = _getBidAndAuctionTokens(config); + address _recipient = config.recipient; + uint256 _bidTokenAmountBefore = IERC20(bidToken).balanceOf(_recipient); + IERC20(bidToken).safeTransferFrom(msg.sender, _recipient, amount); + uint256 _bidTokenAmountAfter = IERC20(bidToken).balanceOf(_recipient); + // fee on transfer tokens + if (amount != _bidTokenAmountAfter - _bidTokenAmountBefore) { revert CommonEventsAndErrors.InvalidParam(); } + depositors[msg.sender][epochId] += amount; + + info.totalBidTokenAmount += amount; + emit Deposit(msg.sender, epochId, amount); + } + + /** + * @notice Claim (retro) rewards for an epoch . Cannot claim for a live epoch auction + * @param epochId Epoch to claim for + */ + function claim(uint256 epochId) external virtual override { + /// @notice cannot claim for current live epoch + EpochInfo storage info = epochs[epochId]; + if (info.startTime == 0) { revert InvalidEpoch(); } + if (!info.hasEnded()) { revert CannotClaim(epochId); } + + if (claimed[msg.sender][epochId]) { revert AlreadyClaimed(); } + uint256 bidTokenAmount = depositors[msg.sender][epochId]; + if (bidTokenAmount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + claimed[msg.sender][epochId] = true; + SpiceAuctionConfig storage config = auctionConfigs[epochId]; + (, address auctionToken) = _getBidAndAuctionTokens(config); + + uint256 claimAmount = bidTokenAmount.mulDivRound(info.totalAuctionTokenAmount, info.totalBidTokenAmount, false); + claimedAmount[msg.sender][epochId] = claimAmount; + /// checkpoint claim for auction token + _claimedAuctionTokens[auctionToken] += claimAmount; + IERC20(auctionToken).safeTransfer(msg.sender, claimAmount); + emit Claim(msg.sender, epochId, bidTokenAmount, claimAmount); + } + + /** + * @notice Check total bid token amount for epoch auction + * @param epochId Epoch to check for + */ + function getAuctionTokenAmount(uint256 epochId) external override view returns (uint256) { + EpochInfo storage info = epochs[epochId]; + return info.totalAuctionTokenAmount; + } + + /** + * @notice Get total bid token amount for epoch auction + * @param epochId Epoch to get for + */ + function getAuctionBidAmount(uint256 epochId) external override view returns (uint256) { + EpochInfo storage info = epochs[epochId]; + return info.totalBidTokenAmount; + } + + /** + * @notice Recover auction tokens for last but not started auction + * @param token Token to recover + * @param to Recipient + * @param amount Amount to auction tokens + */ + function recoverToken( + address token, + address to, + uint256 amount + ) external override onlyDAOExecutor { + if (to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + + if (token != spiceToken && token != templeGold) { + emit CommonEventsAndErrors.TokenRecovered(to, token, amount); + IERC20(token).safeTransfer(to, amount); + return; + } + + uint256 epochId = _currentEpochId; + EpochInfo storage info = epochs[epochId]; + /// @dev use `removeAuctionConfig` for case where `auctionStart` is called and cooldown is still pending + if (epochId != 0) { + if (info.startTime == 0) { revert InvalidConfigOperation(); } + if (!info.hasEnded() && auctionConfigs[epochId+1].duration == 0) { revert RemoveAuctionConfig(); } + } + + /// @dev Now `auctionStart` is not triggered but `auctionConfig` is set (where _currentEpochId is not updated yet) + + // check to not take away intended tokens for claims + // calculate auction token amount + uint256 balance = IERC20(token).balanceOf(address(this)); + uint256 maxRecoverAmount = balance - (_totalAuctionTokenAllocation[token] - _claimedAuctionTokens[token]); + + if (amount > maxRecoverAmount) { revert CommonEventsAndErrors.InvalidParam(); } + + IERC20(token).safeTransfer(to, amount); + + emit CommonEventsAndErrors.TokenRecovered(to, token, amount); + } + + /** + * @notice Recover auction tokens for epoch with zero bids + * @param epochId Epoch Id + * @param to Recipient + */ + function recoverAuctionTokenForZeroBidAuction(uint256 epochId, address to) external override onlyDAOExecutor { + if (to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + // has to be valid epoch + if (epochId > _currentEpochId) { revert InvalidEpoch(); } + if (epochsWithoutBidsRecovered[epochId]) { revert AlreadyRecovered(); } + // epoch has to be ended + EpochInfo storage epochInfo = epochs[epochId]; + if (!epochInfo.hasEnded()) { revert AuctionActive(); } + // bid token amount for epoch has to be 0 + if (epochInfo.totalBidTokenAmount > 0) { revert InvalidOperation(); } + + SpiceAuctionConfig storage config = auctionConfigs[epochId]; + (, address auctionToken) = _getBidAndAuctionTokens(config); + epochsWithoutBidsRecovered[epochId] = true; + uint256 amount = epochInfo.totalAuctionTokenAmount; + _totalAuctionTokenAllocation[auctionToken] -= amount; + + emit CommonEventsAndErrors.TokenRecovered(to, auctionToken, amount); + IERC20(auctionToken).safeTransfer(to, amount); + } + + /// @notice withdraw ETH used for layer zero sends + function withdrawEth(address payable _to, uint256 _amount) external override onlyOperatorOrDaoExecutor { + if (_to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + if (_amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + uint256 _balance = address(this).balance; + if (_balance < _amount) { revert CommonEventsAndErrors.InsufficientBalance(address(0), _amount, _balance); } + + (bool success, ) = _to.call{ value: _amount }(""); + if (!success) { revert WithdrawFailed(_amount); } + } + + /** + * @notice Burn redeemd TGLD and notify circulating supply + * @param epochId Epoch Id + * @param useContractEth If to use contract eth for layerzero send + */ + function burnAndNotify(uint256 epochId, bool useContractEth) external payable override nonReentrant { + if (redeemedEpochs[epochId]) { revert CommonEventsAndErrors.InvalidParam(); } + EpochInfo storage epochInfo = epochs[epochId]; + if (epochInfo.startTime == 0) { revert InvalidEpoch(); } + if (!epochInfo.hasEnded()) { revert AuctionActive(); } + // no msg.value eth donation when chain is source chain + if (msg.value > 0 && block.chainid == _mintChainId) { revert EtherNotNeeded();} + + SpiceAuctionConfig storage _config = auctionConfigs[epochId]; + (address bidToken,) = _getBidAndAuctionTokens(_config); + if (bidToken != templeGold) { revert CommonEventsAndErrors.InvalidParam(); } + uint256 amount = epochInfo.totalBidTokenAmount; + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + + emit RedeemedTempleGoldBurned(epochId, amount); + redeemedEpochs[epochId] = true; + _burnAndNotify(amount, _config.recipient, useContractEth); + } + + /** + * @notice Get spice auction config for an auction + * @param auctionId Id of auction + */ + function getAuctionConfig(uint256 auctionId) external view override returns (SpiceAuctionConfig memory) { + return auctionConfigs[auctionId]; + } + + /** + * @notice Get auction token for current epoch + * @return Auction token + */ + function getAuctionTokenForCurrentEpoch() external override view returns (address) { + SpiceAuctionConfig memory config = auctionConfigs[_currentEpochId]; + return config.isTempleGoldAuctionToken ? templeGold : spiceToken; + } + + /** + * @notice Get current epoch + * @return Epoch Id + */ + function currentEpoch() external view override returns (uint256) { + return _currentEpochId; + } + + /** + * @notice Check if current epoch is active + * @return Bool for active status + */ + function isActive() external view override returns (bool) { + return epochs[_currentEpochId].isActive(); + } + + /** + * @notice Get claimable amount for an epoch + * @dev function will return claimable for epoch. This can change with more user deposits + * @param depositor Address to check amount for + * @param epochId Epoch id + * @return Claimable amount + */ + function getClaimableForEpoch(address depositor, uint256 epochId) external override view returns (uint256) { + if (claimed[depositor][epochId]) { return 0; } + uint256 bidTokenAmount = depositors[depositor][epochId]; + if (bidTokenAmount == 0 || epochId > _currentEpochId) { return 0; } + EpochInfo memory info = epochs[epochId]; + return bidTokenAmount.mulDivRound(info.totalAuctionTokenAmount, info.totalBidTokenAmount, false); + } + + function _getBidAndAuctionTokens( + SpiceAuctionConfig storage _config + ) private view returns (address bidToken, address auctionToken) { + (bidToken, auctionToken) = _config.isTempleGoldAuctionToken + ? (spiceToken, templeGold) + : (templeGold, spiceToken); + } + + function _burnAndNotify(uint256 amount, address from, bool useContractEth) private { + // pull funds from bids recipient (set in config) + IERC20(templeGold).safeTransferFrom(from, address(this), amount); + // burn directly and call TempleGold to update circulating supply + if (block.chainid == _mintChainId) { + ITempleGold(templeGold).burn(amount); + return; + } + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(lzReceiveExecutorGas, 0); + SendParam memory sendParam = SendParam( + _arbitrumOneLzEid, //, + bytes32(uint256(uint160(address(0)))), // bytes32(address(0)) to burn + amount, + 0, + options, + bytes(""), // compose message + "" + ); + MessagingFee memory fee = ITempleGold(templeGold).quoteSend(sendParam, false); + if (useContractEth && address(this).balance < fee.nativeFee) { + revert CommonEventsAndErrors.InsufficientBalance(address(0), fee.nativeFee, address(this).balance); + } else if (!useContractEth && msg.value < fee.nativeFee) { + revert CommonEventsAndErrors.InsufficientBalance(address(0), fee.nativeFee, msg.value); + } + + if (useContractEth) { + ITempleGold(templeGold).send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + } else { + ITempleGold(templeGold).send{ value: fee.nativeFee }(sendParam, fee, payable(msg.sender)); + uint256 leftover = msg.value - fee.nativeFee; + if (leftover > 0) { + (bool success,) = payable(msg.sender).call{ value: leftover }(""); + if (!success) { revert WithdrawFailed(leftover); } + } + } + } + + /// @notice modifier to allow execution by only DAO executor + modifier onlyDAOExecutor() { + if (msg.sender != daoExecutor) { revert CommonEventsAndErrors.InvalidAccess(); } + _; + } + + modifier onlyOperatorOrDaoExecutor() { + if (msg.sender != operator && msg.sender != daoExecutor) { revert CommonEventsAndErrors.InvalidAccess(); } + _; + } + + // allow this contract to receive ether + receive() external payable {} +} \ No newline at end of file diff --git a/protocol/contracts/templegold/SpiceAuctionFactory.sol b/protocol/contracts/templegold/SpiceAuctionFactory.sol new file mode 100644 index 000000000..950a4f57e --- /dev/null +++ b/protocol/contracts/templegold/SpiceAuctionFactory.sol @@ -0,0 +1,91 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/SpiceAuctionFactory.sol) + + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; +import { SpiceAuction } from "contracts/templegold/SpiceAuction.sol"; +import { ISpiceAuctionFactory } from "contracts/interfaces/templegold/ISpiceAuctionFactory.sol"; + + +/** + * @title SpiceAuctionFactory + * @notice Factory to create and keep track of spice auction contracts + */ +contract SpiceAuctionFactory is ISpiceAuctionFactory, TempleElevatedAccess { + /// @notice Temple Gold + address public immutable override templeGold; + /// @notice Dao executing contract + address public immutable override daoExecutor; + /// @notice Operator + address public immutable override operator; + /// @notice Arbitrum One layer zero EID + uint32 private immutable _arbitrumLzEid; + /// @notice Arbitrum One chain ID + uint32 private immutable _mintChainId; + /// @notice Keep track of deployed spice auctions + mapping(bytes32 id => address auction) public override deployedAuctions; + + constructor( + address _rescuer, + address _executor, + address _daoExecutor, + address _operator, + address _templeGold, + uint32 _arbLzEid, + uint32 mintChainId_ + ) TempleElevatedAccess(_rescuer, _executor) { + daoExecutor = _daoExecutor; + operator = _operator; + templeGold = _templeGold; + _arbitrumLzEid = _arbLzEid; + _mintChainId = mintChainId_; + } + + /** + * @notice Create Spice Auction contract + * @param spiceToken Spice token + * @param name Name of spice auction contract + */ + function createAuction( + address spiceToken, + string memory name + ) external override onlyElevatedAccess returns (address) { + if (spiceToken == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + if (spiceToken == templeGold) { revert CommonEventsAndErrors.InvalidParam(); } + SpiceAuction spiceAuction = new SpiceAuction(templeGold, spiceToken, daoExecutor, operator, _arbitrumLzEid, _mintChainId, name); + bytes32 pairId = _getPairHash(spiceToken); + /// @dev not checking pair address exists to allow overwrite in case of a migration + deployedAuctions[pairId] = address(spiceAuction); + emit AuctionCreated(pairId, address(spiceAuction)); + return address(spiceAuction); + } + + /** + * @notice Given a pair of tokens, retrieve spice auction contract + * @param spiceToken Spice Token + * @return Address of auction contract + */ + function findAuctionForSpiceToken(address spiceToken) external override view returns (address) { + bytes32 pairId = _getPairHash(spiceToken); + return deployedAuctions[pairId]; + } + + /** + * @notice Given a pair of tokens, retrieve pair hash Id + * @param spiceToken Spice token + * @return Id of token pair + */ + function getPairId(address spiceToken) external override view returns (bytes32) { + return _getPairHash(spiceToken); + } + + function _getPairHash(address _spiceToken) private view returns (bytes32 pairId) { + if (templeGold < _spiceToken) { + pairId = keccak256(abi.encodePacked(templeGold, _spiceToken)); + } else { + pairId = keccak256(abi.encodePacked(_spiceToken, templeGold)); + } + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/StableGoldAuction.sol b/protocol/contracts/templegold/StableGoldAuction.sol new file mode 100644 index 000000000..b752e7fe3 --- /dev/null +++ b/protocol/contracts/templegold/StableGoldAuction.sol @@ -0,0 +1,342 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/StableGoldAuction.sol) + + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { AuctionBase } from "contracts/templegold/AuctionBase.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { TempleMath } from "contracts/common/TempleMath.sol"; +import { EpochLib } from "contracts/templegold/EpochLib.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; + +/** + * @title Stable Temple Gold auction + * @notice Bidding token is deposited into this contract to bid on a share of distributed Temple Gold for an epoch. + * Temple Gold acquired in past epochs can always be claimed. Once bid, users cannot + * withdraw their bid token and can claim their share of Temple Gold for epoch after auction finishes. + * Elevated access can change bidding token for future epochs. + */ +contract StableGoldAuction is IStableGoldAuction, AuctionBase, TempleElevatedAccess { + using SafeERC20 for ITempleGold; + using SafeERC20 for IERC20; + using TempleMath for uint256; + using EpochLib for IAuctionBase.EpochInfo; + + /// @notice Temple GOLD address + ITempleGold public immutable override templeGold; + /// @notice Token to bid for Temple GOLD + /// @dev This token is assumed to not have any taxes or complicated mechanisms. Plan is to use DAI token. This could change in future + IERC20 public override bidToken; + /// @notice Destination address for proceeds of auctions + address public immutable override treasury; + /// @notice Address that can trigger start of auction. address(0) means anyone + address public override auctionStarter; + + /// @notice Keep track of next epoch auction Temple Gold amount + uint256 public override nextAuctionGoldAmount; + + /// @notice Auction duration + uint64 public constant AUCTION_DURATION = 1 weeks; + /// @notice Configuration for auction + AuctionConfig private auctionConfig; + + constructor( + address _templeGold, + address _bidToken, + address _treasury, + address _rescuer, + address _executor, + address _auctionStarter + ) TempleElevatedAccess(_rescuer, _executor) { + templeGold = ITempleGold(_templeGold); + bidToken = IERC20(_bidToken); + treasury = _treasury; + auctionStarter = _auctionStarter; + emit AuctionStarterSet(_auctionStarter); + } + + /** + * @notice Set auction configuration + * @param _config Auction configuration + */ + function setAuctionConfig(AuctionConfig calldata _config) external override onlyElevatedAccess { + if (_config.auctionStartCooldown == 0 + || _config.auctionMinimumDistributedGold == 0 + || _config.auctionsTimeDiff == 0) + { revert CommonEventsAndErrors.ExpectedNonZero(); } + uint256 currentEpochCache = _currentEpochId; + if (!epochs[currentEpochCache].hasEnded()) { revert InvalidOperation(); } + auctionConfig = _config; + + emit AuctionConfigSet(currentEpochCache, _config); + } + + /** + * @notice Set address to trigger auction start. Zero address accepted + * @param _starter Auction starter + */ + function setAuctionStarter(address _starter) external override onlyElevatedAccess { + /// @notice No zero address checks. Zero address is a valid input + auctionStarter = _starter; + if (!epochs[_currentEpochId].hasEnded()) { revert InvalidOperation(); } + emit AuctionStarterSet(_starter); + } + + /** + * @notice Set token used for bidding + * @param _bidToken Bid token + */ + function setBidToken(address _bidToken) external override onlyElevatedAccess { + if (_bidToken == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + if (!epochs[_currentEpochId].hasEnded()) { revert InvalidOperation(); } + bidToken = IERC20(_bidToken); + emit BidTokenSet(_bidToken); + } + + /** + * @notice Start auction. Auction start can be triggered by anyone if `auctionStarter` not set + * @dev The Temple Gold amount for the auction is fixed and set at startAuction(). + * So in `startAuction()`, there is a call to `_distributeGold()` to mint and distribute TGOLD. + * Any other `_distributeGold()` calls during auction is tracked for next auction use. + */ + function startAuction() external override { + if (auctionStarter != address(0) && msg.sender != auctionStarter) { revert CommonEventsAndErrors.InvalidAccess(); } + uint256 currentEpochCache = _currentEpochId; + EpochInfo storage prevAuctionInfo = epochs[currentEpochCache]; + if (!prevAuctionInfo.hasEnded()) { revert CannotStartAuction(); } + + AuctionConfig storage config = auctionConfig; + /// @notice last auction end time plus wait period + if (currentEpochCache > 0 && (prevAuctionInfo.endTime + config.auctionsTimeDiff > block.timestamp)) { + revert CannotStartAuction(); + } + if (config.auctionMinimumDistributedGold == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + _distributeGold(); + uint256 totalGoldAmount = nextAuctionGoldAmount; + nextAuctionGoldAmount = 0; + uint256 epochId = _currentEpochId = currentEpochCache + 1; + + if (totalGoldAmount < config.auctionMinimumDistributedGold) { revert LowGoldDistributed(totalGoldAmount); } + + EpochInfo storage info = epochs[epochId]; + info.totalAuctionTokenAmount = totalGoldAmount; + uint128 startTime = info.startTime = uint128(block.timestamp) + config.auctionStartCooldown; + uint128 endTime = info.endTime = startTime + AUCTION_DURATION; + + emit AuctionStarted(epochId, msg.sender, startTime, endTime, totalGoldAmount); + } + + /** + * @notice Deposit bidding token for current running epoch auction + * @param amount Amount of bid token to deposit + */ + function bid(uint256 amount) external virtual override onlyWhenLive { + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + + bidToken.safeTransferFrom(msg.sender, treasury, amount); + + uint256 epochIdCache = _currentEpochId; + depositors[msg.sender][epochIdCache] += amount; + + EpochInfo storage info = epochs[epochIdCache]; + info.totalBidTokenAmount += amount; + emit Deposit(msg.sender, epochIdCache, amount); + } + + /** + * @notice Claim share of Temple Gold for epoch + * Can only claim for past epochs, not current auction epoch. + * @param epochId Id of epoch + */ + function claim(uint256 epochId) external virtual override { + /// @notice cannot claim for current live epoch + EpochInfo storage info = epochs[epochId]; + if (!info.hasEnded()) { revert CannotClaim(epochId); } + /// @dev epochId could be invalid. eg epochId > _currentEpochId + if (info.startTime == 0) { revert InvalidEpoch(); } + if (claimed[msg.sender][epochId]) { revert AlreadyClaimed(); } + + uint256 bidTokenAmount = depositors[msg.sender][epochId]; + if (bidTokenAmount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + claimed[msg.sender][epochId] = true; + uint256 claimAmount = bidTokenAmount.mulDivRound(info.totalAuctionTokenAmount, info.totalBidTokenAmount, false); + claimedAmount[msg.sender][epochId] = claimAmount; + templeGold.safeTransfer(msg.sender, claimAmount); + emit Claim(msg.sender, epochId, bidTokenAmount, claimAmount); + } + + /** + * @notice Checkpoint total Temple Gold distributed for next epoch. + * Can only be called by Temple Gold contract or elevated access (for rebalancing purpose) + * @param amount Amount of Temple Gold to checkpoint + */ + function notifyDistribution(uint256 amount) external override { + if (msg.sender != address(templeGold) && !isElevatedAccess(msg.sender, msg.sig)) { revert CommonEventsAndErrors.InvalidAccess(); } + /// @notice Temple Gold contract mints TGLD amount to contract before calling `notifyDistribution` + nextAuctionGoldAmount += amount; + emit GoldDistributionNotified(amount, block.timestamp); + } + + /** + * @notice Get Temple Gold supply for epoch + * @param epochId Epoch Id + * @return Temple Gold supply + */ + function epochGoldSupply(uint256 epochId) external view override returns (uint256) { + return epochs[epochId].totalAuctionTokenAmount; + } + + /** + * @notice Get current epoch + * @return Epoch Id + */ + function currentEpoch() external view override returns (uint256) { + return _currentEpochId; + } + + /** + * @notice Get next epoch + * @return Next epoch Id + */ + function nextEpoch() public view override returns (uint256) { + return _currentEpochId + 1; + } + + /** + * @notice Check if current epoch ended. That is, if current auction ended. + * @return Bool if epoch ended + */ + function isCurrentEpochEnded() external view override returns (bool) { + return epochs[_currentEpochId].hasEnded(); + } + + /** + * @notice Check if current auction epoch is allowing bid deposits + * @return Bool if allowing deposit + */ + function canDeposit() external view override returns (bool) { + return epochs[_currentEpochId].isActive(); + } + + /** + * @notice Get auction configuration + * @return Auction configuration + */ + function getAuctionConfig() external override view returns (AuctionConfig memory) { + return auctionConfig; + } + + /** + * @notice Get claimable amount for current epoch + * @dev For current epoch, function will return claimable at current time. This can change with more user deposits + * @param depositor Address to check amount for + * @return Claimable amount + */ + function getClaimableAtCurrentEpoch(address depositor) external override view returns (uint256) { + return getClaimableAtEpoch(depositor, _currentEpochId); + } + + /** + * @notice Get claimable amount for an epoch + * @dev For current epoch, function will return claimable at current time. This can change with more user deposits + * @param depositor Address to check amount for + * @param epochId Epoch id + * @return Claimable amount + */ + function getClaimableAtEpoch(address depositor, uint256 epochId) public override view returns (uint256) { + if (claimed[depositor][epochId]) { return 0; } + uint256 bidTokenAmount = depositors[depositor][epochId]; + if (bidTokenAmount == 0 || epochId > _currentEpochId) { return 0; } + EpochInfo memory info = epochs[epochId]; + return bidTokenAmount.mulDivRound(info.totalAuctionTokenAmount, info.totalBidTokenAmount, false); + } + + /** + * @notice Recover auction tokens for last but not started auction. + * Any other token which is not Temple Gold can be recovered too at any time + * @dev For recovering Temple Gold, Epoch data is deleted and leftover amount is added to nextAuctionGoldAmount. + * so admin should recover total auction amount for epoch if that's the requirement + * @param token Token to recover + * @param to Recipient + * @param amount Amount to auction tokens + */ + function recoverToken( + address token, + address to, + uint256 amount + ) external override onlyElevatedAccess { + if (to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + + if (token != address(templeGold)) { + emit CommonEventsAndErrors.TokenRecovered(to, token, amount); + IERC20(token).safeTransfer(to, amount); + return; + } + + // auction started but cooldown pending + uint256 epochId = _currentEpochId; + EpochInfo storage info = epochs[epochId]; + if (info.startTime == 0) { revert InvalidOperation(); } + if (info.isActive()) { revert AuctionActive(); } + if (info.hasEnded()) { revert AuctionEnded(); } + uint256 _totalAuctionTokenAmount = info.totalAuctionTokenAmount; + if (amount > _totalAuctionTokenAmount) { revert CommonEventsAndErrors.InvalidAmount(token, amount); } + /// @dev Epoch data is deleted and leftover amount is added to nextAuctionGoldAmount. + /// so admin should recover total auction amount for epoch if that's the requirement + delete epochs[epochId]; + /// @dev `nextAuctionGoldAmount` is set to 0 in `startAuction`. + /// `nextAuctionGoldAmount > 0` if there was a distribution after `auctionStart` called + /// epoch is deleted. so if amount < totalAuctionTokenAmount for epoch, add leftover to next auction amount + unchecked { + nextAuctionGoldAmount += _totalAuctionTokenAmount - amount; + } + + emit CommonEventsAndErrors.TokenRecovered(to, token, amount); + templeGold.safeTransfer(to, amount); + } + + /** + * @notice Recover auction tokens for epoch with zero bids + * @param epochId Epoch Id + * @param to Recipient + */ + function recoverTempleGoldForZeroBidAuction(uint256 epochId, address to) external override onlyElevatedAccess { + if (to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + // has to be valid epoch + if (epochId > _currentEpochId) { revert InvalidEpoch(); } + if (epochsWithoutBidsRecovered[epochId]) { revert AlreadyRecovered(); } + // epoch has to be ended + EpochInfo storage epochInfo = epochs[epochId]; + if (!epochInfo.hasEnded()) { revert AuctionActive(); } + // bid token amount for epoch has to be 0 + if (epochInfo.totalBidTokenAmount > 0) { revert InvalidOperation(); } + + epochsWithoutBidsRecovered[epochId] = true; + uint256 amount = epochInfo.totalAuctionTokenAmount; + emit CommonEventsAndErrors.TokenRecovered(to, address(templeGold), amount); + templeGold.safeTransfer(to, amount); + } + + /** + * @notice Mint and distribute TGOLD + */ + function distributeGold() external { + _distributeGold(); + } + + function _distributeGold() private { + /// @dev no op silent fail if nothing to distribute + templeGold.mint(); + } + + modifier onlyWhenLive() { + if (!epochs[_currentEpochId].isActive()) { revert CannotDeposit(); } + _; + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/TempleGold.sol b/protocol/contracts/templegold/TempleGold.sol new file mode 100644 index 000000000..04b63f96e --- /dev/null +++ b/protocol/contracts/templegold/TempleGold.sol @@ -0,0 +1,387 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleGold.sol) + + +import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppReceiver.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { IOFT, OFTCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; +import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { ITempleGoldStaking} from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { OFTMsgCodec } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/OFTMsgCodec.sol"; +import { SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { TempleMath } from "contracts/common/TempleMath.sol"; + +/** + * @title Temple Gold + * @notice Temple Gold is a non-transferrable ERC20 token with LayerZero integration for cross-chain transfer for holders. + * On mint, Temple Gold is distributed to StableGoldAuction, Staking contracts and team multisig using distribution share parameters percentages set at `DistributionParams`. + * Users can get Temple Gold by staking Temple for Temple Gold rewards on the staking contract or in auctions. + * Holders can transfer their Temple Gold to same holder address across chains. + * The intended owner of Temple Gold is the TempleGoldAdmin contract for admin functions. + * This is done to avoid manually importing lz contracts and overriding `Ownable` with `TempleElevatedAccess` + */ + contract TempleGold is ITempleGold, OFT { + using OFTMsgCodec for bytes; + using OFTMsgCodec for bytes32; + + /// @notice These addresses are mutable to allow change/upgrade. + /// @notice Staking contract + ITempleGoldStaking public override staking; + /// @notice Dai Gold auction contract + IStableGoldAuction public override auction; + /// @notice Multisig gnosis address + address public override teamGnosis; + + /// @notice Last block timestamp Temple Gold was minted + uint32 public override lastMintTimestamp; + + //// @notice Distribution as a percentage of 100 + uint256 public constant DISTRIBUTION_DIVISOR = 100 ether; + /// @notice 1B max circulating supply + uint256 public constant MAX_CIRCULATING_SUPPLY = 1_000_000_000 ether; // 1B + /// @notice Minimum Temple Gold minted per call to mint + uint256 public constant MINIMUM_MINT = 10_000 ether; + + /// @notice Mint chain id + uint128 private immutable _mintChainId; + uint128 private immutable _mintChainLzEid; + + /// @notice Total distribtued to track total supply + uint256 private _totalDistributed; + /// @notice Total TGLD burned from all spice auctions and holders + uint256 private _totalBurned; + uint256 private _circulatingSupply; + + /// @notice Whitelisted addresses for transferrability + mapping(address => bool) public override authorized; + /// @notice Distribution parameters. Minted share percentages for staking, dai gold auction and gnosis. Adds up to 100% + DistributionParams private distributionParams; + /// @notice Vesting factor determines rate of mint + // This represents the vesting factor + // If mint every 1 second instead of 1 week, vestingFactor == 35 / 604,800. It is possible but unlikely vesting factor is changed in future + VestingFactor private vestingFactor; + + constructor( + InitArgs memory _initArgs + ) OFT(_initArgs.name, _initArgs.symbol, _initArgs.layerZeroEndpoint, _initArgs.executor) Ownable(_initArgs.executor){ + _mintChainId = _initArgs.mintChainId; + _mintChainLzEid = _initArgs.mintChainLzEid; + } + + /** + * @notice Set staking proxy contract address + * @param _staking Staking proxy contract + */ + function setStaking(address _staking) external override onlyOwner onlySourceChain{ + if (_staking == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + staking = ITempleGoldStaking(_staking); + emit StakingSet(_staking); + } + + /** + * @notice Set dai gold auction contract address + * @param _auction contract address + */ + function setStableGoldAuction(address _auction) external override onlyOwner onlySourceChain { + if (_auction == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + auction = IStableGoldAuction(_auction); + emit StableGoldAuctionSet(_auction); + } + + /** + * @notice Set team gnosis address + * @param _gnosis Team gnosis address + */ + function setTeamGnosis(address _gnosis) external override onlyOwner onlySourceChain { + if (_gnosis == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + teamGnosis = _gnosis; + emit TeamGnosisSet(_gnosis); + } + + /** + * @notice Whitelist an address to allow transfer of Temple Gold to or from + * @param _contract Contract address to whitelist + * @param _whitelist Boolean whitelist state + */ + function authorizeContract(address _contract, bool _whitelist) external override onlyOwner { + if (_contract == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + authorized[_contract] = _whitelist; + emit ContractAuthorizationSet(_contract, _whitelist); + } + + /** + * @notice Set distribution percentages of newly minted Temple Gold + * @param _params Distribution parameters + */ + function setDistributionParams(DistributionParams calldata _params) external override onlyOwner onlySourceChain { + if (_params.staking + _params.gnosis + _params.auction != DISTRIBUTION_DIVISOR) { revert ITempleGold.InvalidTotalShare(); } + distributionParams = _params; + emit DistributionParamsSet(_params.staking, _params.auction, _params.gnosis); + } + + /** + * @notice Set vesting factor + * @param _factor Vesting factor + */ + function setVestingFactor(VestingFactor calldata _factor) external override onlyOwner onlySourceChain { + if (_factor.value == 0 || _factor.weekMultiplier == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + /// @dev initialize + if (lastMintTimestamp == 0) { lastMintTimestamp = uint32(block.timestamp); } + else { mint(); } + vestingFactor = _factor; + emit VestingFactorSet(_factor.value, _factor.weekMultiplier); + } + + /** + * @notice Mint new tokens to be distributed. Open to call from any address + * Enforces minimum mint amount and uses vesting factor to calculate mint token amount. + * Minting is only possible on source chain Arbitrum + */ + function mint() public override onlySourceChain { + VestingFactor memory vestingFactorCache = vestingFactor; + DistributionParams storage distributionParamsCache = distributionParams; + if (vestingFactorCache.value == 0) { return; } + + uint256 mintAmount = _getMintAmount(vestingFactorCache); + /// @dev no op silently + if (!_canDistribute(mintAmount)) { return; } + + lastMintTimestamp = uint32(block.timestamp); + + _distribute(distributionParamsCache, mintAmount); + } + + /** + * @notice Get vesting factor + * @return Vesting factor + */ + function getVestingFactor() external override view returns (VestingFactor memory) { + return vestingFactor; + } + + /** + * @notice Get distribution parameters + * @return Distribution parametersr + */ + function getDistributionParameters() external override view returns (DistributionParams memory) { + return distributionParams; + } + + /** + * @notice Check if TGOLD can be distributed + * @return True if can distribtue + */ + function canDistribute() external view returns (bool) { + VestingFactor memory vestingFactorCache = vestingFactor; + return _canDistribute(vestingFactorCache); + } + + function _canDistribute(VestingFactor memory vestingFactorCache) private view returns (bool) { + uint256 mintAmount = _getMintAmount(vestingFactorCache); + return _canDistribute(mintAmount); + } + + function _canDistribute(uint256 mintAmount) private view returns (bool) { + return mintAmount != 0 && _circulatingSupply + mintAmount == MAX_CIRCULATING_SUPPLY ? true : mintAmount >= MINIMUM_MINT; + } + + /** + * @notice Get circulating supply on this chain. This value has spice auction redemptions subtracted + * @dev When this function is called on source chain (arbitrum), you get the real circulating supply across chains + * @return Circulating supply + */ + function circulatingSupply() public override view returns (uint256) { + return _circulatingSupply; + } + + /** + * @notice Get total distributed Temple Gold. This value has no spice auction redemptions subtracted + * @dev When this function is called on source chain (arbitrum), you get the actual total distributed + * @return Total distributed + */ + function totalDistributed() public override view returns (uint256) { + return _totalDistributed; + } + + /** + * @notice Get amount of TGLD tokens that will mint if `mint()` called + * @return Mint amount + */ + function getMintAmount() external override view returns (uint256) { + VestingFactor memory vestingFactorCache = vestingFactor; + return _getMintAmount(vestingFactorCache); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal override { + /// can only transfer to or from whitelisted addreess + /// @dev skip check on mint and burn. function `send` checks from == to + if (from != address(0) && to != address(0)) { + if (!authorized[from] && !authorized[to]) { revert ITempleGold.NonTransferrable(from, to); } + } + super._update(from, to, value); + } + + function _distribute(DistributionParams storage params, uint256 mintAmount) private { + uint256 stakingAmount = TempleMath.mulDivRound(params.staking, mintAmount, DISTRIBUTION_DIVISOR, false); + if (stakingAmount > 0) { + _mint(address(staking), stakingAmount); + staking.notifyDistribution(stakingAmount); + } + + uint256 auctionAmount = TempleMath.mulDivRound(params.auction, mintAmount, DISTRIBUTION_DIVISOR, false); + if (auctionAmount > 0) { + _mint(address(auction), auctionAmount); + auction.notifyDistribution(auctionAmount); + } + + uint256 gnosisAmount = mintAmount - stakingAmount - auctionAmount; + if (gnosisAmount > 0) { + _mint(teamGnosis, gnosisAmount); + /// @notice no requirement to notify gnosis because no action has to be taken + } + _totalDistributed += mintAmount; + _circulatingSupply += mintAmount; + emit Distributed(stakingAmount, auctionAmount, gnosisAmount, block.timestamp); + } + + function _getMintAmount(VestingFactor memory vestingFactorCache) private view returns (uint256 mintAmount) { + uint32 _lastMintTimestamp = lastMintTimestamp; + /// @dev if vesting factor is not set, return 0. `_lastMintTimestamp` is set when vesting factor is set + if (_lastMintTimestamp == 0) { return 0; } + + /// @dev curernt supply = totalDistributed - totalBurnedInSpiceAuctions + + uint256 circulatingSupplyCache = _circulatingSupply; + mintAmount = (TempleMath.mulDivRound((block.timestamp - _lastMintTimestamp), (MAX_CIRCULATING_SUPPLY - circulatingSupplyCache), + vestingFactorCache.value, false))/ vestingFactorCache.weekMultiplier; + if (circulatingSupplyCache + mintAmount > MAX_CIRCULATING_SUPPLY) { + unchecked { + mintAmount = MAX_CIRCULATING_SUPPLY - circulatingSupplyCache; + } + } + } + + /// @notice Overriden OFT functions + + /** + * @dev Executes the send operation. + * @param _sendParam The parameters for the send operation. + * @param _fee The calculated fee for the send() operation. + * - nativeFee: The native fee. + * - lzTokenFee: The lzToken fee. + * @param _refundAddress The address to receive any excess funds. + * @return msgReceipt The receipt for the send operation. + * @return oftReceipt The OFT receipt information. + * + * @dev MessagingReceipt: LayerZero msg receipt + * - guid: The unique identifier for the sent message. + * - nonce: The nonce of the sent message. + * - fee: The LayerZero fee incurred for the message. + * @dev overriden to check user only transfers cross-chain + * Not using super.send() because virtual overwritten function is external and not internal/public + */ + function send( + SendParam calldata _sendParam, + MessagingFee calldata _fee, + address _refundAddress + ) external payable virtual override(IOFT, OFTCore) returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) { + if (_sendParam.composeMsg.length > 0) { revert CannotCompose(); } + /// cast bytes32 to address + address _to = _sendParam.to.bytes32ToAddress(); + /// @dev user can cross-chain transfer to self + /// @dev whitelisted address like spice auctions can burn by setting `_to` to address(0) + // only burn TGLD on source chain + if (_to == address(0) && _sendParam.dstEid != _mintChainLzEid) { revert CommonEventsAndErrors.InvalidParam(); } + if (_to != address(0) && msg.sender != _to) { revert ITempleGold.NonTransferrable(msg.sender, _to); } + + /// @dev Applies the token transfers regarding this send() operation. + // - amountSentLD is the amount in local decimals that was ACTUALLY sent/debited from the sender. + // - amountReceivedLD is the amount in local decimals that will be received/credited to the recipient on the remote OFT instance. + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + /// @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + /// @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + /// @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + + /** + * @notice Burn and update circulating supply on source chain + * @param amount Amount to burn + */ + function burn(uint256 amount) external override onlySourceChain { + _burn(msg.sender, amount); + _updateCirculatingSupply(msg.sender, amount); + } + + /** + * @dev Internal function to handle the receive on the LayerZero endpoint. + * @param _origin The origin information. + * - srcEid: The source chain endpoint ID. + * - sender: The sender address from the src chain. + * - nonce: The nonce of the LayerZero message. + * @param _guid The unique identifier for the received LayerZero message. + * @param _message The encoded message. + * @dev _executor The address of the executor. + * @dev _extraData Additional data. + */ + function _lzReceive( + Origin calldata _origin, + bytes32 _guid, + bytes calldata _message, + address /*_executor*/, // unused in the default implementation. + bytes calldata /*_extraData*/ // unused in the default implementation. + ) internal virtual override { + /// @dev Disallow further execution on destination by ignoring composed message + if (_message.isComposed()) { revert CannotCompose(); } + + if (_message.sendTo().bytes32ToAddress() == address(0)) { + /// @dev no need to burn, that happened in source chain + // already checked destination Eid for burn case in `send` + // update circulating supply + // _origin.sender is spice auction + _updateCirculatingSupply(_origin.sender.bytes32ToAddress(), _toLD(_message.amountSD())); + } else { + /// @dev The src sending chain doesnt know the address length on this chain (potentially non-evm) + // Thus everything is bytes32() encoded in flight. + address toAddress = _message.sendTo().bytes32ToAddress(); + /// @dev Credit the amountLD to the recipient and return the ACTUAL amount the recipient received in local decimals + uint256 amountReceivedLD = _credit(toAddress, _toLD(_message.amountSD()), _origin.srcEid); + + emit OFTReceived(_guid, _origin.srcEid, toAddress, amountReceivedLD); + } + } + + function _updateCirculatingSupply(address sender, uint256 amount) private { + uint256 _totalBurnedCache = _totalBurned = _totalBurned + amount; + uint256 _circulatingSupplyCache = _circulatingSupply = _circulatingSupply - amount; + emit CirculatingSupplyUpdated(sender, amount, _circulatingSupplyCache, _totalBurnedCache); + } + + modifier onlySourceChain() { + if (block.chainid != _mintChainId) { revert WrongChain(); } + _; + } + } \ No newline at end of file diff --git a/protocol/contracts/templegold/TempleGoldAdmin.sol b/protocol/contracts/templegold/TempleGoldAdmin.sol new file mode 100644 index 000000000..979652624 --- /dev/null +++ b/protocol/contracts/templegold/TempleGoldAdmin.sol @@ -0,0 +1,138 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleGoldProxy.sol) + + +import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { ITempleGoldAdmin, IOFTCore } from "contracts/interfaces/templegold/ITempleGoldAdmin.sol"; +import { IOAppOptionsType3, EnforcedOptionParam } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import { IOAppCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppCore.sol"; +import { IOAppPreCrimeSimulator } from "@layerzerolabs/lz-evm-oapp-v2/contracts/precrime/interfaces/IOAppPreCrimeSimulator.sol"; + + +/** + * @title Temple Gold Admin + * @notice Temple Gold Admin is an admin to Temple Gold contract. + * From the setup of layerzero, `Ownable` is used for admin executions. + * Avoids a manual import to change `Ownable` to `ElevatedAccess` by using this contract for admin executions + */ +contract TempleGoldAdmin is ITempleGoldAdmin, TempleElevatedAccess { + /// @notice Temple Gold + ITempleGold public immutable override templeGold; + + constructor( + address _rescuer, + address _executor, + address _templeGold + ) TempleElevatedAccess(_rescuer, _executor) { + templeGold = ITempleGold(_templeGold); + } + + /** + * @notice Set staking proxy contract address + * @param _staking Staking proxy contract + */ + function setStaking(address _staking) external override onlyElevatedAccess { + templeGold.setStaking(_staking); + } + + /** + * @notice Set auctions Dai Gold contract address + * @param _auction contract address + */ + function setStableGoldAuction(address _auction) external override onlyElevatedAccess { + templeGold.setStableGoldAuction(_auction); + } + + /** + * @notice Set team gnosis address + * @param _gnosis Team gnosis address + */ + function setTeamGnosis(address _gnosis) external override onlyElevatedAccess { + templeGold.setTeamGnosis(_gnosis); + } + + /** + * @notice Whitelist an address to allow transfer of Temple Gold to or from + * @param _contract Contract address to whitelist + * @param _whitelist Boolean whitelist state + */ + function authorizeContract(address _contract, bool _whitelist) external override onlyElevatedAccess { + templeGold.authorizeContract(_contract, _whitelist); + } + + /** + * @notice Set distribution percentages of newly minted Temple Gold + * @param _params Distribution parameters + */ + function setDistributionParams(ITempleGold.DistributionParams memory _params) external override onlyElevatedAccess { + templeGold.setDistributionParams(_params); + } + + /** + * @notice Set vesting factor + * @param _factor Vesting factor + */ + function setVestingFactor(ITempleGold.VestingFactor memory _factor) external override onlyElevatedAccess { + templeGold.setVestingFactor(_factor); + } + + /** + * @dev Sets the message inspector address for the OFT. + * @param _msgInspector The address of the message inspector. + * + * @dev This is an optional contract that can be used to inspect both 'message' and 'options'. + * @dev Set it to address(0) to disable it, or set it to a contract address to enable it. + */ + function setMsgInspector(address _msgInspector) external virtual onlyElevatedAccess { + IOFTCore(address(templeGold)).setMsgInspector(_msgInspector); + } + + /** + * @dev Sets the preCrime contract address. + * @param _preCrime The address of the preCrime contract. + */ + function setPreCrime(address _preCrime) public virtual onlyElevatedAccess { + IOAppPreCrimeSimulator(address(templeGold)).setPreCrime(_preCrime); + } + + /** + * @notice Sets the delegate address for the OApp. + * @param _delegate The address of the delegate to be set. + * + * @dev Only elevated access of the OApp can call this function. + * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract. + */ + function setDelegate(address _delegate) public onlyElevatedAccess { + IOAppCore(address(templeGold)).setDelegate(_delegate); + } + + /** + * @notice Sets the peer address (OApp instance) for a corresponding endpoint. + * @param _eid The endpoint ID. + * @param _peer The address of the peer to be associated with the corresponding endpoint. + * + * @dev Only the owner/admin of the OApp can call this function. + * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp. + * @dev Set this to bytes32(0) to remove the peer address. + * @dev Peer is a bytes32 to accommodate non-evm chains. + */ + function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyElevatedAccess { + IOAppCore(address(templeGold)).setPeer(_eid, _peer); + } + + /** + * @dev Sets the enforced options for specific endpoint and message type combinations. + * @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options. + * + * @dev Only the owner/admin of the OApp can call this function. + * @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc. + * @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType. + * eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay + * if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose(). + */ + function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) public virtual onlyElevatedAccess { + IOAppOptionsType3(address(templeGold)).setEnforcedOptions(_enforcedOptions); + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/TempleGoldStaking.sol b/protocol/contracts/templegold/TempleGoldStaking.sol new file mode 100644 index 000000000..82c9bb1df --- /dev/null +++ b/protocol/contracts/templegold/TempleGoldStaking.sol @@ -0,0 +1,551 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleGoldStaking.sol) + + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title Temple Gold Staking + * @notice Temple Gold Staking contract. Stakers deposit Temple and claim rewards in Temple Gold. + * Temple Gold is distributed to staking contract for stakers on mint. + * Duration for distributing staking rewards is set with `setRewardDuration`. An unstake period is used + * to encourage longer staking times. + */ +contract TempleGoldStaking is ITempleGoldStaking, TempleElevatedAccess, Pausable { + using SafeERC20 for IERC20; + + /// @notice The staking token. Temple + IERC20 public immutable override stakingToken; + /// @notice Reward token. Temple Gold + IERC20 public immutable override rewardToken; + + /// @notice Distribution starter + address public override distributionStarter; + /// @notice DAO executor + address public override daoExecutor; + /// @notice Week length + uint256 constant public WEEK_LENGTH = 7 days; + /// @notice Total supply of staking token + uint256 public override totalSupply; + + /// @notice Store next reward amount for next epoch + uint256 public override nextRewardAmount; + /// @notice Duration for rewards distribution + uint256 public override rewardDuration; + /// @notice Cooldown time before next distribution of rewards + /// @dev If set to zero, rewards distribution is callable any time + uint160 public override rewardDistributionCoolDown; + /// @notice Timestamp for last reward notification + uint96 public override lastRewardNotificationTimestamp; + /// @notice Cooldown time before unstake + uint32 public override unstakeCooldown; + /// @notice Maximum unstake cooldown + uint32 constant public MAXIMUM_UNSTAKE_COOLDOWN = 30 days; + + /// @notice For use when migrating to a new staking contract if TGLD changes. + address public override migrator; + /// @notice Data struct for rewards + Reward internal rewardData; + /// @notice Staker balances + mapping(address account => uint256 balance) private _balances; + /// @notice Account vote delegates + mapping(address account => address delegate) public delegates; + /// @notice Stakers claimable rewards + mapping(address account => uint256 amount) public override claimableRewards; + /// @notice Staker reward per token paid + mapping(address account => uint256 amount) public override userRewardPerTokenPaid; + /// @notice Track voting checkpoints + mapping(address account => mapping(uint256 epoch => Checkpoint)) private _checkpoints; + /// @notice Track number of checkpoint for account + mapping(address account => uint256 number) public override numCheckpoints; + /// @notice Track stake times for accounts + mapping(address account => uint256 stakeTime) public override stakeTimes; + + constructor( + address _rescuer, + address _executor, + address _stakingToken, + address _rewardToken + ) TempleElevatedAccess(_rescuer, _executor){ + stakingToken = IERC20(_stakingToken); + rewardToken = IERC20(_rewardToken); + } + + /** + * @notice Set unstake cooldown + * @param _period Cooldown period. Zero value accepted to disable cooldown feature + */ + function setUnstakeCooldown(uint32 _period) external override onlyElevatedAccess { + if (_period > MAXIMUM_UNSTAKE_COOLDOWN) { revert CommonEventsAndErrors.InvalidParam(); } + unstakeCooldown = _period; + emit UnstakeCooldownSet(_period); + } + + /** + * @notice Set reward duration + * @param _duration Reward duration + */ + function setRewardDuration(uint256 _duration) external override onlyElevatedAccess { + // minimum reward duration + if (_duration < WEEK_LENGTH) { revert CommonEventsAndErrors.InvalidParam(); } + // only change after reward epoch ends + if (rewardData.periodFinish >= block.timestamp) { revert InvalidOperation(); } + rewardDuration = _duration; + emit RewardDurationSet(_duration); + } + + /** + * @notice Set starter of rewards distribution + * @param _starter Starter address + */ + function setDistributionStarter(address _starter) external onlyElevatedAccess { + if (_starter == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + distributionStarter = _starter; + emit DistributionStarterSet(_starter); + } + + /** + * @notice Set migrator + * @param _migrator Migrator + */ + function setMigrator(address _migrator) external override onlyElevatedAccessUntilDAO { + if (_migrator == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + migrator = _migrator; + emit MigratorSet(_migrator); + } + + /** + * @notice Set DAO executor + * @param _executor DAO executor + */ + function setDaoExecutor(address _executor) external override onlyElevatedAccessUntilDAO { + if (_executor == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + daoExecutor = _executor; + emit DAOExecutorSet(_executor); + } + + /** + * @notice Delegate votes from `msg.sender` to `delegatee` + * @param delegatee The address to delegate votes to + */ + function delegate(address delegatee) external override { + return _delegate(msg.sender, delegatee); + } + + /** + * @notice Set reward distribution cooldown + * @param _cooldown Cooldown in seconds + */ + function setRewardDistributionCoolDown(uint160 _cooldown) external override onlyElevatedAccess { + /// @dev zero cooldown is allowed + rewardDistributionCoolDown = _cooldown; + emit RewardDistributionCoolDownSet(_cooldown); + } + + /** + * @notice For migrations to a new staking contract + * 1. Withdraw `staker`s tokens to the new staking contract (the migrator) + * 2. Any existing rewards are claimed and sent directly to the `staker` + * @dev Called only from the new staking contract (the migrator). + * `setMigrator(new_staking_contract)` needs to be called first + * @param staker The staker who is being migrated to a new staking contract. + * @return Staker balance + */ + function migrateWithdraw(address staker) external override onlyMigrator returns (uint256) { + if (staker == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + uint256 stakerBalance = _balances[staker]; + _withdrawFor(staker, msg.sender, stakerBalance, true, staker); + return stakerBalance; + } + + /** + * @notice Distributed TGLD rewards minted to this contract to stakers + * @dev This starts another epoch of rewards distribution. Calculates new `rewardRate` from any left over rewards up until now + */ + function distributeRewards() external override whenNotPaused updateReward(address(0)) { + if (msg.sender != distributionStarter) { revert CommonEventsAndErrors.InvalidAccess(); } + if (totalSupply == 0) { revert NoStaker(); } + // Mint and distribute TGLD if no cooldown set + if (lastRewardNotificationTimestamp + rewardDistributionCoolDown > block.timestamp) + { revert CannotDistribute(); } + _distributeGold(); + uint256 rewardAmount = nextRewardAmount; + // revert if next reward is 0 or less than reward duration (final dust amounts) + if (rewardAmount < rewardDuration ) { revert CommonEventsAndErrors.ExpectedNonZero(); } + nextRewardAmount = 0; + _notifyReward(rewardAmount); + } + + /** + * @notice Gets the current votes balance for `account` + * @param account The address to get votes balance + * @return The number of current votes for `account` + */ + function getCurrentVotes(address account) external override view returns (uint256) { + uint256 nCheckpoints = numCheckpoints[account]; + return nCheckpoints > 0 ? _checkpoints[account][nCheckpoints - 1].votes : 0; + } + + /** + * @notice Determine the prior number of votes for an account as of a block number + * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. + * @param account The address of the account to check + * @param blockNumber The block number to get the vote balance at + * @return The number of votes the account had as of the given block + */ + function getPriorVotes(address account, uint256 blockNumber) external override view returns (uint256) { + if (blockNumber >= block.number) { revert InvalidBlockNumber(); } + + uint256 nCheckpoints = numCheckpoints[account]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (_checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { + return _checkpoints[account][nCheckpoints - 1].votes; + } + + // Next check implicit zero balance + if (_checkpoints[account][0].fromBlock > blockNumber) { + return 0; + } + + uint256 lower = 0; + uint256 upper = nCheckpoints - 1; + while (upper > lower) { + uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = _checkpoints[account][center]; + if (cp.fromBlock == blockNumber) { + return cp.votes; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return _checkpoints[account][lower].votes; + } + + /** + * @notice Stake for an account when contract is not paused + * @param amount Amount of staking token + */ + function stake(uint256 amount) external override whenNotPaused { + _stake(msg.sender, amount); + } + + /** + * @notice Private stake function. + * @param _for Staking account + * @param _amount Amount of staking token + */ + function _stake(address _for, uint256 _amount) private { + if (_amount == 0) revert CommonEventsAndErrors.ExpectedNonZero(); + + // pull tokens and apply stake + stakingToken.safeTransferFrom(msg.sender, address(this), _amount); + _applyStake(_for, _amount); + _moveDelegates(address(0), delegates[_for], _amount); + } + + /** + * @notice Withdraw staked tokens + * @param amount Amount to withdraw + * @param claimRewards Whether to claim rewards + */ + function withdraw(uint256 amount, bool claimRewards) external override whenNotPaused { + /// @dev Check here so migrationWithdraw can skip this in emergency cases + uint256 unstakeTime = stakeTimes[msg.sender] + unstakeCooldown; + if (unstakeTime > block.timestamp) { revert UnstakeCooldown(block.timestamp, unstakeTime); } + _withdrawFor(msg.sender, msg.sender, amount, claimRewards, msg.sender); + } + + /// @notice Owner can pause user swaps from occuring + function pause() external override onlyElevatedAccess { + _pause(); + } + + /// @notice Owner can unpause so user swaps can occur + function unpause() external override onlyElevatedAccess { + _unpause(); + } + + /** + * @notice Get account checkpoint data + * @param account Account + * @param epoch Epoch + * @return Checkpoint data + */ + function getCheckpoint(address account, uint256 epoch) external override view returns (Checkpoint memory) { + return _checkpoints[account][epoch]; + } + + /** + * @notice Get account staked balance + * @param account Account + * @return Staked balance of account + */ + function balanceOf(address account) public override view returns (uint256) { + return _balances[account]; + } + + /** + * @notice Get earned rewards of account + * @param account Account + * @return Earned rewards of account + */ + function earned(address account) external override view returns (uint256) { + uint256 rewardPerToken_ = _rewardPerToken(); + return _earned(account, rewardPerToken_); + } + + /** + * @notice Get Temple Gold reward per token of Temple + * @return Reward per token + */ + function rewardPerToken() external override view returns (uint256) { + return _rewardPerToken(); + } + + /** + * @notice Get finish timestamp of rewards + * @return Finish timestamp + */ + function rewardPeriodFinish() external view returns (uint40) { + return rewardData.periodFinish; + } + + /** + * @notice Get account unstake time + * @param account Account + * @return Unstake time + */ + function getAccountUnstakeTime(address account) external override view returns (uint256) { + return stakeTimes[account] == 0 ? 0 : stakeTimes[account] + unstakeCooldown; + } + + /** + * @notice Elevated access can recover tokens which are not staking or reward tokens + * @param _token Token to recover + * @param _to Recipient + * @param _amount Amount of tokens + */ + function recoverToken(address _token, address _to, uint256 _amount) external override onlyElevatedAccess { + if (_token == address(stakingToken) || _token == address(rewardToken )) + { revert CommonEventsAndErrors.InvalidAddress(); } + + IERC20(_token).safeTransfer(_to, _amount); + emit CommonEventsAndErrors.TokenRecovered(_to, _token, _amount); + } + + /** + * @notice Get rewards + * @param staker Staking account + */ + function getReward( + address staker + ) external override whenNotPaused updateReward(staker) { + _getReward(staker, staker); + } + + /** + * @notice Mint and distribute Temple Gold rewards + */ + function distributeGold() external whenNotPaused { + _distributeGold(); + } + + /** + * @notice Notify rewards distribution. Called by TempleGold contract after successful mint + * @param amount Amount minted to this contract + */ + function notifyDistribution(uint256 amount) external override { + if (msg.sender != address(rewardToken) && !isElevatedAccess(msg.sender, msg.sig)) { revert CommonEventsAndErrors.InvalidAccess(); } + /// @notice Temple Gold contract mints TGLD amount to contract before calling `notifyDistribution` + nextRewardAmount += amount; + emit GoldDistributionNotified(amount, block.timestamp); + } + + /** + * @notice Get reward data + * @return Reward data + */ + function getRewardData() external override view returns (Reward memory) { + return rewardData; + } + + function _getReward(address _staker, address _to) internal { + uint256 amount = claimableRewards[_staker]; + if (amount > 0) { + claimableRewards[_staker] = 0; + rewardToken.safeTransfer(_to, amount); + emit RewardPaid(_staker, _to, amount); + } + } + + function _withdrawFor( + address _staker, + address _to, + uint256 _amount, + bool _claimRewards, + address _rewardsTo + ) private updateReward(_staker) { + if (_amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + uint256 _balance = _balances[_staker]; + if (_amount > _balance) + { revert CommonEventsAndErrors.InsufficientBalance(address(stakingToken), _amount, _balance); } + unchecked { + _balances[_staker] = _balance - _amount; + } + totalSupply -= _amount; + _moveDelegates(delegates[_staker], address(0), _amount); + + stakingToken.safeTransfer(_to, _amount); + emit Withdrawn(_staker, _to, _amount); + + // claim reward + if (_claimRewards) { + // can call internal because user reward already updated + _getReward(_staker, _rewardsTo); + } + } + + function _earned( + address account_, + uint256 rewardPerToken_ + ) internal view returns (uint256) { + return _balances[account_] * (rewardPerToken_ - userRewardPerTokenPaid[account_]) / 1e18 + + claimableRewards[account_]; + } + + function _applyStake(address _for, uint256 _amount) internal updateReward(_for) { + totalSupply += _amount; + _balances[_for] += _amount; + stakeTimes[_for] = block.timestamp; + emit Staked(_for, _amount); + } + + function _rewardPerToken() internal view returns (uint256) { + if (totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish) { + return rewardData.rewardPerTokenStored; + } + + return + rewardData.rewardPerTokenStored + + (((_lastTimeRewardApplicable(rewardData.periodFinish) - + rewardData.lastUpdateTime) * + rewardData.rewardRate * 1e18) + / totalSupply); + } + + function _notifyReward(uint256 amount) private { + uint256 rewardDurationCache = rewardDuration; + if (block.timestamp >= rewardData.periodFinish) { + rewardData.rewardRate = uint216(amount / rewardDurationCache); + // collect dust + nextRewardAmount = amount - (rewardData.rewardRate * rewardDurationCache); + } else { + uint256 remaining = uint256(rewardData.periodFinish) - block.timestamp; + uint256 leftover = remaining * rewardData.rewardRate; + rewardData.rewardRate = uint216((amount + leftover) / rewardDurationCache); + // collect dust + nextRewardAmount = (amount + leftover) - (rewardData.rewardRate * rewardDurationCache); + } + rewardData.lastUpdateTime = uint40(block.timestamp); + rewardData.periodFinish = uint40(block.timestamp + rewardDurationCache); + // update reward notification timestamp + lastRewardNotificationTimestamp = uint32(block.timestamp); + } + + function _lastTimeRewardApplicable(uint256 _finishTime) internal view returns (uint256) { + if (_finishTime < block.timestamp) { + return _finishTime; + } + return block.timestamp; + } + + function _distributeGold() internal { + /// @dev no op silent fail if nothing to distribute + ITempleGold(address(rewardToken)).mint(); + } + + function _delegate(address delegator, address delegatee) internal { + address currentDelegate = delegates[delegator]; + uint256 delegatorBalance = _balances[delegator]; + delegates[delegator] = delegatee; + + emit DelegateChanged(delegator, currentDelegate, delegatee); + _moveDelegates(currentDelegate, delegatee, delegatorBalance); + } + + function _moveDelegates( + address srcRep, + address dstRep, + uint256 amount + ) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) { + uint256 srcRepNum = numCheckpoints[srcRep]; + uint256 srcRepOld = srcRepNum > 0 ? _checkpoints[srcRep][srcRepNum - 1].votes : 0; + uint256 srcRepNew = srcRepOld - amount; + _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); + } + + if (dstRep != address(0)) { + uint256 dstRepNum = numCheckpoints[dstRep]; + uint256 dstRepOld = dstRepNum > 0 ? _checkpoints[dstRep][dstRepNum - 1].votes : 0; + uint256 dstRepNew = dstRepOld + amount; + _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); + } + } + } + + function _writeCheckpoint( + address delegatee, + uint256 nCheckpoints, + uint256 oldVotes, + uint256 newVotes + ) internal { + if (nCheckpoints > 0 && _checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number) { + _checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; + } else { + _checkpoints[delegatee][nCheckpoints] = Checkpoint(block.number, newVotes); + numCheckpoints[delegatee] = nCheckpoints + 1; + } + emit DelegateVotesChanged(delegatee, oldVotes, newVotes); + } + + modifier updateReward(address _account) { + { + uint216 rewardPerTokenCached = rewardData.rewardPerTokenStored = uint216(_rewardPerToken()); + rewardData.lastUpdateTime = uint40(_lastTimeRewardApplicable(rewardData.periodFinish)); + if (_account != address(0)) { + claimableRewards[_account] = _earned(_account, rewardPerTokenCached); + userRewardPerTokenPaid[_account] = uint256(rewardPerTokenCached); + } + } + _; + } + + modifier onlyMigrator() { + if (msg.sender != migrator) { revert CommonEventsAndErrors.InvalidAccess(); } + _; + } + + modifier onlyElevatedAccessUntilDAO() { + if (daoExecutor == address(0)) { + if (!isElevatedAccess(msg.sender, msg.sig)) revert CommonEventsAndErrors.InvalidAccess(); + } else if(msg.sender != daoExecutor) { + revert CommonEventsAndErrors.InvalidAccess(); + } + _; + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/TempleTeleporter.sol b/protocol/contracts/templegold/TempleTeleporter.sol new file mode 100644 index 000000000..2a55deb65 --- /dev/null +++ b/protocol/contracts/templegold/TempleTeleporter.sol @@ -0,0 +1,110 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// Temple (templegold/TempleTeleporter.sol) + + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { ITempleERC20Token } from "contracts/interfaces/core/ITempleERC20Token.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { OApp } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; +import { MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppReceiver.sol"; +import { ITempleTeleporter } from "contracts/interfaces/templegold/ITempleTeleporter.sol"; +import { OFTMsgCodec } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/OFTMsgCodec.sol"; + +/** + * @title Temple Teleporter + * @notice Temple Teleporter transfers Temple token cross-chain with layer zero integration. + */ +contract TempleTeleporter is ITempleTeleporter, OApp { + using OFTMsgCodec for address; + + /// @notice Temple token + ITempleERC20Token public immutable override temple; + + constructor( + address _executor, + address _temple, + address _endpoint + ) Ownable(_executor) OApp(_endpoint, _executor){ + temple = ITempleERC20Token(_temple); + } + + /** + * @notice Teleport temple tokens cross chain + * Enough msg.value needs to be sent through to cover completing execution and the transfer by endpoint and on the destination chain. + * This value can be estimated via the `quote()` function. + * @dev Temple tokens are burned from source chain and minted on destination chain + * @param dstEid Destination chain id + * @param to Recipient + * @param amount Amount of tokens + * @param options LZ extra options + */ + function teleport( + uint32 dstEid, + address to, + uint256 amount, + bytes calldata options + ) external payable override returns(MessagingReceipt memory receipt) { + if (amount == 0) { revert CommonEventsAndErrors.ExpectedNonZero(); } + if (to == address(0)) { revert CommonEventsAndErrors.InvalidAddress(); } + // Encodes the message before invoking _lzSend. + bytes memory _payload = abi.encode(to.addressToBytes32(), amount); + // debit + temple.burnFrom(msg.sender, amount); + emit TempleTeleported(dstEid, msg.sender, to, amount); + + receipt = _lzSend(dstEid, _payload, options, MessagingFee(msg.value, 0), payable(msg.sender)); + } + + /** + * @dev External function to interact with the LayerZero EndpointV2.quote() for fee calculation. + * @param _dstEid The destination endpoint ID. + * @param _message The message payload. + * @param _options Additional options for the message. + * @return fee The calculated MessagingFee for the message. + * - nativeFee: The native fee for the message. + * - lzTokenFee: The LZ token fee for the message. + */ + function quote( + uint32 _dstEid, + bytes memory _message, + bytes memory _options + ) external view returns (MessagingFee memory fee) { + return _quote(_dstEid, _message, _options, false); + } + + /** + * @dev External function to interact with the LayerZero EndpointV2.quote() for fee calculation. + * @param _dstEid The destination endpoint ID. + * @param _to Recipient + * @param _amount Amount to send + * @param _options Additional options for the message. + * @return fee The calculated MessagingFee for the message. + * - nativeFee: The native fee for the message. + * - lzTokenFee: The LZ token fee for the message. + */ + function quote( + uint32 _dstEid, + address _to, + uint256 _amount, + bytes memory _options + ) external view returns (MessagingFee memory fee) { + return _quote(_dstEid, abi.encodePacked(_to.addressToBytes32(), _amount), _options, false); + } + + /// @dev Called when data is received from the protocol. It overrides the equivalent function in the parent contract. + /// Protocol messages are defined as packets, comprised of the following parameters. + /// @param _payload Encoded message. + function _lzReceive( + Origin calldata /*_origin*/, + bytes32 /*_guid*/, + bytes calldata _payload, + address /*_executor,*/, // Executor address as specified by the OApp. + bytes calldata /*_extraData */ // Any extra data or options to trigger on receipt. + ) internal override { + // Decode the payload to get the message + (address _recipient, uint256 _amount) = abi.decode(_payload, (address, uint256)); + temple.mint(_recipient, _amount); + } +} \ No newline at end of file diff --git a/protocol/contracts/templegold/docs/high-level.jpeg b/protocol/contracts/templegold/docs/high-level.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7b2ed2a612d4782c7d779e485b1d5430d1c19ee8 GIT binary patch literal 2376304 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 z

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±Bj~>p-!deo3XBZ9Ez{^ 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�mC=9riieM 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⩔2c+}X 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

  • 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 z
    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⁡7WBWIs0Rw1UIRR@+eI7Xnf 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Π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%0DabI)fpnZ3y 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%0Ao_d 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%0DOWhxx)f>S^t#sU`r$vh*VA1xMsAOTVYtmA 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�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�~jf7#sFJ>k=AG=h1wx4G5{rf45NhsW?xtkn?`GK>Nwd9>J=881^iKopMXNn z88eSgZ-{K4e7{Fw|KK@00)4ahIai+ncIFO@)PJ7bSeX47>B)jhnu>23wlq|4MYhy2 zqGmtYG0>m6qfeHjR`dn;--})09oynI#rC>);vvum#y7k(0J$VB8~6qCzi{l zMxx+%+tdPl0>U~BGck9U>xQ`v`vm7{Ul!7H3qo~96UOFdnEphg&S!ht)M{YW-*$3d za`gc5nmP{F2#U&Qcye%PtqCBMK zt885;b5ps|?VNxxOr|xQiMHMFxad(sIdKrS%0GO0U}9uR&Jy#j?7 zh!_Ly;rf&$oD|XR-NgH8)!{4s+Q(vgJ%Y@6h0MEf`GB%r zFqU;5Eyl^gkbpe88z`h=uaQCVdOK`I1g#eHFHcr77Z_#tKtkNjP4&|Pag>Qk~xnsM?s7b~q=JzF#D0C{|>KIUo2>=gSkU$=Z*g$MD!tEod2J^@A zf;d4eeQ_!$e%cV&FArF7A8J_nZiH?`*s37r;a8?ig-gv1e}pDKI(36E-?1+*D)!e#FFD0paRCMY1&&@Rumh~B_TQi33K`eWN*^{Y6q< zGUmNH>WB(J%2&V~&_U;~FFGX|t=Am*0Zd|}zzIyk!zfxXwdMHNOMUfa8ixpQXVV(=T}mMATk@iWt@3=L%lg_fhR zy>2Q~)lI|%j8MpCg!!GIeyQrzj^??C=O)I`Ql|02I_ePl51JC&5OKI(94^FgpIcIn zSajujl1&qJ7ZaUERL3-9RprEw!BFU0l^$47&(edbj6$afvpGAuW13r)f;U{DsazO z5kby{ZBNj1=q^AO@Weh@P=$g>fj$6z^kh`h7q^}QL-K^#&{-~&mh%h`uVMg&Q%O(i!?l6pz2(UsPzIz7Vsi9;cX?3AUUzYW;G z*N~YP%CzqtvhKBtaisxz1>swIXjCT%CI^f8}2xqMpS9%vc^+vH8P zVO>KFGuk;Xzd4>u?rL96R#gwK6-1pgM=eOJ%nKU*;JHH=WmJ}}3t5D6e%}cxU2{I) z9y?9N#}S)f)z7GPa4*x#S3c_+om^Uwc=yQkq=$lHde2gYaWmwSjj!Fs=}I^#7H^Ur zDiP_WW`{Yycr)*#KE(TNz}*he{+x7VDT*m-$voCawy768QL+P zz`T!~`K8~lHan*L(ZBfIQ)28^u;ksxM}Tml!sdat{(m&Q2f~HO%K2|cu6^}Z{*_DX zQm*1Vx-22HhuAq_>pZdNT>gk1!@_5aE*Aui@VNdrW6}RJW%*CY_CWefGl0{>%jqV5 zSNK(K@IMBL@y4>R{NQ=M$mzi_xW5}(|0i73|Ir|aze@-BGrvJ!P;`t6qX?~(zu2O6 ztd_A`7}Tk!NY{{q+?KP^j~q0Q&;|bi>fvudn-9zulV2ik`P0d(j3|0&H#EgfkM2*5 z4+aV0R)41&Tnxj1o<~K`L<~pxJqUpct#Q}BM9fKj%N4pqWLyCg#P?}h^C?Cu`^Ly^vg!h2Af%hMSLA<&4T@=3= z+x6*{o(hd*J7FIMy}IlPOYZt!F8hW&4a!Y*VE|2@ZqIHgdwO;n(_0q^;)uCQ0-X}n z4%gFQjG531Iuuy}Q1Sp!TOE2m>MEw|R{*5R&q*`j12o8M-$73Ybcj<%R7iws@1@EU znmQdwoMP{Yk*qnaY1)5Z&3PCWw_}kMl5Cfz2D6eG+I%?6e-t|mxJal@CNOt2mQ=;O zbFPDPW=0-Ny;n9DQYADD`3`0KjAturslY_N#MWBO+^z;$g@aAg$f{S5D)g*|ykW*) z7doj)F;>p2J(iS|B{GGVP!yqRmhR83t{MZqlU{JcLBkyj;(hpBiVwm|oLUZvXN$~u z!gmQDkU3wOU21t#E>UdD`;I3O9U2MTz{C7QNT7BjLnXNtIv>Q+G9w2avzc4W{j?i- za|Dk4vb_A507w~)00s!A!);;2`aL)Epr8mnnT}?n7N@h?9~t3Nei+G;iCV-ogi^;y zoes`SX>#PvCZgbgHzb(=MiFlzK+L`FXB&d&KEcb^1Mh4&dvRiWZqRG$NY&nM?`BX1EmG@FQ>juDvC04k(@guiczlnC z3=~za_ay(YDmUTr`@^i&-z(L_U2B@98Y7F&rE49yzQifP)Mr+4dVeFfFOL+Db7wHk zwOij=BFuBM{fn|}k6;WnQQeeO z4<24|^cj{{b7f7`@M5FfGup&1fV)6#2$B5Oz2I8pg?883!zanA8xG%_n-?IhAzm4p zVRv{ipM4|6TAzLzO#`Rsco6(8u?D;Ak&g>(mMupceWq((?Ub(mk>op4T7;DapLt|3 z6rxepFX03mKHZs>KeKo=>+WK3B~%65f@qkf%F>XG*G#|HXeXvL#T+EX)V3;e;j2-j zv^GpNTKLXMhwXGg$!cw|en={DWhYMFD{PN9Nrfrk84{Oz-SRHI^(Dtd3 z%6lC*e=pCatlzXvIZv_9kq7C*H0h4c-jK~sY<&iHyIlG;<$O(EMu(RqG!Emp$W)1c2l|8{J2FK}P;fGM zU?+_pnYDoxj1u;_SOzCiBJip9GqbMKc!lHDMp%W;wed!M*-)#d20(n#TF_7qr2oy5 zmu8;WI(+d5k7Fg}F+qwn7{rp9*Q;7L72VokNsfVx^;ie)~PKsPE)+}UbO8^>u*7N=Ee8#uWJ^?8m7Ky)lLZA0^sn+erFzG!Pyqc zOAd)_S-Jotlu3y=|6z@Alv(F~tdN+fPWqz;Y&Nd-=g8X{!nwF*%6Jn;{#qMRNYz>2 zH#A_T&aa<)oUVPs3zR@ZZ8aq6gy*HyN#>Ya+vJ=%ldD{t&_lRKo6QpLb+075TT*8k zmtX;pqcn#1T&>^Pl>lJxU4NS%%DGn+jkSaPNsArzPhx+wdE8Vy`VH|4A#HROt-&cI zNTTo*-hPnCCnofr5vaku)6?;-*|tn)FWu>*&s<1sfz6_C9-%zaurn?f_t9l6EF#R{ zc8}1Y%0VcI#zpq&5r^^zTNbu-aE66j7TW?t~ z3!1f>3rh*@l59%*!Sk^&mR=9xVAXMA@iJAnO!Otu_j9XNv0f;Tf@8=vg>N2X2l6p! z_wGP4-)+X?$Bf!UMq&ii2kBdGa6M^SFPUe(tR_TJmLSeOr+$39mSKONri{kA-o_8p zAF~Y>Mp+RxM6EB?L5!WHmVRs;q7l*q7ht`R`9@(gzexOs znD{f74JrHD*KR$AY2~FGz@9sd+&VM=xl1N7iHjcFJ-HaW_wc@H(cOx>R}2Ji@-xHJ zG$sHhmwoncy4KakO}ZvHsVTf(h|iElOrH0byLBI32L#L|pH@pT!^c-*fBW)~sx+hl zyIpX;z?)A&X;5>*yWAlyq)2FKXAZdp?FFUC=`xQkEhg$+AkyPW)!8#R3ic51-=ymFS5@GZQQ;Hc*ZZ9F-&&Ni4|QK768as6*F1ct`bi$kh*Mby z>n0j8E}4N=6Lx1CGnu(Bw)gkqUy2-|06ZqH#u~I?tP7clk!D-rHV$Xwxe_RITl$mg z(lwR)bEC!HxZd*_vzAh^)2X?0UVrj2@>|cz@sCgM^rsSedq3m~+Fo-&B`<@=wBe9tEt zQ4592gk@FNUyOVMIbXeoQFCzBk}D+z%OBB0v3gnM9+9;QdL4ubqyA3kGb>-SN~+2M zbJOjn2>p_^p##r}e^5lwcIIp-1M$%N&_A$3Tm$CY-)8m!r8%_L__FO7jh8zO)z-y27j!h1=AJ))koW0M&B-yaxyn0_ApQ@9Fh}R8iAT6$Dj-cEZJKA5 zx}(sM6N~utl<@~`mI|kVNs9wJyld^N@g3T9u*Fo9A;g5P^hRnq#rZz55*6jRe+0MS zEB2F_dT`=O`quZ%+GnaRFYYZQqY*ti1VQqx$+)_YDMl*d*>*TsvpgTwsMgx<&D3S9 z;LgU2Q}wZ^zCB~e3;jDzP1*M~8y*q`pIgPkg6l4474ri(Qdv~dV(&4`YC*8lY;D#$ zm+DEMwBzJKy^%=>*QgpGh6?#wt?MPPFUU=3nJ+gK%x~#EayT_kUbr~O3=+zBuZKC+oC{WXK_=r(Pm$uQ z-GpqHonw4wdq=Y#wK`iiDL9C_r5d63TniS#2DNH^6jEGyN{&=sUeAQTC2sYE_WKfT z2^;GWUo&IZMv|`6#{mw2e0l&3<>q=A{!AbGo((gk8m&yAQ{yTF1D84j$mXA_5Wmef zSqM<)o)lljmX4LJg@2elUi%6$^4hU;G(Q4)HueLqcb>i@V6#L}8EN%R^NAnzS#DD5 z*I^sj=}g(trUH#dtCgm!r5p>OO@O3#V6~NTwXXWT9f^Lk7v|c-m)c_9Om>?KNwyf5 zJP!O?4jf~dDKh0_xkUv9@~A&k2_k)KAw0-ICx@XWF(46PM0xuH*lprV3 z67+X^OmnsOSJF#PVRDuoW$Znldj!EMLD5~e%M<$?f|*Y*R$EyY1Ku@O z-PwBC=S##N7+Z&57#rNXb@L=7;iIa_g(g)%nfgI{cBQ4}dYAdpq?j=L)e`9;tE9Kn zjV<2WJ8T0*#u-57q7Ml6v~O%+cDlTe(E;kyOLS>&f}1KZ-9GO9gXjIgBBm;gmvgF~ z$X4(9!L!@5l+J{tQeWc$YzJi~MAm3UU|!${Pa=^Y@~~E|)U3LOs$N^O+T7NXr!lB1 z+;h%cB%x1E+ur)xaiZDbRhvSHsFHOhpG`SjX|#MQW-^7OV-w@ecXION-Z7+nI7~G3HICa#RntuHnitJ5CnHJLkT~PZjAgMyC~? z7x3^%o~Q9%AYP(NY6CV{3YBQ@K0bxFnEB_FwO!D`>90hF(lBQKR3cNFr8&0b16^8L zOsZz7yFRE#U&!r}1Bh|4c?QR6pyOJ-P{9se@swjPC*9QaT(p><+XWEM#WseyXPVze z+~oUe4*G@{Grf#3xs}g(lp0cKdI>#sQo{t$<8>#?Hu_A8UQv zCUnJ`%~A~pC$ti`@Vqg>Dv^F0)ClP+HHd$J%gx%_2qQl?qZ!89^kO{s=W*y#34-PV zofF%m*rmu_WZldoGy@RO+Ap78jm=$oW3pgXj*YTRJ)MwIyUw@O*lp1HVGRq*{> zv(E9FrCfO1WYOYjt*n`y0FR%bkOw~zpFLs%;$`CI;MhKoOCLA1a?Yh`#QFkGCUru& zdexR43Q}(>a68J+GIFoBv>j%{G%F^urLxwiN_6ysa5^To%g3uoN}6PfzpisrJNWtH z8!THGX~T&Hy!t*AU7|tylKrnQiTB$W&c;XagFqX9`+@>n)zLwW_?Tt63!QX1oLD6| zz5`m0itmA|_}G6x#C4A528KRCSgL4m668^}roC>`q?A*h8Kb#pz8bvg10D;f5~cf^ z74DHaT9MX8Vwtb#j(Lu*&PmnE!Cw61F>3bogNIM!y#D67C-o8SoP$Vxi~oZWWEoRp zlb6h>uT;>oEU2(XK7*NcwMDcaI&1;T0Y7guF)USfD5nJTAi=<|7HtMlns1<@SuTWW z1Dn$IC$nyXPo3!S1hflTP5v68!AJdm{cMx0i4#_mtGvwYn{p>jYMU=jIsq9V=j1FOFx9E6wel(Us`>)rltj- z^Xnp>{>DKL%q_;yzj~ z=L$kDTRh%&CQ6kJaATsQqWYh-7p~-!YEuwmRXgb0IXk;|Hr&qB<712@P{!X(c3pm* zd~lT@Pp^8GSaVf>W4uADEPf;xQj#hqseX-&l(WoIChw|d;0&ZQW<=gRmwAFr!w2Kl zU2oCa!qIi@wsM&(jehBPgZujNk8kRlWYizd59kr*9OJEgmz7i7Ab<3=>g*cXd^3&iHUKjs zdL|BY-yF6~A2`%A3_6nX(!FGh);A+IqIfV}ydnMwl4;)$9;Om#%M;Kk_l=TfUZF?t zvbtX_zvA>47o!^bh$jsYk!OWWf5Eym(Q2a=p50dHu=bhM>ypV;cR56?gH7T>o-w@# z-jo1ZFGhc^Pxe1n+_COmdgDYmo`)WJOj=EOelhS)1M4cIX<;=FreOClYCuPqjUe}IS zBb+71?;oSxh#Sjy##M#D+TTr`H&!N+HJ{KUPwaapv6@KB=3nl%19b1 zMr?%P>rpdwq2%b7b-wnM&?wu+@Fpg~?vx_hs=$=j0piqNVzW6}ft~gO`Ngf+Iy3~Z zxkC#ZR3wmcqSPmTZ=dLu`3=svK8RBp-n=ED6BltI?b7Z|X zF=1Yqh-dQXKFDC;Oe)yBT+o9 zoKmg|6T%2)Cer4AZ2~ZK>15t+gn*+eL6HWJlfBg*JMt}0vT^Fn{I9V+hz%)7B0G?i z?k|#8Q+sSB+pGLe&!Lz@57yL3^*yEgg*r6pamTzcv|{M{+tC;})iWCl!gP}q%R(|( z&=-kJSkAR1#x4wfGyQ2}&agkfs?YytsT3AJuUa` zDV+X;&-ZF2or1dheH6~8W1)Ak^B@vv3l5wvZk(bhb++@==!dAQJ_JEPBS#fV%LLd^ zeHQdR^5>Z-85*Y%&+`TjwVU=vY;i!APRJcZ!rj(G0sZIzL1|C}1|+}zPzP{Y z1#bUV!|_(X^QpJ&FZeYbJQz=Av?kSPuGc16?J+UBU0>0{xt^B+%Kgi=@e;Alnsc>` zxXb<7n%sjCRwE_M{1wKP+XWRTJ|re01UtN0w%j=>>{FvN?DMmlk$(Lc!KgFqgfkY} zjcq7YEE}qcT!`~@I+nkk!9WHqfb%% zIZ(Y(+CGhWa$dhOHROTk6*Cy7oIJ!h&vAeh^&_T$q*Pe8!qblZPTv~43ODRz_Fn0^k5~U6+@&{+&Mh5jJ za~5ITUJUIvA}#MbRgql#5z1Jnfnw1|SmtX|sztxh9Fhz`Dz#4u7uRyyVVf-%eI9&o zj}fTEg4D(mRrdwu)-^}2!zY_q(qE)|q=@ma>!yt0z2K9rL4w`Sp+aoE_jNC@d>(-U z0?+U6{amDfq1Uoy`sJ#YWmX}mT8E@;UCZm7?cC~{wMky{D6!5he-zs;vIx_A%L-##JN6n+zh-$_Ys6lh49pz`i~VIz*Bl=Q)Jvs+10ZM% zNkfpn#~DE^d`Lvl+7F(e45UL|x%fQMGffRi=R>Q~qsjqPYa-#Y1;V@|{T)G^#we#B zwI}>mqvqAwc}L)88hMs_jsdC|L|<5vLBz^j83^Ngr~FAVu)jbQqL2~_eY1BDB|cM* zngRozJN#1%o+*7+!%8**S5ozm!U=&`#fID$$z=3)uJC_|kRb`~ z<4uNsq_q5i)Z%FR7hi^yTFVp}I0S}LBRlI@MtHwU+T$8O9utVGW?jUQH4Y>GD*{X7-IbiQ0RkAm$v zCgxol7x)+)2C>RhT^d*|yI`iX*NM=49`)rX0!_M!JkTo&4PYKWem|=TvIxl%8r=^b0R_N8K8oTiRit0r0;#8gJ0nQ{N z+A&)m1)`c1G%-p$YKVbpfWE^-OSu6pXk>T0Y482F zvmuMZch*5j!!M0R_foRjeg9^&oPhC5$Spk#ybx|$C)1wuj*xJi+!P2VwLW-ryw zO){R)!Ci=C@QIFJ4fI3El?Z-Rz8TYruBW5kBnY`ppxtk%03!d|_wb_BGM|*ZUT1J( zNGJGq(^T*mziX{70xz~27l%4-FKr8vDh@26(XDs^?ANvh@y**^W709z1zx9a!`n+*a{3YSEAHBucRPOdryf$1bcL4rhJ#)jPhG}s3~h?`>Nw~JXGxZNpFBccD2Xd zJtWWI^Yi8#GMJ!=>3KbH7bB zXZ>nOa`zbjt}5&72=jaT6$2Biu1^LPR?$5~PnS#8X4mY?sfBuzj^QDdR^7L8aU~8y zX#=)7QYq_GuShNd3S`#+0om9=ja!BW_Wns$nX9g}Vm?HMLDFrv39FQiQ9DJc;0JxS zd0E~lAoB=h14VfBOSA$fm2i~_WvtN<-2g}CWE6zyHqaez+Pf3|`q*@o7-}vu$aJdF z91QmP0QfIypb!Xuqewv9!%&&@u<6q`CbT)gnL7q=gA$oV$HALnx zPFOg$-`dta>D@e*@6PBMyvz-2yf~~RIbQGSav8a8QPblGj|+4u9lV>G4v;$f-~fJg zW0>9)rAWcE3!^Uo;Cb^|oLix>x5>Q1HA}&BJM94hXhibOZOX}F9VRK$!5??L=%tj?lqZ!)diP`$m7eLb}{_ui*C{gdQM(pvds zP*QjZ_UkC)lr%xkRcOo$l`N)=)m z`91Q9f;5k-)-)yy-XGjIMEpu%Sw0PmEFXTw%15nwK>XE?>f%d0cw_Uj3XXEi+ro z{xaTP%S+$5loNG^Y+(PmuGL^DM(Ms&$W8vC0#|vRJB==-P`lF zXep(Y?v?H@D<&Qnh-6)I%zO5|d`Q^7KpyhM+|N)weYTeQ_y-SL_zE{Q0)Tq=WYU3Q zLXlzAF94x*ua9`Bs)8Zm&jLm@Rt&@j94NUyRDhXwsXusDGP|HloqAqrz$O0td8*N0 z{j)P5?A42j3BOI9h4Yl0nC{c=v{v!l14eMGP#ZG-teh zJAS??6sm^?PW+!0Xqeuyk4RvACSxSUzQ^neqhkja8{mILsiH#P=~eH0F9oD>&=ALc;TCDVq`*Wc?zT>bO0 zUf3y@z87icN$<-h`>OhL1pY7f-UFzqHCz|g?N$VYh=LS>Y^8&MDBVc5x&a9S(xpZ~ zdT$aS5S8AQE_EY>5PI(rAru7>>C#CMkR}Nw22%FF_PH~6{yFE~|G#r)&OK-5>|tOM z2(wnQzVBV{`@GNlJS;i(H@QBEN!d$inPRo_6iinIqyU343}D~m*z9FT&~*s& zUCu@^qf?FhxT}ZnFnuKAqta#-1#BXq$$ojB#9%XwyqW#TRMiNRJ&xU}64aO052#Zl z2L_jrvdbQ$nGsNH~aN_n@X~2SAl$w>FQ|l;Mw(KMcdn4J&*Br{?4hKvm3 z{Qwbk2kr&5_)e;>+5DJTMTp3e^0;2hvnIgr+NycD3E&+;k@K54)c1NcB-&E?#;E>UEn{}g2F=>w_$%{$>Yrcw2TEG)O5kU*6pAc( zhZ)96NU0Ik%h9Sq(9aDwL>2NLNV^sMjx~+8i-_ojm8y0XdN|oZJbGxFP z*ge53;P*nJbYlPykz=>HN@&3^3Vd+ir`~OvR?Z1Z=rly**MnQ+K8;hY@Ilg?b-uim z-FJgVf^86P}K%v_yI?BWLRa3|1eeq`i zU6)3~C$WlFcOGsO^3Y9?&JcM{5=F>Sko9$Yz%7sZ^t&n3Ou%~RyF;DH3~7~3C7S*G zA>JrAL*L_%b)wH82kMztDO3nr<@{vHl}Nsn1+Ayln@VWqbx-&=RGBkvb;PdTmj*yU zRF7X#D^-tXi0V;+x-G(%ERYtP`tcIvU!SLE6Jb_`U~=5T}yU}|7E#`;#owF zl`0|H)!Id+Er~3kvWe0T)>a2#CZ5(?>8YRmturfY1Lorc9kLyRlTD2bJCf67CVQom zjS|hLUALN?N6AD4WG31_Sp2)4?;BG~gT(*^RpcY%Ws6=VYa>184_ocSAc=U08gDds zAfCD>4uE68DoQPZ?;J38xk zK+|`hPfJ@`?`jL|O4(pxp0~{c^Fm#5R7s#qVQ1&=3wp&AqnmXZT(H%~l(F1(#e=@Zn<`7Znfv^a{=X{?YbvCU2cxD?4>1?gB9YQ7?P-a1$NGADL;}B- ze)=tXgWQm-UgMl^jb(xCeZx-2qu`G3HOH9KaQ+-$IdAT%3ubb*9~)f5I$qvVQWSFSt` z0XTkUh}VU5T})I8hEi}Aj$X0=khBKc+v7qI;OQCKS4aU_0ghNV#SQ4((V^h;s2-rt zyOO5?p++P?qk}ZAl7wHPx7rhKgebKnd4x+NwG$U02QS^-0+NjTmqGGJ?6X3bh8B0_ zeuzd(ni=Av46(_iGyRV`ZZOt8FW5T9RcWPqb?%?MRW>;`ao8K3AM0^S-!#@~Pcx1* z$;%Om%X1+Qa@Z?q{NNeKPeiVj@F0j}^~LXP5>^~iI-A@Ro?`wdr>P7g_&n8M#d$#f z5`wZdFxq3Of(HvOBTB_tBcLoUlJS;@3QJ=FvE%>~gfrcs!aN-kcWbZCux;gvuTYeIUU z?yx&NrjS!H$-%JJ`S@9F7+k+lZ;|)MKr!0wAu1%*nFi`B2Y9~^mpP;!r;Eko?e;C7 zENSINZoFM@`fgN~ImN?PSK(Y!U!}7%1~8BBS0Y$q9Tlh4GZa#b19nAgzq;rf?g=AW zH!+H$Ep5k(z^0qspu8oab~0$vsGj=}!%~F9YRk?%2~NDyR*DE+@s2fHH5sGJkWNO4 zl&-+)EvDF5QT*J8@8OEnHu;2rDkoPhOxf>y1f8P@EW&j+pzHFHU=X)Y=AES0QM{m# z2b|N_7L`HRwr@>fAJ*!=eH;6RP!wGh*#|Sm9wp*LpGbd2)HuL&92_3Z+D~rVYxpHw z}Wx zG$yMR?H(OYWiQt)ch!I}a+ne}n)dvct;c?NAZ4+rUgwn&zwyOtjS(V;+|shynD@?` zl2^M!dJew6rOOt}dUPwi;GM)36u+v22oa`G43{N-ddG>*#m_`Na+EJ~ART1MYX~%A z9&o{mVUNv|9u8EgO{8qUP1Z>E?+s4AEuWjG!0#kg_SdQ5531u?Ek%Yhb0wGZ#Dt8O zWCsk>=s?5ol|}d{yahY}{<_g4{2L<=xAN{e{A?!+8j&)X!?E1!4u1u-E*%G7AvHk> zN_zUtWh3(0-M*lcq$Qkd`R0;r+}>jyce|R|O;Vb>^V#stRbFmH@EhN0yJ%t!d%5#* zhKHP0Ty!9WcJ)=VT~sDpl7JsN8pErfesiMO{MRWJ*Gardg?xBPN+RJ=hsMCSMrp@R z9YIcE9$)Syj;Aiu0n*YFdFkak2Rf6+Nsc3pZdx)Ai?{b;pn!W=!Zf^Pk#kYcBSZd!yByf zVGF}zotoFE$eBKRGA6oH6OWW7guA|e#=q!3`DxlNVQ|glwwSrRe}(!H$r!VHd^6iJ zd`Pw2>lVeRKCQDWPleM#q)+t%{uc3(@*Sawn2zWGsmFbzoU1mHWyY20k0DL)+ZdT@ z$52_w-U=J`uTwx6a`!X2RCw0jQS=wn6g=?B1xelIoOb-sGxtgTvMuIP%U`E1HT7r& z(+oyXZoYSB*3*u(m2LhyB_W~;;9>w$RyOPV9ZK@Mgk{7qd6dUm!>7W}KmL04RZFjY zvRJzCp9-2cSbi-}`{FQsBCP@>{_JWt(8*6d^XTay{4}kaNeMt?{dMa44GBh48EQ)y z!Wg9L0ixqIghEEzU#HHYw$w^z4n7A07G-(!%mHALFkt0j>z5f5K)nDM%pEQm^nj^q z%4(n;3`y>Bvc19Fr6rZuQVNx+NLBKLRw8w-=6b)(^;Gur-=xoL4IXBVY1SN##!gKw zU(i8^Sz1(E=juLBOVvAU@BU7w^(`NBKLs1?@=ytN;BU;;pWwdkTO@SL&d+KD)BB>U z&PoaOE{fPdOlkh(LJ0v<#}RP(h}43r=1rkYcw4v`qW=jz(yI~?w{K3 zX4U#{7+I>e(mqyA53c;AU)^+FS$se_!$2!8$EI#_A=pi+YpeMZ1D-WoT$}3GNCOq5 zAVOwgwPyL2-@@#mgPlgczc0tggw1@g!o$xEeeYG7$tQXM^}nzBaz#e@{--k14>!}jxICb%Fe&#Dj<`neIjiy2&RF5=t<(;iyC-p9I#M@+A(fe0w?*@z< z^FmHOU{P!1;bc`YSvang4kLkLn>y42YN*rcekpB%i;S%>Sw@iWHWa-o>xaa*_ zrj^rIftj3Nonr}dqL>>zu0uXW7QM|vL$`cVDUGXf_{lu$yLsi(+}{?0#b@LSCTO7W zMO@>|t{5Py^@hgJ{IYb3#LS`@BiX58Ertn}pja*_(?J9!}jNoe%c=cIEj zcElv@KU&9|3_v4}CEIgmMcqQ+N4c<^4P!u$^J1qOK@PY*8mb;dkz30bg!(KBER3o_ z3TgQsVp22+(h=q#DKiW*X3^ymnDkY^T5(urplvJNwYWp;0fMXICt$X={?R~^>iX9U z8sZ97G1j#ek_V67bX3k7DLJyRPWVPW)O~obr;Q2dANL4_pJRSS@oAh!Y9>&e86C1v zr(KoaWnQK8NJmm7QiL>ijAEhkGoYwwoIAG5xh3hBrNP9hToqCd!n$VG~ zo)%iX)_VJN-s&wnZ0O)9Q!DcpKwjAjs2D8>!1~RkmrkaZz1!@+d%0M&*?CF$7O+^n znO~Sv3^dLWca;gWYDmW3F$H(Yz^pDbHe8Ur+&g*}u&Y{*>f~DG2$|6&W1@~2&W}h< z$yr3kRii0rQw{P?>DS!s!(AJX>PPmfc-x?*SZJS^6@mad*2a3pA(> zn9V|VZzcXKcUvhms@E$w#a1AVy`+CwGJ$B>^Ng-dfN}y4RH3elWRGTh`HL>$yrlJ) z&OvL9IWY-JAVGwiH>lr%eNZZAzjuF><`e9?ZaMF&qQZQ}>hhB-++anE_i8-ZJW7~N zNj|F2LE*{U-c6$(qv1N=zM+z|6j}Ax*rPBTj5-P9s#Z3M6lEE&Uc;mOh8>2gI5j%2oXtPS1;o;^Dm1bziFMP$48OCAgAYI*=aPE1W()<2-vfk5p7+)c$loI+V4Ilnrd@N$0a3$5T-gD57%zGorL)R zF6h+q$;i1@bpNX0swzwBy$@Hzy>layf7ke}hIER#`fs+}8L|px7>FQ$P-iHGjEXEu zEj5VdfGDQ;k~0dU4ndqQRV%m{%ci}!Mk&Q4k;h~5N<#93AwZdQdaK#H(seFlE&tP% zOyxccYwOuz|G=|-<)}YZK?8JLq^c~**7be1hV*-r0ejykQ7I#m6TSAPA%}I`n`VHc z=@mzDuxj==UBUXC}*=zfK+U z`Ju3FdyFf`EsFqXvQbCb_&eMB^{-Q8@UAS410g}tAft9cRSO6V-Vk{w47G}jgMd-1 zdZ>Z+nwQ0nozqQ8XH2M3?qvYYLFa9?oR>V(w|rq9_Gx^DEHU2&Ur=rSLr}8cHf*vLFShw;4c9#HvD< zhDJd-nS8*_L5Gpc0J;{eEcD-OF9K))AOoMmD5^j```hc`83RXCp&1*|Kyw&H*Q^1~8;{-PaZ9b@+P&vUgoeWN)8UagdoH>O#l+sMmn4hJ=9dzda@Ju>r z&2}9gb&`DM>?=ya%obo-!aKLW52&n;MS)#Ej%etI>wDP-`ztAWMSG!rx|7+ZY{$QV<@X4#eOZ$-(Az%t0c27j75(o?)cVr{Td}zo6Yh zQI#5%$9i~zy`y|_VlL7(8!kS$NosU+@XNt4+f0dEfH5`|yg5z5syA2GUHrCDnSo%g zBQxYX;Zi%$7Qg_sVFkK-u)?_gkoxvqF(E|=VRi>iQt3Bf6H5hF#m4~T>|w(9nx{FV zeYQLu?OY2>F1$pQWJB431guNePZi!80@a_GatYy{Tm_fPxM6FP=o6f*mlP-r;wF^1 zPXw&-6MSDs5ezQFHmjcyrR=486=%Fq_+ZpU!$<{~Nga31jzU0iSe4?DPim?!R;SBG z&Ep3_Ql||%3}jZnYBMUDy5ykIwu-<`MI+s&nP;_l4RYUCIFf$}4Fv|awZ;3t$qI99OJjv%#$scl(c@R+ z3YN>{;(j>k-e~+u%ix|+_*nO4;B!kv-UDhX@PLK_85Qr@X-vRH* zaI&yKgyq$GC*RvUzKRmB7?rQW^N`5tWNv0-dRIx2#Q{yn#Cnfd;d4$dI0`wGa>@QC zHD{{A)YR2ZTB}RRVu)l)$nGtM<#lDuNc)(r8UEDYpJ1}G(7de{=N5DU82C>{dA0p3 zB7aG9>I88k%U94yrW4db!M=G8D|hf5YsCu|bAocAf{?p;5`0wFo?5@iccqwATiMd| zj8>&P{T&rb&EJSS!zY#-RC){NHdZ#`!da1aV{4Oi z86v1*$rAqLQFG4EDEb4;aY`{2gSU*(yjeSa_|`G~kG%_&tmYuzc73dSSc#hoMFko| zin+1@;VK}gMqIBEc=Aa_Q9{4On)LOPtd%qsVk5e`d-EvW{FV{G>`GEUbk^^Z4!lOO zs5X!MeACoN^{d)A)>X^!ITlvp{n0GF^4RTOi>E-kb&--J%n%i`!91TpGr~o&ythED zpqDQ#Q>-~2)izS{6QjGegKQ9Y)*JE3>w>{N#=<+8CIW+Lj z&pv9+PE~is&K3|^m8awkDrp*UdBTCE?eHI2KR`Qpnj%t`k*dLguv&@f6_N`Du_L_H zoZE1dqVXHHWbIh_NY6^3+tc!;$5V*XR;ed&_tWe7d5gLEe)rPN=1fbQq@)bo!3;0i z%XeUway!<4XbhX!-^6EBg1(>(;?UoU2C?cJH)jk{LTQ*=V(XdonWra-d zGph6xK|w)RBfT~qj8T=2RY8-5XnMI`l_g9{jIXR$A^zl-?q`Pv{RV(7F)L3M-I{@J z0v-d^Ikq#9CWW*jCq*^CCI52Jd*X!&_O2`m(TtAp$GZGn5+Vn^IX{AV|CY^`R+agH-z-t=Ui*>4&0^aE znKLQHwu%*I6-OcDBFRi#u{euG8EBOBH)z4q?+u+znC{GM#p zm($lP9&p@f4_sMrHkJA)|2FHa6SeFCYqqbJJXdBJ8Xv-|TC%ajK4vJf^NE?fFuerFTd}(V= zY%ne`bbeM&>8@pHzT3ct$)s1coKvUv>zUPHl<;~wm3EeR&Y$1eA``5F&LO(A53>mB zmh4`Tm98s_O}-SR?xyH6z!&nm7{(R(bX=ppTPHeG$4aDEDFQ#renUyEEYw_2HzYM7 zPsn1(JbgaT`rEwUB=i}4_RM|8TO3fVvxI*Lmn3t<48S>nS#fH@pNI(aDTo+2`f!== zJC3WEzOLs@Xbro9%u%F}RPrqR)<%AT{E} zX;WB1PiddN39Q4vUQufksmUtpc)d0=20V{4TroxRrDb8#KpTsVj9YiH6eer zmD_QP8NJF_Ce2~5-d91s&R0*3e{Ra{k=4!Y$B}e}z<|cd$C~hozfK7-Rj9)hG^4a> z_)eAj4ADGs=SM(?_k~&bCIHj?+%0jPX$NNilw_)GS04Zm5N>nP&C?WHuzbn)6OAN6K!p z+`h`PD`Y=WE$l*C)U`|pH>cK}K#zGvEH6)d4WO}qD@C+TL^|WyI)T<5Y|`jTdmVW> z=ujRYg#+eK)O)Cvcgwse?@_81Zmy8j1i4fIz-LjwSlW5eS5$2?HI%R(!6*i9LCbXU z7S!BZU~RMS{+-!Js^||=YTi(44#DaN!=LE-%rR1nDB#l#`U*HNI)Q{3O$_v|Mg!8! zHI4$GU7jUTp!>G~2Lc9s<-jleAhS>(AZ^w3Wq-bQvH_j`9ttiGgJ;b$_c#o4w}qFi z0a4taEww3w?zEPydq5U)jS+<+tSq1Dlp#4YuVew`2UROv#szg5M-T_?+_SQ@6){B zP`sN_&s?YHP;=cQ8`fckyI|*o&Xh)jHSc};=JP%8QH9pRY6k^Gw}JCfr5@6tVI5GG zT&mpK_un7P%>uqMA=5bNu9T1@s3R;x<{(tv2Q%XC@29Cn>1f&wwVChGKrw1j&z7T6 z&4urmxsV*xck)2zReycLnzR>t7#$Z_bB>DFN#0b1U*5bFu73u1#>#A>ma1LF( zrCyM?=jAoM1u9+fQW~MM#MX9drqR@<(X0eO*>1B_1A4}y2XG@fw#;)-(a(nk{&tKt zM{AWEee=o6&s*cO-aBo6I$`~BZW1u7?iHd`6b`HHPO1hntPt3xynyv~`kzz@prUw4 zZi!qUhwzX`DeKe@at+0U)I?WlSJ_z<6qX^);FEkdjWqoU^KhQ;Gq}qT-6EBkfbEV@ z_XHf9YmT7u&yg!10^QGl%NJ)9$7;N`2v=4*;1nY5i4vGH1I8H;ZJxHLb-~p_W=6@< zh#Q&^3~TI@^4h%B3!WZ-pbc{Niww(J>B%fFE5>|^Qby~tck0vAi!#N`G6gUq`Z-ms z_T>{4Lsu0o#qo^BJg+^9^9~p|={eHOP9RMgX~W2Y0F}@3>P%$#Ektp@B`#j9gLIqv z%QOmvz`rjLCJ8qXtdiv9`Kbd|+0}}SOGNF-cT*l{87!YjQ`D~6x_1N_+>e9{`Pypt zw_d2XR!RQggHY#Fy3p_BpDc4Go7f=D_hA}wfh`i4OW?-Bk~BlCKl>T`q_n*D8M%>l zW56+x%zm>tslqJK3eT`n53D^T9h9t8Ona*KbUUizLO#ma&~4rU*fY)z`l22Y(+jV| z0n-&k^By26U|ydRpS(-}Y$oUm;~tKZhX*6Y2gLvIjOok`X7 z7CIXK=*%fcU!cyDAjl!VbTsy7OXcV2?l zLg|-t2`xJc80x%D6FDfBDUbA^VxG4wUk<-T9eEV8)V;o?2lIsL)rBq^dCEWPnD&xu z8Zpvcgj>!iE!wZxx`#}iShy;m1g$egshAvUf;k{?cP8os6(t_iFmy}sOgH#K8;|5v zg`sh=z*N!woA@!4?~n0>GVNIc>2MJ?Ua?04uy(t8zL~NL(*cJ%zx93x_f4bHYJG(i z#RdEIMV&VNKxw@Llf1U4#rt~$fWMX;4zO_K3;(iQ$Fi%pn)3Bv5Xx087YK?C=OZ!m z1IwwG`%d!LCg-BoCY3Fny8hI7>l%z57O(Ivb~6i?82@c@qqTi(S26NgGrShKAc8kX zV@MErA}@<0Juu7BFzQAPe_REdTIQuBRjmwF7}`Tw%q(AB!NkEf)<%gaeZw?$!h_ppU1Iw!5_Uv}k63E(yhn zjv=AN)?2&+Rk&zCvs|QZa;HrdKalN|r(_kODj!uVco~nt!f&D@v20%#dSwCaKeur_ zp$NuvEOo;qr_bKKH{E5J=P1Z1NzbpE3*phL*6sb){PS%#*rb>l;M{TN4oo2fmaNa4 z)nFc_s-{+MJCSL4WI&bFre79$4{d=gv6FwiU9Iw7$pT`0G?oMRs#_l6_Sr^jQ?Wz$ z_$Yyc*K)%1DD0Pgm&Pu);3GI_>%^=Hy~Pxsl-u+2Tb#Q-m95IM zqeevgJ4-q73(J+b-kZ)>{eq3fPvu|GQypp+Rw#}uvI1E~OQ%cq!Y)O+$#q{RcxWKM z+l$0vUw*pTY@(3sB&9zue|}bQzD#~sfc*c*Y3Uh zk`_eQr2ZtTLKG@oP%Ol0$k(MTAlJnDxM(s zhl2yL+s3lRmSO!+;d)4fP-MmXB|%4|N>t{pXc0(&f{Ck>+Q5~_{D*5k{bR#9@9l(~ zFvdR-O=b#@qold~H^}H7)lZ%Rb)Ws|`gW#9`4EA8wV~)sB{MR8?Z$n!UAB56dq!)X zEmBRw@M-z42NYoBKUyCk$nY>np`>h7Z`fa_*hY1x8gWzr4j=$wFw&gnO*8JBTaNAg z>(mZt7smxmMIM9a!4CVl<~{myLs;>rl+XLu=~l_D7)BuR(?+~TF#r-)Sw?x6G2FKc z%_*vnGnNMlHQX$}(`8x8@{^NF39u({`-R@M%<$e} zplz-E_vZ`Dn-04&aC6HmEOaH6omDcN5)PbE3-cnJYOw^405pOlTWBnR%hL{2;>m=P zcN6L2Su?x8WokPEjpyLebLMpplZ0SwRU#Qhrzc^rl7#t)igA&-l1uPAeT9+ zMuqmmV+LDrBt1|wsz)L1U!1DgD~4xX?c4z?-83f80G$!D+SD@81*Bg!Py)m{80QR} zu)8;1g2f470_Kml(4@N83lnTd`)7z4%Go{j24*jFs)elT7kn1i1Z}WgShm7Z0I#1b z=9Iw%Ilgs*_mTVd^tcRQKgF~T8ANr2IaGCJ0qtZQ1HZF8YrbMmzb(JBN6G?>3B{nK zTvTs035|<}5@eWo;LzSQ{}1i$ZL}Z?FQpp?)H%C%G)5Q=WuCJgyDZPAs2aD3(4&s{ z+ts2cg@7mAfbx@3Y?#9~%6vWY+77c}=jPJfLe>U_yC&3cGiY~B6|~dY!jeUUdjr<4 zS+zk)7i$zr7Ynmq8ZF$(t&Hqu;LCjiDJbr=g@46hQ%4Z|NN~ayY_i;DlJ1 zz-pobm$4aX2a2bldX0hXv$PHP0iNxwsr3S0;(!03C9J~Z2~B~`9Q=jHs5 zxgP%og3&*r;y*o9NG&*nF-Sjcekj8(**D^ML9sbtU<@NBsXR zryv=Cn3LdBbW?IiKe!<#hAHk6QaAuW+M5$@Oi60c1@&@wOO4!L)$jJT1YH`%^p|$J zvcxI|`+A4n&fX(B8eP#V)QMkViuI5vpm?%{*7X#S!`47FNHM*v^KM9e24aBAutFN! zW>+z|gy9MC)7wR96u4(i4Vn&15wXKU_vHe8J{rv3m%7)y$8*)PL^u_7Ny7v{0beke z!=)H;fd(&5oB=e)X;kR%j$zaYu}d32!>e%_m(wfD+W4_iGVNill>vwvcZA~K-mKD5 zi9WnKRy4O|xM}$^!6a?xC(51%y+Bv$p+;!O$=J8n$PsWmf;=}&?2^y|HC(&Jab8{8 z5PhD<@9heNw0Yt%M{(nUSbsz7FO&jpE?*Aoh z2bKKc|H8iz!+*5>=J1=(KTfaz!FT2V5@GzGko%t>azAUpx8H0J>SJbbLcSxXd@Yx6 z4&Blo`Z{>`_9W+q#F@O*yCeU5U5Ibs-7cDC_(G2MAnqJ<2n7ge?QDluP>cI=U~b)_ zj6cJr5YWClx-f~(t88TZktK$%wW>!#f9e*lZ=}q(gfR0y4vG^4 zk6&UV?c+FBsiS>zQkVxUk(J*G2xo~wJK^BCbT?_YCzaBa*00(;#yNa$+?#gGb%}LN zb?H9CZ;@W1xf@?TNv`o!2CIYZi#<&xl7V|_U@jN$&6SDvSIT6($M^Rj{TEf-`0 zae2Oh$p(O{ztX5!lGiYkjkOecp8A#~^0#DSO0-w_HKb_t)}T2lojme1Cuu>RB7dP` zxX8kdwQ96vYYBu1q_Kx~cuMq{Wj&wa0L`y-s*#HO7IHPPgbXi{Aw-HuZIG^{_A6HDs`NTgGHUtiUBXS2dzPq&2vh)285@$WQjdWRf$UDYT00NU2lXh1kG4 z@1_$J-n!%M(b0+SW<_}>xs}DdyAC6-id;G@q~sez7OV;!_K{jT24|%Wlc79jnIdz> zrdJ~+BIDOQtIgderh=bC^_X|5cnfMMNq$v3rBjtcM#KOr7Oa3;IR0MhkF)KKDHf#B zh@&KT-Ovg%=@#Y9Fvl}`XKq!FMJK+#s&owISaESeYQA=CMN33|x?NduChl=sG8R!qm}dEnEONRB36Aa?r5UiNKVW%qIX3fp33)anWb*FT zLHsxL2%j2E=YBf(hWNW&xC-9l$io{nJ#t`~J~OptpKmcyitRVV_ud|7-Ih^KwH(sZ zbQ>c>@don}OtxJh894>#LRv7AI?s}HS5Q00CEGcrQ3UqU_~>PmnNDYo^wS;58%CW? z)ANsU(FSr$>#Gk)%YZEo#@0q7Ua89V05%zT9{2l5E2sx_VTo64wR1RDH70J`?mN-< z%g5vIgj%jD5}=p?f!1Thg72#)n#u5*0U z+wZDpEU0wmU`Ip`z4E04ip2?|YWI!c+Tndr(qn)=$GiHYfu{L)qhAPehJcEKx1f4( z=MZ>9(rDVRUl3>dep1ZpTu(HA6hHIsyvI|#slMJquz~G|$rw#F8t_n^%>^hgIlA&Y zoA>s+uOZ-gL8S*#ts61^H=O(l1EDGJ$NLXpfI@Zpmflp2eujZ_RQeQB1I!QOs?v%U zIh#;)!j4|@7fMuR;``OoD`N@4cw#ia68{Hhl9nU}*CdmB#I zY3f&KocDdjE~<-KV!Zatw0!c@({}3CiBLLy*Id7QeVz32HMTG53kGJhv=U4 z0lEY429~Bujvcl2c1cu8UzL;P?1899UC!2GdDfFNk7sVX+m^Y{o zbFi5y7&3h+RQ0TJ@q*KD8B~@?`sp5eP$KzCsdTc#jSf*f1emu1Hgt^v$gJA+#;pNA z|MDiD3mW_;32895=V@J|Ekxvj(nr^43TSn9u0-sP@93=b>x_qk7s^A0-Tej&(E8@? z^I3YJKXEH)plxD!9%bi!mdg8(WFGO9S_CLDI!*lu07VI(F0d+{pbzT=&~ytgBBEzt znRneNJxa20*mz_9WxdP+T3{-0M3M!bBP!pe^R9Yw2HR8xQF;Ik5#y7ZEH<1(vz|Z<`rNM-#YC~O^JK3&Z4z$o zc3WZi+B3KX@`^`P?{gDZr5iGeCCfh6jQ({>m<}{7UhRjELP1_AS8yDYosowOBpu+J zJ&DV)h3601bydjPuaIER++8oLkBaUcR~v*AFeR_nfBsH(PH`T;#!=yBrk-4Aht&md zzV!x$391&~j$w1;V@eM#ot_rbQgxvBBizlelN}^hI7K)5>=c5RY@$!5g@!p8#p$ctW#a>O za~bCMrZ6L{J^ICXqSW-C8)`;=C{1SV;8i?d<$-*YdSfl19Xo^uxIsMkIfgRyu9p_e zDDHw?^&jWILpvVhXlmheaFV(Fd=>>o!o=d7YFLmwq{Y3cZ)D*#vhJ!uUxM!4>!SnA zJ1u0bt}@r9%T#BA&0JST^P6`_4IJricSqHhx@hyyCGoaNSK}M` zf?~410b=kK>Na_GRbt@pCTurJJOL13m{VDqipEswlvDl26gxOVb;p#tISn@7(i7&1BPKICs2+U%}^KkybKY(V+Z6i zhor&YJq|sR`qEE;u+{(9sl+#Ox&ojAtZv3TA+B)>bx*&7rMF(eAP zZA~ATMGMJmHMIpE*2{BrLJ7%dh7dpd=uW-~DO|8ZiiY;<)&aj_+kDvJ-OBl5>5Pq- z;v1Sey1Ws+1cItzdWCu3<&6RIx!~-LCzWY2Qg*J8U$Umj*^_g|k?G>^vTh~v=t#Rt zo4V;?^(5~phh**a)3ku#rvs2AO#qr+{mTZKRo%=roe{R>MsYzxB<@$1j|JEn1=5#O1-Z28NX_6^zB4XAACv%8;7+6l; z&04%^1=!X6V8JV}(CIBx{@RCfJD;2HCpP*Ve7UDAQ!XJd(^Ot`8unT+eG3V#+V}-1tDTR< za{)xiM!Yw zld9M-Cbq31zr$f8A4%4lk?Bk7-*=R8)vb|ur?|J^12)#kUaxh`kWC%zBsBN99MAIb8J#`Zl6 z_Ec9)vp$kg7rdt@S+$Ha;_`mB!TnSF3pGwmAID*m`5Keh2lLzH#=K1HI7~oEd}Y)# z8tKLWp^!a%5Z(yD2uizVqxxgNF$$S7MUxV5&vvG{b)TDVToj*M?72?dFr5VC6&T9r zgN8#xgWWy7>UAM*%cBctBKjRvw*kFFHzjGJSl{eziebXKVR81C3QIq@6Su1|)~pik zsGqO)Sx-y0rfpPu0-d_v3?}NCZR~vC*8zy<%!t+H$o7o{73qt;AgX4-uJf*({)gSpSp0;&gf~E)qK%-XiOgocbT9X%F>6ZtN=fVQJBgQyy9T$ z_ms@zD7~eC=GAc8xS?^~FnmO++%L~6!6 zM#e+&w(7i8w-azgVS~XBpei8B&mFx-YISWL zS4?eyzuWs&soY|Oy{W1yi744YX_%PN8+|dXNCv9`F$nnH%iN+FbD z1+n_;6uOYz9aJnq!^Pn!1}nJ3#1$MDG!9=#5d!`Q>*Yg{jCFP)VnD78F!5e_Qul}# z#%7T>J>?0^ER36F^oPb=c|KP-FT_=BYNthiO!SOi7g+_rJ-;1?zWC&Q=1-%S7t?~Y zBi|ILy!Ym*->H`?^{Q|REFVV)n_*v8r9S1B8emnCFe|ux8v{^&m2}kZtIy4nADAF! zqJ8;dhNHgWdv9gFPI7UOX%RncxlvA76JLB+xfF9KL#}|6Fj3*0bThI_^3n)|=TAU@ zskx3gQP!H=4*(^Aid_42afid3Z@L&wU+x#@oXn-mKiw}}mjmO0H2a5c+Fw=W-kgc~{&g$eWu-3ASFpRcK%jHmAE_~8nxNp!!=d6_vRA4x2;Cd@19IitWm+phkA>+9X= z{D3H~cd`-``S^_5iIWEi8(5Z1-F z1YJAD>&xvsz+eA|?>lF=GH`6zb*pe$-|L=D0{oYBI%ZLJj-Q9?JG_P~yq}NOtw4{( z_WwGiw(7mXoR5X4YDiH5YM{)O@EIsY^Ex1*5=?`be-{LVvLu^&pcE+Tq><>4AI5$A z<_xC%f;$4s-bGPf0xQJNl5Wl@55LYF$JK&&>i|@hffl*~PAs@UTI#@1vvku8+dgOA zrsfRx&JAyCTxpqUGPn@j{v(2j&5(<#UmP5nDYSA@fbA=qI?Es zn+2Fl4Rl57R1rOR5^}c~AwnE{QFQ~LH!sq4D;KE7_a;}vB>o@;W-u~vvE$47WaTU( z_^fNrH?to~xg2gMlGC#A>Cce6q`_oW_E^;eJYs$JoJjPheI0+a?puAd2PE?{=z^Dc zf@vM!R(iPs+nPD66??WBzD?fFC`x(0XgG2dks$Gzq$Yn6BBx$pC+$;|fFHP-Lum+b z{pe?0#II=zQ?fIPbQ9Yf@S8)8{gFjcu(jG8Uz*b{v+0LWnr~U(&&s-Knce?sn(~Pl z{I2Ep9}=mG&mxEUURNKD?i0~QCTpg~xoB3c+hs)(`j_&LMWoQf{JNRe*v2(y_u0Y{ ze@z|Dk5W3y#etv3o93(|Cjdk|LbpHukQ$j!B@AqIYIiI`iO6N z!XS~okiwsIrr;g-@a*@a+cRovtAFlN14sU;cm6x@SpTVa{tMJQDd`8Jgo4H2cS7In z1aF)Y)Ng4WpnkZ%wGhu?nUy;onQHWuj_NI-$0IqT@@1k z6gkf=@UCjgPOCiiMGxN<6qv%2sf{Jl^`z-(qABPo0eicU6$fD%W91XW_N88kFHa&j z2rr4wEmQSpeW}5ck#@ef)`+H7vBnCzRPej}ai z<}0H|?RUuu`dDs$15Cb~ERa&0p6zJ9Y7l>Sx5}1boq95gUo!A^!O2PDa8gaS;>2Ek z=Lw*sc|9T?m)N(;j~Wtn5ZqR}{xBKoP?X@9=bIOb*&~j8{ov^vgc(6rfLhG9uF*-% zU6v+R6k|%7>eP!a@e^hdUUeJLIS(@ZjL$HB5_fpO7sj-pu#M|qAZOi&y=#56EPdJw zh-nrsN9uMB6FPnXt;didpif^k=FSchttb<<*OvBVIz-l_CAVZMu2&`)=?&iyhTmU? z=w8;qzbu$sw=cG?mc~2b?>M^u*b|KqRT|H_TtVHOFds>^lQ_3KWKM>`b(EUhva1#0 z8u>U4t}L)cI@1}+m2RaAZHuuVa9mlN^p;+()bxFP9O-23Hpat?K19aKbNf5SA;PpH z7jk3^#S({@zSk+B!aVGLyp()$-w3+>An2V%b$6=jQQVi!Ho~~5s$=V_t15NGy!UCp zvP434zW4pL--yqag9;bK_D%_&@;~)V&_3>FzeYCy*EqAp%GcI*;^!Sw4YRl|La$mA z%&B`SKo(az*``$A<4TBKaa^&(V{#m7tWd4QTjr{7P>~p1FDaS$$BGp85todt>wnCa z#=gnJZ;jQmW`~vo;;LEc{dwIjL|^O=$>hj@>Js!UdBAeA)1VxE8z+h$5vWvXXv|yK zUY(LvW~qIQx6pr#c=|Okap9uF@`ze7rS)DnL5LQ_ay@a%2`BrK$4 zE`N8cyaKNI5P%+rJj^Jcn^@O86)&acpi)zcUM7x|MoeavgEjJ%fp@259p*=nwVmkP zzO+Sa=RR=5^+;f~Fyf5xR2`vrX3T9?Dq9Z&VH|9I$*b)ZNQJsit7w;H+v{U{YfxO( zm)yx*L`#OB5y*COU!P-D=14iwS$KI;J|n8)2qtTMM~cgP%mQHIhjc3sYt9A}%=F@1 zjrg-OI&vF(r+RFe8kO?W*`LPyAm@EEvT{VSY=6PbEu{qTH$?!KDya0{zO({SPBrhB z7z>$9_1SAJTjqn~n^LUZr{P=dWF~-PdUy{5JxaL47)|}$83CNZzVU#Jl~%A9INppB z(A}vpWwS|WQ_cM@>HcUlw@K}}^A7foI=C|*d<*4f4g$|?FdsPN#lP^Vo2c3%K^V#u z%xIrZE^t!?#bJTAB~M-i`0g z(T%ik^O?!(Pp1h)>%m1(hheWL1H*(~EFq;o(RcX2@eo~Y$Ohq3K?nR(eoKm;U?4nE zxzf1|$mg`7{8G=tSnAU%;LWnWXO*d?_SF?r2`>p2qa&@?9XUg6r0THpivCyfm0Clq ztZa8j(~K-HcoTot$90qIFIMxxiUae>t65z_Ou!2D(2teQd__lW{Z@n?U_Qz;X9R8y zT*jBP@co$>&CI?~j4R{&NaVwN2dQ_XjRO;Bf9gJqcbbIA1y|g>G|91L3{^q=FZE9h zx9_q*loa*jcV&Vfy`s0*KBTSK=Lo5%1=Q8QzB1AbY-UeRrP;abzk6GnnkqS)Ca7~w zyLfcybpCQYcuiZ=H>^Q{|GiC0#SGfPY8kBf*5+AqU(Z-*wuIh}-E_2n_`caTg)N8y z9d#Ou4$$XlNek=J&2dr2O@M2Z_CxINdWjsNTEusAt{v_ZdVD06EH@k0cWRO?&eO`|UKTGd|bx9c@ z1Rs?Zz%;XHQ!pLBvC4Jtw$lPovWl*Ho+v>9VtlcntC~O6sddr(I!fL;zw3PozC)iJ z%&DCuEdiXdCVXGCkR|H|qnFDc%5WF}HFRfQ#s_eJXrNCw{Xn3d7cwtAUbgQ1%opIb z>bR+#Q{37jOnA+_U^L}Cjt)GA#|L?cyV%Vf$-}BQLFkjp43h&uFLt-ZWai8>acR@;k8I*$SH& z*ScKei$Py(Z!c|t8L=6@r)QuJon~xlj6ph6oe{oeLofW9E6x&dW7*M=@rIYH+V2%A zw!Q_7hnE{VffcgvFgt6uEEW1lC#nm^-Ep4Ei}r+P+Dxhi$jm!Gk{IG3`39a=E^kSI z*38$Wa?Tl$@3NBADtZQl56pYU$<{<^o#ogfep_n7i{k4Q01Cu4vzg>(Bj2l%(QFpm zEGlHf=O6&b)Kn6-J>|hK{|WE4A;unNEOPP5tO;=W(_njtq!A1QfVu z{791XI5GedI61(%un2$@a?le<26mKXMxtI|Al{LH^LY!j;R`On?Wl5#1QE3i!^C8NzY@$O8h^(&7$y~CNQAne5K5ps5JgZ^>tW9Qe1kGnDi zwy1LN3d!+srY;QM%yb{X&p8lXSlIDeb@j#-u3T4b=~gEKDEo0l7yoLBRBWLv&h2r< zcbEi@D&l)W42fz3Alr^JL0hWbvaE>bKyn)JdpMwwsa|B3;i%uSk?)~Y!HN2#%8${N zN4z7Qho?sScD6wRAqYWe-BCJI_ZPcy-gR#fulc%}e zU?u>#HcPeychX%A02?WCu0_p_Cbq+Ki-u_GC(#`alQkl2yUClnho4iJ8h(-a7FC;( z@JbI_0eHtXeCnS6{WjeFMXO$ST@R(8Zh@Fqb`0IsKXWB1U$gz7UYNXGr>)pCQEZXt z=(|x;w}0o8$L3gNO!X;4TVMFgsfe}&-l-ff2i@0N&hL%Yg@;vcUa*`jb`J5i0g7Py z6+rd%g8o!2VTW?Wn5r zDnBjujSrQ6eF{oOzFUy=#>#x-sYI*%)PSOW4SnQr>tmX(ZK-vQ!uNIK=&AsT_a?v8 zLtO}4Syx)hriH=tk|Pp_i^5BLK-HIja$3x~TkQIm`?gu0@Rmkcfpq@xG-0cBI5H`3zzb>}e%kD2O2##+`O~iCZu@F z8S!fWDe?VN;>+`|)RAN*=%ZXu+!w)bJadOU2eAJe>LCBF?iw&04SfV%iWq?GLvKp+ z(8AuFyfZ4Jp&*lXF14-y^bhD!5{!qHM0$0co$?=4jsT<&KsniLmwqd3g!+5&_sgK( zl(oq(V%&d@mtFX`^K6%q`{`SSY$UpYdw`w~>%G9@fMEwH*aiA0Ppyv%sLODfa0N zXNMR}IP?)Gis6lHXd#UopXKOIYysgJW?s=+E~wdfQfRrabU-$hZDdMyzIrksP+|Ju zd;8W2ZHvt?l-Wihhy|q-UKp=VA1aO+3USpjx2`R?+vIzTY?!q?3UKDm678xV5n-x^ z8L@H+09E>)iGg-{-l%@1@*iIO`Uwtz7G6xzwQAP7iq^ zBlkDx5((PCSx_J2XfXDcya$l)d*O^zY1-+MfYU{K`q!LIu&Mfii;HrUkO<|M7e7fz z7@m%yUGvj^Ts2rH(T?bPgH454$_Qe-1%o9{2iv)V-4~Dl)^~&y`AA!ACVn zx;|P^C&O}Jp%L^bfgzw4R%CJImFMmslh_sC$*=2kh)7?sj&0b~1i^k}X2OnLU%V-e zNW7n_jC>n*RnYIojP~YvPm^iwj#l;kVHfks?H64WO-6=?Q!C9~b)<&EbCp*+A}&3o zEjX?|TF|qHj)Z-(C(l&J_l*$~`aCu!ixP{RMF`HRzFPM;#wy{czY+)K6yYMUTUoAm zGA%(-eB_b~*7?PTVRBOBAm3a0m$Ql$U%SCHli{kmd8lI3mn#2#_B|fMA~KHOWLeUC zX;6w~zzC2}G}bMR7U&0^(TRpyh;I`Y*9!&d%wpPAwvj==T2qrByV6b9QH3%*+||~K z?wg>ztCIr-F_atMFz6&6eL{=ZxzAqyd>vK-%L8E&N?*BIv1W`pT)j&=R0b} z3J3v}XCaOTt(FfR-RV?|Ho1?NO#RUhdXLVDyq~N0lTUjZ@s4U4cP!;va&zvNfIB}8 zCLJQr=%2en-vfxL4h;~1zxl{fMb}{F6&vTV#Zaq=h0ZEj5l2CHzIKhc**$}B(hZ6V zm$0OSQu|b>zjeBN037R!X~BLZoHO>M>!E;v2{aM<4TeB%kKJ$ikM z_vOD`%sEEIodN=|^?*wjk4VpjZ2!|&ng8ma$af{&U%!k7@j|%`0|?};)59f zo$T~t8*$7gFcD=w4mpS6iCZ}X_HR3HP%Ah8Sj!j@jOxW+s2e}%GQ4`w)M@C&X;!#7 z6_>q<3U8_O4jIdLdBw4M^={Vjw8CJ;N>lxn0#{W8>V|L}WulB$VIi1Io~%x&SZ|wP zPEH~GZ_L^-C)eA0w3J6eKCGr}dcAu>lY_%_JckU!lwc0Qc1pG>U=!H*$INt-C-~_L;~D$=%iOs`?^uY^Qs)lY z7vfiVS291R8Km6@S=MD9fUS$Neqnr0bw=O(uGG%%jm9k|8X{v0Hn_bxjvcH#`tXeh zGK_wv*TaCkOgYbwZk_D4alEO1$y13|F}9jgF&&be${(0l?SP)mlHW0j8lrF&fqwc= z&?N#A;7BKv1a%N|qdlaPozZjfj#9vJpD$UB-^<`qkr#rVb*C7b%W)xfb z(>_wFhluLFJRw3GvYh#)(`7!?{L3y*pz|W*s@!lnD-fVZF37zmPUPE1*u(X6t;}x~ zY6%V53-KjogR>Uoj)Cohvh#iIdts*wWm`_GC$b0$8c&=UCuC&hjwNSh9%k9C?>4SU z+jN4ON=l^^?X6QC-8ITfhpo>;w|UuixSo65a~Q*pqgn*H_BYv+EMbDndvwK@B{D@K z852cC@NB4LIQl|`HM==-bSxszS zA7pb`485bDtJp!Ji`UkC;DA`+W$vt@eh02LeW9%!4RxmHCa7u;StPUBcNurH(am{P z?U6<;@k!_yo0rY;=gK`f-bQq0nK{i^?pFA>WH4SEaRSaR?9fCrMhX8n?1 z($y%BYF)SZl9^;)`t{ioA_>qjx(CjhksC1nbl#Y6Jl@D(7X(SUR?oQSKPYiue28mW2PrG_`u>NeN7b|k=0-w35Bdj%2E9Gq4JVaGy(AFiJKfA(#pl`N9XLUp0 ztV15irn%(4&CD#0>6^$>9udxjZB%({uLQXJzU(DB!LOuTD&Y)Mo^Dx0O$n9q?vxyG4G>0GkZ|e5=dPXLrI&qg%MpHUCk=dp?x{d3Gq!9 z^X{|fhK~=sS#Qi(>plRTpe@F?s-M=%&lJv~ZFoa8`XnRnO1UzuZ}p87N~0rg*M)6T zsW6?}pKjM>E8YGyQDk7#_kJvPJqlJhBft=J1=@2dgv3&r%bvfLm*2M2p4R~BzAva*KDpM)!1QB<`*%xZ$FNSe%{{U8@_OET4${*{(E}$+vFLBTyM?!-k|hT z=s4J@n z=G`?AkNh+Miq9m*5#jjycm*M`2z`?d==|<&r6Zzs0sKx^awD!Dxn0k`fd!_ZX1xJ7 z2kKP+Z$;Q1+zItHdSPlMDZW~*)0_dNtovvmX|eVCW>juQ22@@$Oi!W;Y?bEI zCHWeXt;_XiOTlR59hG#*n})4T5JZcBNT6%p_ki9haJ2*6$2pa=TE32tLMkUpK9S8~ zwHjZE3?Z6X0?9*&rMgG~r7t#v9v-lF;&7sk0u+`x!x$>G$V#@LKLPmJC!E)1RmXme zpCU|p)6)uy{J1nZw(@O$vIvc`yy zZH}k}9BD%VhYTw5>+b;_HcXxMs!42yY zkt2`M>HfjdCve7IjSzEsxKUA`=pPM`!fq+MB7;>)71v$YFfb!q$|G2ZKBYv}$jblV zdp%zxJQaPb_6LG=i1DVdF^JZAmacp*o^qX_GG64I(QlO{okxU=$$=Y7?<^}BI+JZ; z8$-;pu* z<6aMqrgAGguy+0`kqntY8C>lqbY#+emqV&rB-|*|eM@yy8?7~t?b$x$(BO2FH}kna zVIy%p+E9O78m?mHOs#Bf5sw&#se5kY1oDEGgR{5lPxjOvR zxN)Vy1PAn@JkRdByv3v7XYt1mgv0?G?t%~%C%AVnr%+9@8`v9pYB?lQEQH}<#kqG{ zvp!w7f~7>)7bzDlMBP>;(_vle*mR+J>P*U6bAvtP!}%KP7P?k zx?@K_<5*QIkVs4!Zg{gOW+vnuCv$!&M}jx*MZH~pw!w3}4nM3*X#{9yU(E?dh~8~# zIMs3dh9L4B|1Q%p@Ap&{T>$}jXzZH9!qK*K=6xzmH)kR+16D7A(3-u(<~l)f-MJw9hP>CT3YFWR!<&x}&zz9c}PxQcg_WkDbo zy*rhbsykrQ%n-+iM|+&;epbbDBnfotEq@jr20G<@8c&;478BOl_a0o!8wo9lgcbM> zrpx;nWB{1m`dv`dXopdq|`paU+og@RHin03H>5R+|l)Zo8odE(d0V( zR!jkHS<0HAG%$Dlev!RK22nz>REq7u5sTsS%Q0e@Qmird#r1CfOp8n^p-7@8hhb2dytLprt;o&|iVNnIg9j2?Rf-hDs4*Tp}x~)33#}#0?Jw`wJ zJ-F*$kG)f~lbMi(TvdH$uZQBY23n=x*4I<+Bx3ef{N;GrFl~S9lyUf4xJ0n5)`k9$ zjOR=A)~Ay>nzDmB;E`;7FpeiDtC~5^Y&AM!$7&qW;S^!Nm&k}Zl)Gq4 zn@w@g_MP{&?XZ>5BIhzW{q#C?kuVI?osw$!{>ILj!^24FoB686(yu&yHW zpAKvA(S*&&^B<<^gNNAXIW1uIty(K%t#hv=7f)kuQ&kc~otCdO(6EyID-j6|_jB}) zxfu4Eie{-RlDniEH>iv=DJ9u3co24^RQJf&Uqmi;)!z8fd_qH`r0HZ^ ze%m#RfKzREaC9Lh9jJ$~6eLoy1{f`13nY(mXBDsw-PY~D@to~GhcRV6UG6em zbbea|+@?ept`|g4+$hwp^VjtTM9Q3tXZ#%6QNK3s`r1Fp`6H#}wDJK+Op|+lnEShd ztQF--wF+K$@MV5;RUPZ8hwm80)40n_y`qA0^~UCS??mOWPlcU=?#@}vnxMk~6@5-B zX~-#bh;F$vTlR%HaP)h(BnHL!e%1xO zyK00aFN*j#CYn?i;8QuO#8CpW-AT!-PI@{|8!y^(J7sKk)~|WYlpykO+iTF^Ix09~Kd8^({ zp~4)cYt9?kAxT)uB7V)h5L9=F}XzQ&ya5H+CL-X25UVk(++NB#Zkjy-)L z^YSz59|}`VJ7-NQ)nhoiII2p>E`q>{$DKxR_K!81Dv8X_+^luueq4>7|0 z*OKn!Ks$p7C(s6YK}@G~8dR9!q!yl7YVXLYkwnAwVUPRl2`5bv$LyL6uar8lGPsx5 zD0d@BV$}L~N&2TA7HaXrt!y>ais4mm`Y_8{|8vd(RxAfHI-H}Y&JibYALmjL9K{;a zS5j>e5LObtBy@DXGmtAX0mP`HdXKt*mg~O7I4}d(e&fj#T39?i@0+^-dRrSdbaq0g zV;FR^eOmk7-2F%_G1%+-*|;RVr)nP?J0hy5I^S!`@xH-z;+_THDn^JV5)#TcJ=SNc z`NiB1eELg@Va4NyBmA0?s!SKqbDPj?!w{mZ`JixU`tC5rz^rCu^T9p)6aR0ulmj8I`*sFenS7qsZLNgP3Xr7O!*2-rsnxv=oC z$woy^Gz|a|O8DgMZqAAo772Fd<=~e#g#>-`?i{uzY~g$vo=&JQdZIm*6rb*_e3#xQ zoXU&TsvopYJXzDnEI1W{9StYz)m6zhuV`0B1rv!dYuk$D3fiaX)YE~e*AMN$WQ}ZI ztzJwm=!R(O8|Crp8+6K)EOZ5#dDS33} zuhKMbfQ~${ABlOa{hh4{{={XkOW)b0zcTU zj121HY9>?*&&eM|GQR^3+sIo;mH~omImAQ*w4e9HZ#)}()z*hVB-v{l3W$jq1N302 zJdCScleWO41Yj(zRdrs`wD&=w8bd9c21<07q2m&olxnIQqjp5m z#mhUXjY9@a9my(gWtpYUI?RUfK!5qB{*v~P^(#o!1abi9&-Oka1Y;aumwHN{cXg%f z!``_zh^0}iQxx0_MR|LjqMZhW_zRb-oqY>V!hC~Ex7{LaDy89BTqo-4Nd33lnR}E?isqfo|&ejL{JYQK{*Uk8n7SpuX{g#0i!Vl=`>oPY?5N-p zLyFF+0J%iPm8{_VM4FNZ9c>t0VfCD zlN>}aI@7iE!{OnNQ(kQr$#I1i&DnRe^dB5TOHY_NDALQS>Vk(>Y*a^mEsmWu40_c@ zMcX5Ir30=6rAd)ICG|}x*AygYhhlo4l+#-Cz?C({i9IF`flsGlWp}zN!^6XjbwBS! z%@+d5s1t21%}391_ZH)T$KQCopeI=|eZT;R|B4mDnBZxvq$TA&FEmN$KxG!L;ZBsMmB#0w64pXe6g$cKKNF;Zt;>76d!gt^w7Fg7z<|lPR06m{RVb4pX`*KH>VFMf)(fnRm8Yrf$6*h2R?q4~E8l z?j-da{~m!nvjq8hSR-Nub({Xa1Vwu(V|#l!fjf}&vFKq*8$oh%Xk|2^&qN2@6qp*6 z68t-9ny#yG9Qk9fbx)5qF+LziH!~bRUD!~qaOXoX|CCaPjwE+Qcl~MG7rQn-M zeTylemuf9VJ~$DKA3fk3k6R04rWcnCIxUyie-1C?m&t-UPGPP}B<+8#*0Cb^ikgY| zMgFLH!;iTBWxB=U#J)(&@NKk1dM9*H(^#*U7AyrnZcK>Jam)MIR#j|$i{i1IR%9lo za^7(yy{S}u0VG^PFs(M|8O(pt#UD{TBl?-WiGgf%6<-gCRwMJWrDd@ z;j*EdGo7bXh_Ch&bw_(6Cu;&!t2_0=myT@A(`M}1P>y-+Y`7R(J=R?(xI3!vs{?QF z#Ujd6c(^qhFmSo_cyQa|i@`Seo0F9ZMbhX_9YxbnO7D5oh635Z#c?aM*9^qTJ1mtB z(Pv(quXmMs#oT2F8;`Qhi6)AQlh3lj8UA2+3Kcc?A$!Dv`Ghsc5M=@l{Fuo5>d83K zkFArK;EH*G#mEqE)Ak-^@NzDI8o}rvMk#tLRubFYKQ_HpsXeerecT&dx#0TxyF@}9 zBAhRX>p&)%Z^6y86s?EKC*Jr`gBaM)66_oC(8h{i*5_Nc=o5XD1XI0`xRci`9RC>5 z9=II}J&jt{aLA76gn(`RoC|w39nn*{Un;=CSqqPbn;U(Ofbge>_cx{OOWDV3YI%Id)lbUOSp3I3hyjK_dWT_m~hdQV)-!&p`OJ67c(Yt#70(iGl3Rn@%OV zi2M29fK6fLIGFB<+Uob&jy>Thh@P;xou^C^EQW$z-%swHCIeju|y0I{ShN~v&x3iUNSoF zkME$vtuy+A#l&fqL&Byd_W8S|{H?98Yih3KFO`lNKK}dwM-R~@Ja^;#aP$l#z~2+W zIM;`iQP+VApl+$-tLHyS2gZa&gZczK{UuQ!ANq&)bqh2+oIv&RouC$YUP9yu~_Z+U!Ag*QD;EUpowVteGjts+CpV z4tc|rR3xwK$Qz7XjcISc@K%?BpVfkk5|dEmR1=8BgBE#+Dc^Kpn4gkfbrlX_xR%&y z1o&$N{bW^V4*c~j>1B_KHe@eOH_go@0@!^z^O=V(f#^FEe&>mVWz&R5-fq;xe);Cq zl}pcuaTloc)+)GKynx{KYS#ccVGDtTUYnGH$R`y|o~GF+Z_vWL?X3us9M^5t(a8#1 z0z7NeHs8~+2$lkpBbM7IF1|O1K4(u4 zr(A^!T>r$N2rl61dIRC@1?>t?FPTH6ja#Tc6$n3_!u+~xn3%|&V7v@+S3)btS1OKb z6sNx?q-3DluGb2CHGX>Cad{cc!uTblE`P1cZ2Ky~OT<-T+^m%0W?f~1b=iMHv`$absD_0Q>~l;qCrhnGf(s0PuT0KT;8WHg)Pz}O zpvp3x@fOrAPvdhd8P+NFPg)060lk>*gr$)*>U~W)hjH|z8}e5gcMG1&Kg0(6wGUI` z2FPw88&(V3NN4M%x%_G=?anwvbSdhobl7g`q|OjhmLoJ7u>5f9b=rVa>)pbI(GYGC zg`)?O^jxZyqL!PMgtqU8z!hxAVQ1^ox;>s;Q|zd4j9BTs0XuEuJXv(MSm`}y!QqMV zSqw63@>y~Z+3`(B-u9qfgyOA$Lj%j(S42?i4SE%i4oiU-rhk+_`fBl=C)rqI`raFN zy`vX87NnHCgDG<5LQ6uE&x;AJtn;}S$=cJRXxQK=#eQsXTr#lJrQ+ouKlPK&9o}Fd z4k@(DSC3yO=pxDc9=}tI&MQ^fiEpfCe(Xr`H9KdGHfYS%fry=*X^-~)&Wm*G51;9L zf28KK{>eb6D1%ZN&F;@?DV}x;QLsifzCMg)#Y|X6ZYuyqnjYT(V?7oZ_dd5D+CWKo z)utn8)Ghm-)jx9$Co;Fb_%70M(sRmrhuqR4s5lc}aa(g9j(zh>Z}uxtXHc2kD@i)j zNmlI@!vucOwxVhrEk&~zvBTE8yf*|(4hF3pw$!gS%I)l-LTL^9!5ss)WgT2p(~b>7 z?d_(ZzQtSA;n7IzaArQUBhrz+!!pAy(S!~`P%m}PaXP@`)yUq5Iv=Xz-nIaKJvsyk zU)0Mt9__<@{l=3OJ^792t2uj)IyG(6dnkfVvxvZ4Z#RC@zTfEeL*?xqa3g1kxK?K6zD=;?x^s@bpGRnU?xc?RZ_^0^%KV256H2QX}Mk}AWJ$K&p zDz@=hzn}LP>oY?9?~Y%}_`#GHi`Ro+5z8(A8{%`Qo*Hxss3!sb>xaL;!}VMvQ3JNv z5)Y9*i*#T!OFcHfxzaynO>VJ9FT}Dj1?# zB2MAz)wi`yq;coC<4x61ZQexZG6R`d5^w$5;o;(J2=IhT<1M8Lg1&5EW4eupDl9X&oG9RYO! zKJjP91xJ-f$w!12Kw@un`p8~)?@=`&x;QYG`G-~~2Ep%5+87Y|h`Diqti|14Mc*9Q zz%FhqIvrL!PBEd5O#O7v(V?Mjqd0e$#S9nOe(#6eu_4A2A=DPOCB8C&*;zR8p6#f= zw;S4v&-t>lmdac;>&Kr4$|q00@todAvJ|SIbOb3$R+q$jO!XOf^qIHM2-I7TKIi&! zx+y);kkn@+fE?3~I3P*(lx-MGPU)QU5f0F?gpE2r9H*VXKEsCEv`-`~+$~hQ`y^d- zg%*Iwofxc7-w5Ik)h6Y5CJ+;fa&8SW^zWIVsdN#5)?%9V@q^EJ0Uunm6zXRxh7c7b zzw^cDw}y+kJLVy~a87YL*Gs%1KQXj7Y+{H`rnZDjP5H&zc^NC2j~F|>K$LmZuqj8j(ZvH)SsZOynbjDtPWc5Jo{p3`|*JUN* zx$UdTo_B{mBoZ!9l=yjkaU!JV^QBPiXwtH0K7Qlb40DS1xGTBk4}t$s=;5unDi&1t z$|}vUQ`xyPYn{pv1IybxmQTUFQ{$I78`+9W3KV_PR%;Ey!!(6Boh?{!aw1^6cOX9XM6v+zM>5(=qrf+;Ek5YA7Vrq=# zhpE-NhbXL^pWfn`?Wz}yqwJ@I;P$IqLVI4Cz;MVgg3B zLr*}L^3&M{+&PdK$rl*|l}d>1mgEGcZ3I5THAHa?EQUp`rq#yXe%h3lNO{ia$IJd^ zgil`UVw}!AL$`mPXP47N0|`1CqVh`oy$EN}<*kHX&a;??t%S`sl90Zc60Iq(9i3$R z{kpDm+iyd#za(bF-2 zJLDP}ZgfUJOZ5i-?oM`nTmZBBqVV~v!*&5Mjm6LtwnZ87P=Ffj(2tYE4w4#eAbQTE zRF05;bSMFxZqv}%Qr9?L)-=X3p{n}zF33flyHih^(FVAblea0;rNxUIKdf$SzF$(8 z3I3q|*jR)Hi8lo12n)7&d=8nm(?ZE2|vA6hgld^eQDV<>5Ah$)5`^u z-qIm&l&tMULQ1u(IHZGfR|en$5ZcXvtAcRMHy-=+rp7#bYnxiv>)1Y@#Z!mwJ#K?)`>Bf7nbU~-9I(15JzC{%Iw5!;A_qH6G9MKjBA=jwe z7VrtowX#ja3||Kk^h2_sjg555aPS(J@7HCu3q!2t+;i3gu-Y@dn#8& z{4{Z<)N%r8N3pJS0N7ayFl9k&TOYP!dB{-{hHxCIoPz*^^(7M0q_v-Ktxr5mZ^)8Y z^WIh()FAQ=J!St)9D2F{0+^&L_+G#G5{!)4$kJ+8o2S!+yp#zv4p_TcmJ-B`jNi4 zDGOy^w(h!lLd-s)Irdp-sh*5QvDnong9@Pnb*>CM4^7Xco8C1Z7!55Ww6lUmA~JwulyA*ko(< z&RrN2S>7USle`-^%YEr$^~Q2uG8b|^HHlOWj8<&z4Y8-TZ@67H27t4x&7Yq&n1wBh zJuKOndSxN3A9c@eB{6vIXi=LRlfb%Lcr9tzZ@jOfu|c}700If(_Ups$Z`@Ykx5{m) z+_v>}yJqYhd7b&C8uSX!x~#tC70kAF$IccivZ5Hd1IUKlft|R;bN4AMKSnY2X!?1} z?1M~N6e&@OMmovL{kd*hTY|PcQ+;3j zS;u+v?ihrN1x*L{9u)fjemAIeYh${nR|T!|K%@&MnH|^f;pSVR#nh3r&NiR$6*EeW z1QpVof8KNQ&JJRIFm-w2q4D;x=IZH{VM)6jg*mIrlOy=XQoHMVu8iO;&r2U7ilEbo z_nX|4j2aZEQ9S_%EP``p%tA)^b{GTnDpx!lFVvWdvz)vK5XO%z%sTVff0+!tJIyhp z33RY6g>F6B%u|Theg+l%6d9N(!G^7eJ-$>&qIDvc%VbHXZnxg}6@BAGkCeTq^zUyr zsTJeI+~sxWcz^zK>c#qDmsWVwbGp1?TehjFe{+8awgxlSaAWoUM-}YMzpCd zpqKKG*_677ZB_IvOaN8Lhq1J+iN+VR4^W%MMmK1@9N`3J4#PBCp~p>>%WuVq9A)0x z>!y@pzzpNeT2`*@80LIn`qtw2AKZGDw?P&R)ATa3IGHTK_SZA1Z+STQGe&pOGijj{ z(=bpY(lhPEl_RI50ZLLf?ET2;=5u^z!fCmT(34~*|HyZS2VRlc@-Vw#F$HjvW9hcM zT%~Z2L8&7|&{(10Op&A#l#!vmd#0bl+09{KfWiyQqi74pT-?}TLKcuCl)q@ITJ(Fl!*K_L(z(2Mf)^?6H2hgO2z)HpzX2@>&)yNSEEcd*&+8I9Ge~iv2A^@ zj*_}{rSf@w!>Np0w>mNls>d9;INVY-l8*~m9PxA;{CiKTP!CjO9jnNSVMz31rRk&n zU1ntG?D&onv>%y?mFu3Y*6Co+LvQ6xL2kU@KxO5pn~W5@n%0=Z|q1bL8)iSms}$!3d>fxUp}aF0hZ-E2m?GLI@=xz%!VxO+=kS1$U=pK z`l3&H4)Kj{px!*e6zRJO&ry-sN5!b-o}4+vcw^0aoWBeH!27{a>1Z}M2izw0eTwJ@eDo{f#}l>x56r}i7hYVW z)qnbGwEl8BeC=0(`~Utzi$DLv-}U(&`-g*2{uCSi`_MrCj*s;i9Gd`w8}Yh-<4Mzs z`EZL@sybkI?l|OehQUgNYi8q}<2^FMul1$=Mycq3;z9kYz;roEGX4QOFateX(|yVj zoiT_^F}_&OFiRCm#FzxvsvOo7TyBzYSl@(bL_g%2WfpZyeyNO4yc2N)>fdktW3Yrw zuR=V|hR@nST)a%^*nz7`(1%9fD#N^rWu+)57eOF+*?0Ui`m4R!udfT$92KXM`zKSK zx#Pve2+DAcOX(mfLRBKybJLfV`Oes!b;Lf4IdxPDq#T}Rbuq5@_T{>39u;Ctc$17} z5XI=E<)0_En_O^bSW$h9?plvinr0QRbdaY|aF6U|o9_^(gSCX2A9QHE!a;?IJ_A{V z4c{qVQL0zWuqRSL`oP;1?P@PrAtrz6)6hHGrkW37M}KIm(Ae|wlGaW8<5Eef4lZit z71VsNzKNwR!C^58Q4l&FpI$m+^G`33pND2F&oQQdp`<4i>ajd%i`#NkWTLy+3`UCP zxStAJGn*v5g_sjuQHGT2GQ!>0;hypf`0(I+0jl$tf67kMY(BZKnLjF)vHBDn{E&%s z9b`PgV1;K&`S*(-k?m3=MGK@Kkzd3)nqpqURVi+gx9j#9XkV7|hlK%ASSf#nNKhuh zUQHAhJgt}PyJ;6K^cd;|VqLD?dc>CUo5iOX^J5HKTNopip2pdFsT`MDU#tp4wJ<$o z%&0%R_=B(Yv-79NS6(2RyB~XaMV0^Ps3Xu(iKZn%TbB{y`itp7lR=Pcd8STb(vPcU zNGIZpAChfrzn}DTNL6It{AsD=D6iJK)DXT~deVFl(Lbo~sqh*MYvw&Q6+!8lskXMO z=s!IZD}z_n-rfl@)yx_9zm(otxflBB@5F)~-`+lpT{R8~GNfPYM=Tt_5CIBL;j~h4 zq%}HqwkQ8|q^MSJk)w_&M*-Md$CBo&F;Ri?@Jt=^M|}7%mmb&Uh|#=ie^g zA18CAzVW;XH-!ZL3$@5QbMm1Adsc>zN9KGixMIPqy-S92%#*RNS96$ z=^zOuL_0;X$Jv4zC&K$t z?GZ<0>fisaRsWZlG5@1W;Xfahf7h!2%Wv{I=(B+D`kjxW`!pCoS&EEV0`k6Gk~}A3 z`se)z>z4r|8ONQqTlLELl>^{iVg3ImhWy_P{p3jJAnSb7$J`V9) zGEg^SHJs>~Zr(RXyI1-kSeg!eq)v6u~jtHYL z4@{`FV|?Zx23Yhq#w6oCb10kbLM{x>x?n zzW0pCpZzm^tF^;KYx$G@x>&(CRaQLa=xL8HXuNqh6#6A#HA`0fd)7Arnoxp5V*tWa zb)y?-^{fgqM+-lzY)%F`eGYPH!tvnRC&s7!b_W^sW0L{Y+#VCqZc;damUUUwd4zix z>PDwWdg>Rw&bf|DbOX4{y9dOfH52V%*$6B6ce&i2hr>bxhdx}t&-mgu)KVSb6I#D7 zH~QY0&%p7Wp$+3Cl=|h<;;t)ZU}Vn<4Hi4$Lwg$LvHCpJ{dPc~^%Y>s_fyW(x~NN~ zlmLb{*$)^~3m<;_m;nKV&fL4QGOFw$GQX{?$qNXZMTFk;&p%E+n<#t2Q6TD^z`>q=!) zzWb`ITNN5i#2gN2e3bj_HFR-jdqt7@@#MX%o>IkNjhLaq>G-Q@i&cJ$Rj8p-%JZ3J zG(S@jm}H-)%=E(eqGS<8qurt`6xUawh5!eDLmMw-!jj32KCMu2q;>zxZgHWFR4FXy&PyVxCntZn(n$ zqv#s;D>ZXvRAEs4-mX{>#f;tgFp(+SUq(mTNweY`6K9~24}u|h!{@1Sg#lzEuPOMQ zKYQE*L{N|9ORuB;sjVkp=Z?Q&_^L+u^>oic<3DQ?l@(xp8Sk0Kv|obfpw_F_I$X@# zYL~uO4mPO2H2;R^z4l^hnM1wdW9zYFh^&v-M$|l#old6o)6(gVL|6*!GQ-4&GK2zAvOi?degQ`~1>c%j|;d7?N~* zXZLrW;p((uQwNU#1lFvrHBMIU*s(EBx>`baLRNK;a}*xnj8aSX!EEJ)oQ-a@onPtX zqOQTL!Etxw|3L(%RALL(c_a)|QBPOd9(9e!h)GRS4w7TNb>YO?x&o>3wA&%?rZ60r z!K9s!Vl~1-u}EJXPg!S$*D09m!G)?;#+a)X#u^VfD=e`B8utv9kbXP4fWkk4&U$Ku zv}mNWk~z*Jbem}X@$d=r0);`1QTbu2mwfdjt{igtE;LR~&C<0s#w{b@-E^hut?TaJy9TXHjs`n9 zb$a$;X%OKKzNpV2HlztPn#`9}#Q?29uFl^*DXIw0bTHBG?ZNqBH?^RJo|!Pux#^0~ zyD##5-@06wu{Qrlt)wSo2-HYuyI&As68 zs}j<3&oQKaeODe%(c81qGH&kO3^w7&7jUy5@ct(KwDs+mvK+p2rLXh!anhNi`=9oz zJ-0O>f5XO-6Et08;`#lv=yBYUZTlJ|MV&F-iIkZ=M^M$f0c|OhbAm4dGV@a2cYv6; zjR8#KA-bd){n$Ax5CjpwB40iaclb-5QfV`^3@#jTp#7h^*_Eo9+VPo9ThHf$EvMUF1 z>~dF_ zAd6@f{aCWWH`BEJ(ZJZa=XGzVFkPf)K_m-Rh4A*Z?O|xOI691qRcNKNL(TjxsocV@ zpvu;q=pJVr2|kh87;0eKw(qMn)ZlGBDP`K@`t{7hpZ-su&bUEPpm`qr6bg%&os88q zKnkDCAC{8h0bkBJ1|Og$8cjlRF$|oE9On>s{y;lW)e{=!HLLNbS8Q)P*4pc8ukNlc z4%gajw)(`je=e@rQdet@LVE>81YNipWtzDvkb`==Qtw^*ADe|64>`Wu86H?Mg}b{{ zUr-7y)Oe^=VO4GLFkA3RpKc)eHvBeBSjb zLd`NwlLFzOxbR$t@EwYQ-%)B10o1^^dyBLjZ3pbdw5U?5FF|k2N9HC>@mZS5&V2qv zxo!W8{*WxKnIwFw-XBXKyp0`n&yVj=7gWl3Ln~N;{#lOrm^U&Jy9$+K*&+RSlk z@|Uyxvm%s7O$@9N(!Iz*=IfH@wWl|C*^x&*+;5n;RC=_I{FQuaLMXaDE;oLEQOIe0 z&ZA?>HHhEVXB|I@|4|cM_{d~Z4p<+gG~Q8-`x-sZ9Ui>OVO1c!8_msAy+=|wlHUoi zv7`7FB2`@l0xhE3Tm{B)f+3rh7>>rFAQ@4g7;NgNY0GyOZGP?o-2u(oQh#M*uKm^8 zW;dlVDEB1m`B`fRau0G3r$LZ6rtWH5%xgLJbeIB3EL zbG!$kAULx}Wvn0(_%pl4=`=u-a%80%2C1X77VluKGMJRDlg>+N;gWHVGYOx?-SRPqNEs> zROs84<#TlP$GMg>M`u=Mf7$;Q>k_xL#6N9R_y~yTc^*eF827%_G8y8iw>EDwvHMK$Ij}ewlHA1c`vai5$kNz@RRM;s63LZpm0at7`;W|aZEisWFRr=l@Foe&0DA#y}>gvcix?#+79 zawns%&U-G;TBG>5bicUZ6UTMatQ}QD1n}~z7Dg&B)OA$x9UfyBYUhXd*dSlFH~P`< zWMrKbiCPX1v_$6w?({r!_?G7@IYl$=30xWrx%FqE%KU0pNfw5JrgHilx7G~?89cT4 zA*!5FnA3XN_POxnUF()frHSsTJw<}t*}XhxPDI5;DKLbn#@OUGRuV4kZtdh#1E2R* zd$MH;o?2=RwGN?W>R;NOCfg$Qe%d;ZLvvh7ah%KaDy$`~}RNZbmiCjf@*TgmP9=A3X zy5kHQ3_egrDe|U9&Qog_fI|FI2eaLNpZDm z*9vyldc8V`n2{e2cs)erM_SpYzMF)b_4eMID(DalK!3b9nfo=>(BIrg?`GD*v!5(a zag>Rj;awN&aR#K!vz6J5^1*DhiWf%WwoVFna2JaTF`G@}OUuiP!{6?zP3QbI6acPz z*w5{|&qr_L6fkS^P+9VA39w@5Wq;6XH|(5m|JpP)fCq zA7566bt;svoCwGggUw-}j&GOwTm^)u1Sg6lctS>EyZ51(djJq@Jc|g;$-#@s!==lM zhr;A*bS^Q!=m^rOr(n7~Ers$u`Mn2|kJ|YPOYJ}xZ$JFxMazq9U23p%Vig){zrULz z^L*}Bdk#mT^1UB*6oxKAqeGaKg1Sbk;}53~cPgYgS_2xHPOCy&EjUzk{00u7VIgWp zjE(fa7kxgjhJXfsTQ8exMOMlgQEMDafBuRUthR()4gPZwb&%iPZ2N@2+whACw& zS)Mb)k^_CTR`XBgQxn#9jvy}3O{G~JL1sieC$*3JZssoLMWp>HV3hB2gFGLdt05W3 zcj3HD5;`wONp7plI}=CQ7`9*V?Q-+If_bIGd1}ek8(M4auDp%1t-Q?>;NM!=d(Zl0 zf?roS8C)<&!UPfQeQg3+lcQL0jrKq-#Zu9xEtk^{PYJd+4FR4nD2UzkOG+Weo{g%A zOPRKKs$OPVO z&*{gf#>{`TJCnt5va?j{_ggQw*x~8v!C=Wtd6PU`BzOr{? zfU<`J2qwo*<0D2TI}oXT=m{WXV`R?wQZRv!s z|I!w78vVOwqPCjkox9{!r*n%EEWaLgUH<$3(U;sw_iYo!rcb1}bN@R8m zEKKr$k&&F=CzItFTv%G5ABZ^xYO+pcKqPubQ*;#R5v2Qjz~Qpnt=7|tn-0Gm*KyO1 zZf~N)Ntvt=i{5_w@Ba9ft(tZP_ncOr6!5q<~T-M3s-X zwt*RqmMtuWiMA-+fkQ&)qV~{pqj^s<&z2h+{79X2wPohxZL<7XK?e{YTiHysjQq(m z-pn+rif0ah)tT>=GYLR;+wWhOPX#T0vP?d{bxNQ<>NB9M6VW{;31+&&R65tE4q0l} zU&ft-Z^80^dkW6$%I6G8>(G2g3aq|1?W&DWSf} zvk4Iko|?h8wtAkH?omUS)c_FJu9ZOCwubMVWoueA9IZmo0839jlbDT7=n#q;gEY>h z6h}MJ8>#MOy%wSons+NeZ0$p<)!XuoC1t8Gtu^&i&ekNNp|?Y|wPj{pGP}`$pS3~FBhzt%ps9Px zPr~(~Vg%f9I$K>)2`r7g&Yy} zQ>-niHl%$>!@5{-azSd)EXV2BF&n`jYLRhC*yQ453#^%>g!L@O=~YqDu|z$N-49{h zZJlHQ$lNc^Q=!FFz*bB#@tcJ`>TGSIp!-LYtekF5i3+fpIXY~Ik48s<=t}F(iKLrw zniH66@#+5O60Z-oD`(@%qhmvtjc$EHp!;l+{EO7%>cigvV&<(IgfIPT2)fheT=nCR z7e%;XGIz7u*D}dl^?lRC;qsfFY0k;12J?Cg>yJ1d>`ak`b=_yI@MEAaacD{?G43s; zXnDmIAm?i7+?+?KAR(f^L@G_v17TN0R5q118aBICn{(#Y1`6ex#eaOuu}|b5z4Hg^ z&DMHLyTg`)E||b`)(l3`(6kI3q*`BOHxeJfSvj9kAa$2mU6PUHP;uwbW~H{STjrNy zlP%BqDQ3-Jdw%KAKbs%sMl?1~7u!eIN10dPI2e-W>~F|Q@p4`D6r%xQLd@hW`P24L6gQ-3WKWe!0ZmScyJ2bQx75XVC=dvORoITL00k+sO`}iWg zt{QM^IHD4-Jc&H}+^zsLCu5>Ojc3J7P39b=8Py|w?G8Tsl~584K_gK$|CFgpKbM(c)k}8uDj_po%Ot7MbJyBe?5#TE``YZ zknXN$)<84-SZFuM>SR5z1J~_az)$|&KC2RL%@9_lWE#}dB`EH+DoU9mB7%Im8+z=$joLyb3-3ww9mT0zA(zI3|vKlaqGN+{M?wHs|(<@{A)N-Mvv(wO?kcR^pQC8v5Gww-;^~(Ca$C4p|wa z-NV4HlKoO62Qp2{nNTwuVOMXdtO7HrnZ^4#1GPgdozwFPh&Emh?r{^YSOQ7VUcxR* z%GT-o&>LnHWTmBf4%_E9cb|E6_mn5q?7)Z;--}K>aVjNqx{cvR<&)cji0N^yq7`lZ zGRYEgc-*q!LU)IK_g=-1`bXfLTEMPX-jO!B@eM3ZLV->NL+WPbOzmtJny0e}I0A!zJ`#QaE47af{s-YB1?FJuz zpMcw+T%GJ-XUI);a4jHNJ1LO(?>d|dbTHzQ$vN#9cfvOD?!?UFc>Sa=(W|;X9~rmq>=(gGf7rE{7M2bg{)rZLBDGu|;9j%F;UvqN>>2l*Ar1{%sv zWH|^Wp4_dqu_cQBVjEusK8hMZ zvd=URQ$LN3Dl7>E#0jQIKKp>a7sq#F+>lzMFE<=WZ@;5?s{V%jbX6>b=gMXYL~BKG zqHB^QQ(3l9vHBHjR(PTTZNIix>9A~FvQtwCQ?IV?@?>p*jd4<(% zN~h&Kc(sy#z5eYGYsTsi6~*k@$ugp_b#30z{(3@;>*=WT5!lfWl|T1P@n*HUR&7d2 zn|4XvR71)sclKjfq&-G3!#cQSrnzQk-f0igh+&rfZ%-yphc5GBp;m41e zu4O@l`NN=p{9E+75vc_vqTrE+^hIkqjHGn49wEO@D{0%tuAS( zX^ulgYDLmeAe)#tQFsX-aMNI8Qj+-NmaI1ko077#>g%C-zd+WE&$iiJ)?$?V~su+Hv6GdzfK>XzFBLYLib#io$Bip|2tR7i_dzd zSulEGBm|s+Qd~nm%3o`tNhAi??3mE{Bt#ED@4N9tr#LZ78s0S?cUjQrXJ8 zhlLvBPf~8@ZoENW=VO0`&7CMU*~;3Gfz5u+qE<=qV%x!$Wl-hry63IZCD*@vGQ$Z1*L_i_@Vyv z0a$L3M)}=p@@jMsnqTJ*!($rE2}$xJad~PXm;+-vcj(i`TJYx?_NJtEm;N~;Pq42C z5`yjGUNT$ITLu{C!=G&}eXp;uH4a^Uy=r@rty@D2=!3wPpD9(fTc(($Ffos0t15!c zdZsc{7wj0zget8bg4(DeFD|8r?EYXXqpkG&BQD3@ra9U~&!hao0<#ybw*aQs%eM0z z-NmOe%mvhSmuO%#$R7nlJ{w1JN+bn;Eoq)q4dTtlF&!ZKK%{hdHiYa8}G9< zJ*&DIKW~Yot+CRyxsH_Cf(G9)aO_I1z6z~Np~D6I8l5!}xq zRgf5UzyU3Dy}CGpNQ}2J*(o??_q18iQRCLGGBYbI1{+_G)ZTNI;^FqAc^b;9mH?c_ ziwpGhN~9BIl)-gMi=<5LPG|qkoPgb^MmpnkxvP9RpPT%G@aw8wxPaL8`#Z@bNpNc0 z{&V`dNfjI`<_e{+o0(>7DV)wna_4%s32-xG>IYUlG<5@;id>TW2i2j$-=+;F{?Zi*pGP3gZuXlB$5lNCLF#bZ=fD_fasc(egfp` z;oi$u>sM_MPtU?&|U1!BWAr3Ate0nI`d6cE>IipDAMc{&wi3L`zFc zE8P7D9#;D#YCK z=oLGW1@rRe+|;=8q`dZZ=}}0$e{%U|;Qj|gHGEd~kN53s^PxWIQ8a^7%V_T-7sd*iF zef7`Ji1a%tWfVH{_bs4#_rp?fpU?vPQE8R~dV56ks!IfRB%?1XopaW-_h&6YZ(1G% zZ<qzuN5qX=a?Z?SS?7rH(aI(3N4w@(pxBP%dj(c<$JC)D7 z;;)0wu;NA2dlgIgC62Lpof@NLfCAQIH2-bkK_&_C+D;jki`py*Vo&>_@V=>9u3jRQ z(?E(sld8-pHOX!6@#YrGaca773Rk6UghP<30Ge!}Vj`s`(l2Otf7rZl^())+ zDoj!rvF@gktJI{knL)UrF-RO}1luDcD;TOkw?2?LrE_;&B5#g%@F@@W3b`Tr$Epz| zaY=>JNpO5D-9v5Nn?TyXNO|;BTBIviDr%+++?3`+LSG_E_bFr92AiCR?&bvzD)0}_ zWltF2x9oaQt!}4siT{x-pvWF64h|G~x!{qfWlBSQ65xYkw zLQV_YC_JqDv=BP<;O$s3B_|%78+uh7UFzL7>Fm*;(C8RW;(u>_xXcbVClzT?gI?9z z>==G}Zle`8BFy_Jx5ad5lfcnE+jeiVr&m?R_qG(LXLZB`<}MSb&n}<=DI|#s4Fx*! zj%=HjZ<9TTu1bBKqZNi}uGv`Mn}{$ipASvZ-jpXnOAXMafV2?m_d~ZCm@oWfaXYO* zZFJtSUUiZLXtpF0>{N1ti7?;%;Kej}{E^uUu+rf@rik9&9`PjAL|0FA$xv-;- za<-=zq1C^CpW4zZl+en^;@bs?4+o!eK%A%*G^(*9`W-=-ve|hN=}7)y^?PbhD3Eg@ z%SY17R|+e;m;r#mui5{Th8?zY=n*uoM4^$lhAUm8#3@kmtO8eS$fwo%2G7HTu(rx7 z$7VBZY6g5`uR4477;GM&CJ`T$6liVwX}U+YLq_Uk*r^?(8%EO!1HL&S#&45g;Nk+A zuI*Q`5LvnRNo%<9GxiFIQr}# z)vo^-rL!Uo{eTL&1yUdUx;em-^0X+dYo1{P{zZd@p7yU3xH%;MgOYpqKG4a}KqsJ2 z61;eJDC>+YO^&m)`pz@x-+^wR@BGWB7XWGA=38_;jN;SDcstVvJJpPg_{n1F*Imhs zKLLR710jC_dP0dffZg5~hy=x<_Qio{kgwxdW{ES$qF*wTEtdr8h9yBbe$CLpQr8JJ zLI@=RH@81Zb9+SvCl58gW&ee%@;L4)%+Ah!AoYM{=AcMFJksj^IWho$~x zVL1xZ%clwvfNRes)4Wb~6N~6lE_i*aj1+J?O-RrK7t=Zv*WVk42gFjJ_o} z=X#v-naCk#5D-38gSC6`e2s$*QKH2$rOD+58z#V~KBKZrRUZCiiHPZU_8hl{mRTC; zstPEtfYo~XPt`%WBl{%(4?m^~C2ft(s|~YNeuN%-j#UW2zjs*d1_yLf`~gD53UxaF z^fq%~iMvSF9FRZOBqx&EA%t3o;@0L@q^nUv2)&4HnBrqaL~f6c{FHaF*IV=F`v{an znkLuI#HGCx`KOp%OLCM-U!O%F5_=aR^`_#%zTuOMk-9PLeI2;7!Uri;>8|^|&-{0> zqe3nuZP$b}lPptDM4OfJyk4H?rV0h`kbP+BX;tuaDRrXaeaZl^50T;KfF`{Y*oa2X zN@7Broq(i0s^GlgjQp*bpDZOKD}G!I73$|$;Q)L7vQys%3_Y~>W-psEaE47(v|;l( zC}gIqmiE|!l94it8ZHft_aU{1tMX}@X&h=pb+Ut=Mzde4lez#!8>+u8(~h&>AHn9% zx@MJG`m*PpMTWf=kALH4S$6woceYgq%EbsY9^0JA&cxxOhzXWG+yq$Z2u6Z48{X zvzYaDrj;8*>^o+(qD3ocZoTO`t!T9c4>7ic8)m$(d@vR~Woi93LfxRh&|Vgp)H}&x=p0 zYeC|x!D=(}WMw_oWIj1NxDm=a@>eltjlX`(f{2+vb9``rSlioCWwH=3qFbGpv%Fil zEQYk8dKRLkX*@jDJbuG;kw}yV2{|o!2IERBkTk#r$w0;1qb%32dFHBHj`B@HR+fEU z%n(hIfT;p#_I&R#=O&5^d5)^49TIHc^$oW5qC=o{k|{#(Bh7IYQa9}0XA_CRJo&67 zR)gCIx8=4vGHu}N8gl2z1#FJqrOJb%0wl@P$#{V}K$dfu0#8oCCSr1rWzY7oR4#XhgRj5q*N z!$x?2vJjXc{G)&hCy%IWW2)%g{CRtgm|SZP(H0Wq%BBK=O?Mq_W2q+(%9cnzv>(Jx zksp(FGA#BNa^tDobsBFw>@27Pad$X&BtMr`U%|$Alf4YhvP%Wo8{LOLg8%60*3{#= z(7vOmECRLI?6);6ykb&hD78BW9N7(I9S(P*z9LyD+Q$UYpTM$a3VFs}$5M`oAOhcRwi4qE^2YrQ3vk!AgQb*ypmO!0U?$+>!4aN|f*!Qo|zrBKO zqD!}IkI&JoyMo1d-nwZzdcFbXF3C8VA*p`Xx{N@0plQ!|cjbGiV*0e?;v96jC}4zQ zJHxhiV6sI=KE7jTpjLW>G!}jY9SWPs*5`h|+>n#!b#~iv#k(NZzs(<62# zn@!T4m^7|glWln(smc`prQRC&?xI^ogoG#x{@p(R(P6Vy7F_Fl84r)~R7hBEgGE-@ zA~a%uKk#&6rdh7Jjxmku;s9$c3rF1pPO^`IxYP!xS;TpAXwQ8B;kdzPHb2CjD@%rO zB6X=9?cPGirkL-EC3IYOhJ!sWtgg`Qm!*e0NXnnb)Kv zpQ?ss$=qU4b?YI7;&(Z5=F=SCuFt6?qH#i>o=+Jiv(jtKC?nqj?LFh}xOh>vdk*yd zRN&IO#a#ngh zW4+b6Lh4LVGiQ!2p99FDg%@Wm>A6&Ua?xv&2&lVB%J(Sw>~i;#D3$lm$7%u62Hbh+ z$zV9K5b`+8PJB{4jX5_UXWV#T7ZAz2KlqyDdxw-_NYjKG5gI9t)NGL0HAI1%G;88< z`J9pK_q2CN&1HH6;lw?u4N^1r7;7?#XLsusF^5hP-!{cIf2jMAL{{=v#Bu(r zXLbIEywIP$t6z7l>{AJo#c5s7a8Ick@ZM89n>-#@y=nnnr~TAFK5Ry`zt4l1l-gy7 zt5CV!1;(nOJn%`A#ca)9sFF!TvdK^dV+qwIF2BpvL3No!R!Wu|-D8AK9}&xPn0G1a z@of*Tgw#!YGu)~2zfXdtQ67$b!^{cFUbofMtVYhb(5bV3!i?f~CXQN}^}(xanH8Zd za#}TOboC9Xw!Wd_VflH<9rxGtY z31cI}c&?ge{AA&g0YQSxYFf@j>8Au^vdJ&>iLN1knfcx#E-EN4XZNLRqfe-Q+juYG zp4HvoeA~uOsx&Ldc3?X!KTf%YLSCr-C>n+Y?e zQ7|99YH1qnuPpg}U_Rc@WFMoBbR<)vX_;qvZTf|GNY(`Tv{0tvG+40$+;lR6iBAA) z5|__!DWvMGn(3xLq)HGz&Kp}gn@y|FVd`OGZMoBE4`%*}+3I*rkw2Q(8HLJPW8616 z_lVCxFId8wJ*n4C1+)8f&W|%@MDlZTW}{)S+h&VY&?;k_;QcU;LwRuP^i7qVj^()tE={d&PGAZ!hd~V-@uJ%HBv?;P8gG>9SevRx zjSd!o{{IaG5OD;D1}6tJr`yjk??gr$+j2#f24I(yje+{N+1YQSId_ybKLEu?$}G)V z1#6qj*CgkgmSACAal_kXi!DVU_Us6|>icG?c1RknwuPh{V$GWEYEccgk_HJ<${Mqa zq2+=?-jx^g))AKLH`_`elYtWHe{rb;hPoK$;Sb>wCctQvPC z?wnYUF&v4g8wm5q)ahgr`yEq?Tf^UW2%HgBxAE-bhINNf$Hasse&*I>%B#uEpv`)* z{Uv-dOQWA=;gg$?Os|!IH{L$pA35V{jDQR(u!y(t=D;&a(&kjKdwjNZ(5c51G`~DE zS8LU9eY3XO5W_zc`-fr7W@T+I*%al0k-0A=Xq#yxW7j>5?Ck38HLut?hp##w|A5aQ}eI zwpt&-(r^4^v2IhMltu?wrNQI6h*XVM`@z)5AMcgM^yzuSl~S_tS1!$Zx3n3Je0E<3wpm%4g6y~Q$9NE$bd7TV02mL9=-mS zjJnMDJ=%6GI5EcRVC#j>Me5}w#$~b)?vLoIK>M!->aW)Sob92ExZ|pa%~b3A`Z_XH z+|mBWag31YvWY;y>gehE;k!~+q^h1|gbB>%BFs z56V1h2YinYJc_OZ=eQoN&s9w+%bppZC(P0bt@cAcT$~Zrw!aVa>RJ7$DPfu<^isde zYd#71^zE&Lf%2-{)vUQ&Yi);-?`J@0xlNtG0b0QNka?qU53ZwYFo@h5UQ;t_cyU~}n|1x-e z*KR!?%wD{yHQ1UPnSO@#3bs?|y>qw3nddi#QObdq?F=6k>KC6;1X3mmuY=+<8jCYttz!-i<~xz&%bmnh0gr8Q`tyQ^c_^qPp}$~C`b;>YPA$urVn}OhwMQ+Ohby+_mC1C%OUl+qb5(eiM;e9-tKBK{Rohl-yKEZZBq#b-KY(?~ zix11T%=~^-48Xm(x5-_#$ z?&mf-BBRtFdVE}e$ry)g7<4P(V5j;*Msov(1_uQFU`X!@ZPHvaKWiVcNG%v(mE}rW)p0AB5(qqcsp`VI9@e1L09UvM)Yuj3fGK4pg;#wd}y>H{p4my`7ghuFS$S1gx$iPmNuAr>Flk z5Dpah>vDpk;>?Pu(CW=2)r{0Xcoq}d?r4vKWj@oiY z$!I=?F*S>Gh(ArQKC@3NJ+A7z+Mc`OqCMU1J}yk;nbN#5TS6+Uu1u%NVQT+GAHAZ$ z3@fIZ`!q1+LSCq0$tSbk$+YPRI|lvxyS*#{;Y%0% z238b~Y1=6-!lzs_#Vqu=f8DyiZr)$S4@j)$KLO4h_xa8S2vLrLO=wd*!_fSifCDmc zOx)zlv!3thrzM*-o@MSvp=LX#eAa(NSf49 zl%2lJE*wzt9n#gwCb8^P2c$iW7il=Db4NYF{u7yavWW{L!miQ1H)Szse)<=O1pPRj zg%GX^yEwj1cQpf=AKoD&$viO`MOSoIEWm0s|vFkDKe)*4AJ= zEx{jua4@eFlR1(h0y_}z^f^#JinHSuV&>EGO^An&(IdKk8Dg~0=?+yclZd`ff40}- zbh}OT#ze@78FTs3`1ca}%aTnF(R}vmwrGMC%_VTN@^xhY`1$i0-&8fYV)qwt(nANr zxH!pY%B^&^OMF)WH+?UGH5Plc^)*}tlTdxt^-a>|RMxkSX334MCPvid>Xg2It>HTU z0^M-_sy+*fe~n$WjTzQpszTmHFf#*tsqRL6YsT3)%-z^zE}D5|58$lN^eTf0hN?%mdyn(U)Lsb}$D-P)}=GRb5kcrLEe__jDH<%Gq+l_fqvG`NlkQj}|DQ z27USfA0c$y@nKSt$RPr0_~4m-iQ3Ql6tVnkS6?=`{nwvyXZ1`6VP#Kk59 zYWVb7v74lTpQ*RpGPfWb9yqa`^f`m)C5Ca&>09s3-f!wb3vErv1(Ah@=H*+R;q|^4 zt&HQAJ96%F$+Snn%Fv%<2+=n=cCAm1kx|s#U6<2Go75HxV4<}3iFE&)Zus5EK;>}q z*JPWSHX|H8+G2ditp!gxJPvKOO8%ShVt^gbwm7(#XXj|C{<~uM5$@^c7vqbYc9?2f`nxSPK3I-_ zIvVTTEwpQXOM+(8BzUEc$I8yeex~-a`(e*rF#5@FTHM%;^M`j*^~dxeYcLoIN-TzMFL|I z?UP6B)|MG_+dW0HRPoAfJ*2s;_|% z2pTbzqWoTKw9esC(R2(IkuXten98H!tYBj(S;-F;k^EeWd5Bh7n<&7TwcCA7sxS1M zl8|p146G72euaJ6^`I~N|6=dGgPL6XeqUWK3q_(Ly~HIV5UO-Az)}PxNRZw^K)Uo6 zAS6qw^hY3|R1snb5RhI3B80M}N|z##ARtW=ngK%G_p{F*@1EK3dCxvG`|Nkm+0P8l zAPnK=&V60iuY7->uZjdL$a9ilffllcu4i=MvQT zG^`Mi&m*<|sYxXDG!MO$ZdnM-`vRK7#YXpSz!i6Phq4pBBh>&pYl}z|GMVe@;F$=H ztZwvB&tJ2f4%s%c%)Hle&f;@$-aYaTXq~_2#IDt?0_s0pz_45{fI4zGBeegbo1W|B zyRBIOv(BQ{mPonDV-SJP9z9OfFJ6k=w~KxRD6Jh-8b)YRDs*Lx5w7`s5bHST^xeTt zci#SMDepJRb4y^4krUrev9OGyx*Q_>>R~Wh!|wLhB+xfQr!u7kw7%3WfjU8n!kTm+ z8qeYL(~|9aHbVpQbaKPa#m%q?q13pd_>eo1k>r7jyGQ$m%D>J~xD)XkY|x>1vw0q} zem8>r*x!5aqX%{!J^SVjy45Ufb61cGU3J~V*`CiyE&$|~3o_9&dKgT5jEAcx)$b1K z@WbzzyN^JEzqMfbj07!vcE5#(UgUg1at;z4GBqJt;B|fTUHDB`F=BkGx>mVCm_(O;MsBLp>1uLy12S2Ql|FuF!pqhh0mbSe=1`)IN@!O-aGR;PSD{lIA5AJl`td zfhP5oJi|}=F!?MuET6tsk1RbT%2_*2+^rD~>>3cVAK=BpDh_@<0bYOEg zMheB1uA52G=mSjORgH24;Thjq5In|?Y`@{%h(MRKyOW9x2&AZ^I9;zS^NDF~1Jk+< z2Ymuim#W$_%2z#UyG*MbwlTzzy&fR%-jMNHm-@ZA==yHf5vpQqqx!2@h+gKVOb*0W zQXRSQv-UfRf*JzXxpxs~6qbI*F)uNMN7u#}BIL5wT!Vu9WWSKbtD8AJx2B**6pee% z&jBWg8~OL?K$4%gtIsvt^;!GuBCNI5mpL?)=Et=L^)6gijnSy)|FUJ9VkV(8P9pp7 z|0sJxt53e@@~AZhYh5a0np4x46+Z2^ka-=p$AYSmxBoLDfY z!S(LRz_fv5DwDTx_-CgAB5lODmijX;#9l^UKxgt@jt%YNiw2*FH4?DjKciw(e8}79 zNIAPo-_(^3wi}Bg-A8+c)%4`ax$}ITg3`~Is)T!WvCuA6>oI&%uW@BY_u~|Q`ZH;E z#XI_eE)Xq(bAVY!Y{fVZQomMc-dPQLMN%17fXwu&XQq^?*JOE)<_mnw3&NX(2x)xp ziBu0RJ<9s$v3g*+Jo2$RzNjA8h2}+a(?7fsd(pgcvzGJ|pu0uV zNd`FYh}&2IWwmZOTJb_wx@7NdbED_>3d1{|o~}%WZk{Xp_9`cCFz~nv%eRXk$Ft~+ z6B4Qo*DXOWuo9yL!?|2eWNpfXJD4yi$7?sjVtXzHw=H+DJfONTmTU;)jBQFG-@>s3 zXIL8AYjx6z|2$54;u&gX3=Zl=#`QW%SOVHj$brISVG0?%LF5hBQ-9zUr`6N`YJ~$* z3M1#2xKHelJU_v93iM{i%jUB18x+(4vyWH{>N5ILv^0gG`jJI3b2EBj$_C+6!37a8{4nAdzY7MR;|ic>%wxC>M-NakqY;j zuMZ(HtQ6 zqQW9H#CtLWW)4yO=h^C~wG4QKbtLI&g+(`UP0A>AS!FFx;j+(X%<$k7Fbc+$H^v8?o@{wn)4 zg3605oSJ0_HXOb-NHu@vpx$)FO^K$OME5!>fLW=U6D)%9_wzR`a!cTW{x}Xh9bQqx zTUl!688s8ADJ|;5mo)9=p2cm`6LEmDA$j_;L&F>Gnc17$6uWgGnab9y()7NPKfY}F z0Sy#?AbrksYE0F(oB1fWBblOKd=kQpRf=raGizI3A_D1At*Wn}KySW6^fF3-v@3O9 z&XP+M4s2>07!%d1-}76p1) z{()U?Y|2A*tSuc*LLS4FPw}G}v)+YRefVR;6KN+_%QnwF@qR7rVtvBaCY5+tLBC7c zc@Ega>?a-=T|jiqa%D$pdOSPWzGz-kAhVx-4dHE4I7L$&LhH7t-OUrgOZyUB9o0#u zwG)bYbEle{yS~>c`O7g1^Pnr=LYDQw&-3$LEadU=-J^IOR{A4*@!>o|e6?Y-S#-V_ z&wxcL%zS;k0)!jfotN>6Cj8ZVZ#eF06=lN9G~ZDXGL~twf@hKJnZZ@M^4&K{W+)^x zFD0KCuL}zh=|W^QT_T}JNaWCYqA*gQDb(?tlJgR(78<*Nc;?Yaytc(qJ&yYMTBD=b z^I7mVE939uxW$Bb;ZJL{Mz0;;qeda^HE;GJ3^J!F$1sI7j~Z3QLI`NS=hQj;5e-JT z3pgPvS#rYrv+fuhn}cHP*mAqF-d}Gn;bE_`G`hS6Xs|9b%v!i1iu10ar8&}Sj=5%E zkBnxGW<(C*bfXhq2JdGkEAnP-JHJdpKv0Eu;f*P5^jde}9h&l+oBTP6Q0*`uKTkjD z?f!dy-hO`G-hdIFXJfWaRQ}b@XCH{aE&D1CH~-Y^4!96zQq)wzYfK`)-+0{h#6PQg z>-{S$xM>FNq69oJAK?F3PgIz|O~rG586I-*CRzbJOz8i8ww>lJobeH#E?u;&*c_-{bBD0=v%bEri}!T!mR zl;Ku@O4{=+oLdQx#tZgw##QJq-?_fodB06Uk0rjVE6!$uQfARJS&>|A z3i5h>%sHroXmNq)oF%6yMS28iPn{|lQ z&zWKGhHsso^fJ~G5Sy|~Os#$eL4wi%3{GvNhopE#bUQmdgT z@Md5fE+NfcE4tE$$`Fd}`!=~}mkvZ-ZPHSYYSe%>cF|;oX>N)bm&3v*!%jfrpE*|2 zEln92U7QO$bOBsl|2}=CDTW#X<`aM(P!|ws#ijl_bIFlmfu^RSyBtsd`M-p2Sr+;p zQ)hAe*BLed;`3iWx@1o=zs~$I2d<6!u)Vmh<#r;}w}Ju(gdHdL9O-fW*J7L(kYPrl zPh&RG#)rSoIP}w6{7$APYYGQuqJrkoAI#PcQ6uwfhcA!qeo8WD`)jP-n~s~Nq7rsa za~i)Ls^+SulTToF^9uu+^p{O4%8e@##JZv_;3`U2px8XRe zmaiZS%w-Uw+`sIq8+|$T-q_c`o)*zG32Z?~j@bp{C*d9$6WU!epYK5(~8^Mn4qcc#8`8L zyeKjFVqBf)_8R44gAoolJ5=0QR)y7*4GM#b>Qb`QRwQh8eHh9-e<=uF7d1NH^J-pH zZJ_XR7rBB=mYC5iG{)xMm$AdkxaHNt4j&%+0SpCg&}AcZX=Ty+| zug>o1jkZN`<8dC-1eajhXTYS>H6x0VAj5#hUGYXI`20|BoNKkmp?XUH%?X{U0_oMF zu%*?-hxvAa&m0UsGI(D43$X`_!P}7yqZJOhc#ykE)iu>eA0)a)yPG3lcAJqb@i5uk z98q)D_uE}mA+cm^%5V_UH%whxRr?B#*8sDpt7LCOFVB2eSe5T}Up@jx3ryaZrAy@i zx70&+R^;R2d0@4n0Yx7N)Q4cr@Tcb#duef_#AfJ@*6s8V>Sm`f*95_Be7sllX7uz4 zgtV>sN8xmj&sn0uw>qkUt#qAHm1ne{?8lTac4~)95pD76Y70sj2Xa+SvX(J6<-1?# zo$JQiZ<=cPS64r37I&Llp%V}B&BMQvXelFa2JX|af_?JE&p!n+l*0SKNjNDth$2o( znLkcK4D4ep^KhZWoG^$TxIfkYaPa_5<{^RD7@Tx#>K+*s?eh)5XON68&?7t5e}nh` zH1X^Z8r!b_TV@BVb1wkz$QBfdx5t3O&;bEKx1VAX8II85JNftWflbj#6zc1f-s8rb zBTxouE*~d|n3$Rh#SIO*0b(R+1daa&S31_JZOKX76y725MlZOGO`erU^o%w!k zBZuE8zTPSD*|r#9?%VEenm63u{Gq+jwjFl7LH^d#@_ORodtH+SUZ?c&5rz51#30B~ zZ)7^*wVTze(bQ-5C?ii*^7pPd-reyOV28uPufnb*g$9P@W5q^dI-LR;P`PGxITCrj zrP(Cz$TWXN?Zc-Q<(1n%<`xDXWbC)@!r%N`w-cJvL;MYOmA(h)5Q|cT<*3Rp0lozI zQg5xM03B!SJtM=oiM;1?Xy|MxKj}MexVQ7<5+NYSH2`XK{aWWOQ`^p4s0Fqcdu>e; zLxEBpfHzv!8j5scc~Rf=aqp>(-9DFRvwB;WhXiVnmQ=kPay$*4<>W<2$nBG|LsXTdw!^1C3~7Xht*+WgT)7@6MoYz z9x*Fn?wXikH6S7f5-5EE|K|GSQW@NAjjw0+ah5yxm?sRd4!cF!ni^6(^ek2^&5cwX zUoRQmXgEn%qTi)jlHIpXmkhPYIi1Aw>zZe&w=rROM=L~-u8NQQ`PG_8nPR-%QPWSA zoWOywFvW}yLqUH$wh%wm77VB+6s{eOaJnf4Ay2@z@`K*@G3u|%8A+x1&+qUiarmzM z>rR)-u)LBRU%$;Eo2587Wk`K&(Z%eV!W<^4;*J=#PyI#={yjY1 zzy10D{jLx8`;OjNR)dxa-C?M$j~Z1k+}I88MKA8r{kLy`#i7i0)$NgsxL;>%{^e@+ z|MuSgNB8}I*YEwy)$BhxE;#e}y#8^>LFfKa`pR74j9TycGXeZ-as!{w-+%ZwU+<6C z&ek;}XI_3ezw{SU&vEJOY487{3kLgscTF+Q9B1p54`=(D13fr%yf#JruNwtfkRvEs z!#_$LWZE0)(kTAhRjf7gBSKjQ}f4=il6qGHBrI@bjgOG>2~EH^Q@7s(etqEj5NqBwwhQXOs^Oi48*_a%jZSvQ3L zpb`_>?gWvyZFU|7T%XQ;@Y6xGsX4n}@7Ddjd+aIKcTzdbP{1T&k>31XqP$dvMsW{R zGNvSVY2C%sDd1K9(*UzStQ{0LdwH#Om9EjVTt#QvM-m2A*UslG2dGM{v=msA%los+ z0gcjlUfOOsrVbz0D%_G3GEai;DtcS7bFc%Y-HW|VO`Od~&UK_kb% zbD8B<6Ix!4^I3la(zkiO^5SQ+W9a}L-mVZtT`d0o+jcdx>Q`M#T$yd6QmiHxo(t07 z$2a`@y7L&R(aWp zLb)r}4UbS9R)3rKds$S#vP2w$H3}?kFhKY9aiG3Vl|{i$a0l+@h{xK5ecwiNL8AIn3a$1P(a zPSoCUL!%3GUX9XHmdEDRNwQVg4*i>6VgB?d>!}c8Kx;sJ z&ALiKlKiOYDvawp+IzU7Z#eY<77kF#$-GYZVNmX!9?E-qdi?(Nr=@L=M$!ZGIc_7M zN>Xt57dSDNQ**s9_}-1j=1=GFxAuK8Y9usjqfh??g6@2Vc6FRJqHw&X#&owD0mV%~ zGME(cl@S4tD@K|%j!W-f4zq4HQ?}tQqErY>C5_t=Lw6NVwYqcvsky8F@vVNm9=~&7 zaALq0ju`p=>rAhmM7G6<9Hy3e`xABl>od5>?E+6{|B0K6_1%-56YsE4jax0{lU)n z9mt#kH=tv*oEM)*to0QM(}TK!DfS-;mGqzoMY`1Jbwh$-5XIg^2r^|AUstvsdh?QK z&QP;#=&jx9t0grb89UEaWx;*(Itk>qCa%~{0DO7S+*8zJ zmb+tHWMQ~2g75Zk@0?!XEC`SwKvVx1!&*d z?9qIQ$-z6#c9$h4RuBF0$<^>!G1F}MoLjEOYJt5bEAUZ2Z95$g@^_1FeKp-UeoSeJ zuRH(atl89AOD|`59nZzg(sbii z8)(Ry$_l}nySi4Y`XbKCt(m7HmfxGY_iq(DCL?rH=FR>uXMmo@tStBEhCTITp$+5q zd`ArA!vVKy_BzGf_G=l7@OsT{M_tSW`18x=lge z@91biexO(&`)7I&f6v6*Sq(4=B{CW^a)lnaV^+9MZWymGFf|!%Xm?(v2t}}GVgkTSr3RQHtDe|pO=g-dgRot7qw0`Bpcqg_qLeW4vs>t zk{*o4eQqNbUcO1oduH)t%6~+r*z>Rh?4J!zrB}$32jM{pf8$+TUS#$;OY}CiClsrX zl0KKH(>=_)odwk-dd-#=TdF zin+0^vLPy>Ur~cv{IW!kqQAhbOcgJOb5k9B4h(%Np(#;}s!Y6V?`6X?E7lyXI7r6b zQckx|bMfY;c*9Sl)rRKf_-UL8Yw3hp;gN;9b+&zMp8*IeRbz&+ykF9W|61Sv!)i}g zU!u#dCNTExylJQgrNe*!KLVVCqR~$QGPXDm$#Hg#vbN1hMRz)|(MIAMMrMfJKIH1_ z8z>3;v%!SWb)+Gsi0w5)Gq}LT_yZtG^QK}~J~BreYcsc|l^4bGR{Ox~zwoes*dxXk z?a86%C4q4>v$I?O12H?ok)(A59R2fvSkUkLxyk=F1^AzQasP+BG){{(=-_yb7_i6? zKbJVoA~(>>a&h8YVT@3O%U>*?eu$r=r~_0U&=0wPtH)~konndJ=`(AG_o;>uq#Nj2BiCNL6i+n5Yn+`DBWP%i}d|`(Bsrl5(L#L6UWc?x%o~ z&^>+bTvtR+3elbT;@B@;afo$y5l$1z__8s}^8%?96)w1I-B}GF`jz<|ns9ok#-@Zv z#O&_%-1oKZJ~D>~&wkh_BqP8{ssaKAXS7bWt9fbhqEZgB(I*CBnGj17WSTD~gf?{WdtKB6# zL*Df*7yM~M&t08DBoz1{7Fg?PO6_squFcJVaUAi9@=-VP;q@CpULp^wT%+f_bfQfZ zJD$(3gonH+Hi0}Y-`%jIKZMJEEl_%8!~*$8MwXXp%KEU3Lg+DEv2S949w}gwk}v73 zQOJ=`*;?LS@ggXd=e##Jv+?XT)W7>SfpLxJP>UXZqR8w6#0d;*7cxPPVMQNZGU8ys z=`qU&d6xvb>%`LPKgeG5=(uWs--`Q~^nlu%9EM%*dywQ>>*KX(I$5aFM$9$Er3nV* z2Dl5Z0UV{)#V;)vT$B3c2Y-ira=N*@F)8;dC8!j;wc&gR@xr3wAW?4?a;-#1i8bH> zHPkSEK>nGK$5_G?tvLcwsT0Pv?Kt%Z|ND}`X+_Vm*ka)aN8uAVUr*%_Fx7a3e!GdZ zICs*C5{lilaqk*QW^znPRWX!k(Q{qKhy-iHvyYZdscF^cJ8H-SUrishcut#)yX07z zzV%lA6#fJ+w2HsH1CB#UxuN)7XeP()&(=ixKI7RP^q}5dpAk6&TLBZI5Z?0OfGftq zr4L>z*^9G0-a?bzowq}JqKf{aw{dIr602RCL0fGXLgvr4AWOv|hWO!Gp2&77IY$b$$ z)%*2K6aE-rjQv0-`L-M|eTsSg>kPA!CN}23#&{v` zc*3=WJ`jGru~=Wt$jbp9m6MxjF7(0q>55*m))A!Ho!QS0XkIJ;T9v}DGcSDsCCL+2 z;_02oj7R{?90a^*cN>s#yUQ-`oLVljRQ#01sxb1O5dpK4Cg8`y0Z66*`tNAsY3d#D zaeC}sEnt><%a1xvsougZ@63ulq%IT{BSYvQR~%yc0c|SvdIY?t65%yqH$L7Y45nQ^ zDD{@9@boVE>gavU-gI|oza4GRV6T4IKVmXgb8L;4!8Bl23HAxEzfU0$eKvw7} ztsg?ZKkk_zO(LLh?)*73cXcW*zPpzjYkS$o_n#s5V~hrUQ?!e+o3HE2YK%)CSmxi~ zB+ciq>y}0l)H7gvFb;Exrk(qxmQp2rh6dZfqdDD|8hMC01rl8MqGYCIN2VDq^uy9z z0b5UN=?ZGP0+IL8;g6}dvxH5{ejHnP)gs-^#}_H(u~Qaaqa!G<8?(2_MGv~%h592v zS1of`X|&8emHpd{2)ETPWl&lu<=&%$l{>1{xOb07Op(XtGSNMP`9l zmXP{*D>ZkUVPG$>)SKyWLfqVq!R@MqOOLp zjt?k+w;e0{K-T02haca@x7Xw{Id!?sTtMbKeEW`dcM|Ee?H4 zuP?P%DS&jtl50^b`nGj--;ux00OvvHgM;*FBGmvL4{juOZ*$D`E?#ALE`iQ#;1c#< znf^K2u=Aoraqn%7LAuxozvgp~8?BQevUQ2Rms4Y>8vk6dvz;DyYLhPR7M5FOf>(GG zSB@;sDGXi*q|7uW>WsrV%tXNI$|3#r-u+Y=U#k;XO@V=FO1e7kn$fwgS9W_`hL+va zq|aXYJauu83?s`HroX+bT$8ll?I}AM0t>D?a%(NM3*V$mx|~>gC_C0pm5_z}y0VGa z_Kp6E2unB+((6+%icykQ^`7+{uivzC%RTgNXElgCF}$XgM4$|0HAnZ}Ri1iX|Lvr8 zMt1ZAThYW)n;~2dn?_o8&!VViSKY=)wPtH#94pKZ8{EZv^PLh+a8T_}9oUO}W+B`{ zkm{azg>KeYysP`m7+A`>lsU9RaYgDu8BB8wTBG0MkZ1bXiumlu+Z?TC)G+FAv>?O& zM2GPkRjWq}%(zKw`nV&waro21L5d!-OayJBgeHR9gJ8|xcRy_3oa#31%Oso`Db&4Dr)mz?!G`y>(tZ$X+$%9off z<~P=^7psbF*CL~y4agQJcR$%&k{nWhRna4} zd?NzAt?CQ$g;-ix-!zy_lZXD3qEr;qW=-Qb=`7@$Lf*px9!I&F#np6DFMnE*yVNW? zo}q#D%+C3l!=F}zxKR`Tpgvdfj)KG2xca6-9a`<9Mz!I9>=pAnbg8OBEk12FOQ6p> zMtb6}SUzD~k=$cJP!C>)#c6tFzyq?5%vBu%lcErV+Fecoyst(Hi5ON>yr8D=HM~uI z3HLHA{{~h}qJI=Vq{|q2Fw*7sJHr9k&VQiB3xy{%m5_>5y{(^scOrM>SK~GzphDn_ zDYHRrI*bQbe8>xl-bU(`Zt~}=)XiHDU_YTL5*-5f%Iw@tfl;;go0O?-bcq6c`uCMC z)pF|#KCc3_I9KoBbX@k@-ZrSMeDP{1=2N>z_I_Lf2}qfAHDVK-GAr>im$azn>ttMJ zcL%#=t)z8*9;ltan{}E7;$o4~dDz+DzWs-qgmS)MIaEILXUU~|@1lS``S(`fqMsuw z4ri%3J$`HqTdMMF>d)oHty7ARN>>qQy$?&3>7Nr|^Gt`@+R5NKfs>*8KlMK(n^UV_ z)E9U^^f9uG9^U9$__1i>q4cnFi^3)gtF##>QB3Itf6fs=! zc!124MTQl4z|s`hY(e%W#gKpC#bG&0d~nnvD~-!;H%%s6K2~lf-rhnn;4u#EE)!;Q zC*MT^_872#z3;!43zxv#cu6j!uc14&0ls?roc7^!dJ)x#$?|%sI^M>eR1}@tx-P6l zKc#8&Oz{(_ZNzbc?=z7Poa@JK3001sHe(*@Aw}^>Yl@+}Apn3T-|*ZQ&~162up?K< zLl5}~Rmh}WOb(CtvsI$7a&$P7thIh@7~{6qC-Wid$Odm`x&2M2h1-Nj4s0y<34Y~e z6t`j%2Why-NL^bW*K=|NuNC>d!nf*I&Zpmp?Z%P<+L!r5L|IN$dof;hDH_=Iik?tl zl8td);E+hacVdq)Jp_mz(dh`bPG!y8^cp|kUuQ0K$RicwZhVGnm)RSX&3PWSmRdAr zc(%p^X3cs=Irqn_r0R>qr-V{UP~(#xWUTw~?u36+5;y&o%fL^i#s%NGvN6QS5? zT$=0^J&^L{vMJD45#>@WT^66nvR7^H!oWh*%wfJt*U4X*3yV}^pp10k^bJGggabu# zyc}GV`0Gr=#l&ZoN=4T<3U4*3pm^y~rCt_}bKIe0b3&GSb@oOl7YAs!8wiMa<}|58 z__Lp4<8Daasa;QLc!vPOnlzKn?$V}B<5VVO`NvIXXSsqdFZvSykdDy^!KHV0q}$w)!v>LVPE&afRfwdz9S>cqI%qFO`;BA*=T#;!RZ4}3vhJ{$=Ul5p; z)U>)^uD>Uoz)h2p6ve+Z>+I+3TE;mb@=Q{#CrM-3tj32NaA++?{XotBz*nUq-S9LE z=?LUQPBdIk9x>6e!7>KL%@98=JRtr?Z!#T4and6Uf7|OtaZcq5uq~bkU7dg3;CST| zLW()bUBjOH^#k_kbqMJ4ceu#=`d!tLb4!iqMB`06n;FaM6r`q0bjge18Us$Fv#BJ! z8SWKSO3j08CIr`ioI(1eZda8pd8OJS%38-)raC!WQn@6y%XL!j0B3a3Xr^`F-J?ID zA*=xIYm3Jz?KtLQG;ZS2o&3aSzs>-aipJ@W#3W5k`g#<3;MbWebR)`OA!zItbvj|2 zan~bPo~}hw|E$05v+~-#`6Lt{x)3SnCsm5*`Yo8Y{8w`%>Br4ay9+|NBy3#ow+bP9 zXPQZm;q>vLEC?}doSYI>z$;^p{c)TeUDp;G{#TFlon0&>DO#1u$aS_D$b_*R}IsJm+bzAAm-A|}o5)`b_ zWqw8K%z3NwW>+5mjJ3f4mCTG*e@7?I*K4mBvVcjjl7xwslpA+}4Gp6NNejfMC9mKk zdu-w~q(^@$YWWq>#oc?f;vD&y!l<6bnrc$J0A+eRfTr0Q5}(j59}mcHt3gISWe)cu zEAQtPreE%@lgY$-72bTUWa#o}jB%H|dDkb%JlV8q^4T-&0LhVE{@L0eL#ij~3a}%w z-&eSV&PzcWRTO)4gYo?ZEb8Vf{H*O>s#dLvk`_JA?X)ys{><_eZ`@BVP|w0j znubX9`@cN4J#hgZ1Z_t54^bRJY*lebXN1dRyu=a2Zq(xNj_0BtE0CI7wFYa=g7UhS zn~#G%S2Md@5B%$ry3uYk#yv(LNuY6?Rct)|vzWiZ-Pm5j1ekXVMGzTR6nZ1Vy8UJ| znXF1QHoc~{`Y~uYCF)#ngnd;Bzjm3e=Ylvrk>+Sy)6|iqCYmPsw@>xkv<=mjm)Al< ztcCt`**O)J;|i?epw>xMLxQTa$#+y)#{uIqcoj(U)B6KaxZ&;f{@}S7PZjPw1D6ES z2CaLw%^)#4BmO2qooZr{k!lB*FEz_(HG%0Xh2c+irfIZeJfjB*U;(1vpgaF$Dj`v) zl|uE>2l%1)`>zILWh`>m6ByTB z4jG?;iXC9RDM-_dAy3d>)BGq??~#&Jy^o=(K>_X*!zXidMj_Q+AZ%t-BzcG{MCcFE zx>2D6pCGeoMIkUe@*yzN>2AQt=^D9wNBEDm<~Cum>$@qLw~7yjZw$UG=6?kf98Zy( z!1#R~?{OA_Y@2n9>Vfn?iPh$YV{xpD#@%h&Mt^jgRKSa-YF>Rh5#$iE@2%X*!^;>& zm=zDP^$MTrPv9=i=nsPn93XU{WO9CoevisrJNyTY7^CF|%)s8gKQ@xw=1S$!9)GkT z4@_{sX-I!OrQKILe=kaUDiKE*%~AvJ|Jo=|rb zsE=p~?Y=0syy`eIIKq1-%X>i(zy3pfE z-r+;Ikc*O)B#G)fd<=#p$fWmfRnS~YkZgqOw`kNXNs>P{*O8R$>AHq>Tp z6aHWvYw`|=(844Dh`@_{niad7Pc&B0LTG?}j~yov{)bo+x>>rM3=#6QSH1jgnjhdSni&!K%lbSc^G zKB{S_u;^(Hl8;)^b;#t6u^iVFL%PyB3dmn?k5E9}mykN;_Ob~`7V>sTgXCSGbN8rm zYw=PI8u#b!wI*$LU){h1(h}){L3vMOCcfM5+>(33Yo=4|GCL|LrBL2X(v^?H(UQyI zoprVWn=aU9u*NC`7Sv4%n4pD-j}_kL;I-5_H7R{sp_Tj59qC^5#KXM5%t-QLnR(tvH%=e?cWn|-v!dOll5;6%&O-fF z&ClGq5%%??h~K>)G;xhep0!;T+)HD)5Ia=Cri&?$&zJwJ&-efTzSY0_eE(68|9{Q* zaB`|^X_uH!UDk)S3eE(muU+X-y=!%FPVLjTx+iC!rybooqxuH)Vv})3tGVmn8of*- z^b%!c=EHJdisnrqsXYM1N$vQq@Ce;Y)(EUH)=*mbO(rgyI2@x`hRL+Wrx;6y$*CtJ>#LGdxX?Rg`%gNUSj zSFMUE^K!EgF<#sN|K|eL@* z1Rw@XATW%uUN+ZJnlzwVl3Z^X9Y9n%rTTUYyvw%C&A$9E*>$itwrwHQMBIwJ9+2gv;yqE4siQ2Q^7=2KF?* z%Q-+h_N;9_|MUDAv?4%Ztv*t(rb8@GF@BeUzF#l>$Z-n&ka#456#jLlMj3#=n%gO( zoIX14DpQCjY}j9C@M_P0x-+Ij?DsV$(x&>TdWgRWI6W9|FT0&=a~yf;}hVdn0V>s>5bgN8wShSdA4LouxQ4tOnc$GMYBTPCHG z`IcgO)I%{olqg7;>E)hxZ$I}b=5U9-BrPL`x?VB409H(KQn3jybXlR#J={XHvo~Js z;%jFw=Xvqr`Pys_f+ty0C-QTFC}1-7kHAf`)Ns7(%O^r=J(FEd-vOS{PWX650*>D@ z<13^ly5eG;No`n4215=A9|%BlqzK@%jJ`}Sfs>gkfLf5B=#gBV!i3V=QxizC=MhDH z3%|8d7n-Uz9YmU@pw4?9t$HLw&Thjuh@h^^)%Jw1jSYepHg$AAqX}7|2CJK`%tWe7 zPoc{4u;@qX0SZj^c&g^>Xj0|(%1M5(9}veSkjSpuXG&gF=Q+y}t$SQL2p3t%bNGAC z8)MOCPsvoIEs0OlAZMyiTj({^_hy?*96+;32*#O&m~A@b%hhj0s+&cXwB{NY)uv!~ zN>6_tj#2@d0ti?L3?RN(OWyt=#nAB~kIejhJVB7<%RQWI0CJ*PMD*&u&r23+~=3P%|qL zW04Jg?4@5nuEG8z)kauo32$L&W>&kdZ$NPvD=*8cF3(6A%ZR`QA8L7PEfp^AIy=@( zpXTXx`kh+NUPhgzpc(nTfX1Me&%jliRuQSHfght?v_eFaeokw0h zjc1C|S%00e9-E`c_9e3c^zBR3lCNE}?S}HgXC^7|BsUS9bIJF{}fUc6Z3vC&b`A(E zo#YZTCgUmI;;P1Z_VYonKY#qDS_#F0Dp#*sd0qEyS>c1pw8QO>B*skOp)2O1aOnj= zPW>mkQ%dtPJz+^@>->o_@-8hTt~ZDBf&s=O`s~JKog<^PAGHA)-N+TBPO|>QHa3lq zprj!@(4(9SFLqb-)+qRz)mZlh<9&G_8KCmC;T02srQow_3Vovn>-V&4IiA1 z4bwXDF26+GeB;TQ4d!7J|3Aub0=oLLda+b=ojG_loCXKp{0vKA zxwU{#t;irLVBi{k7)d_>nhE{@U7QOw)}itlC5SlJO}qfTaHy#=#V~(ES7Y3v4Bciq zuxGOw3-P;VH|Hr^W~D*su3i7B`%p

    ;yi%s#QCrfUC)OZ!;pH?gqevy24RnN`voT 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

    )=?fP)E;ElT7UAC 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

    o|LXa{Z=D=XX^rGAti*e^NB1yBCKG| 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 literal 0 HcmV?d00001 diff --git a/protocol/contracts/v2/TempleDebtToken.sol b/protocol/contracts/v2/TempleDebtToken.sol index e25b9af1e..04ca774b4 100644 --- a/protocol/contracts/v2/TempleDebtToken.sol +++ b/protocol/contracts/v2/TempleDebtToken.sol @@ -1,16 +1,16 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/TempleBaseDebtToken.sol) import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { mulDiv } from "@prb/math/src/Common.sol"; import { ITempleDebtToken } from "contracts/interfaces/v2/ITempleDebtToken.sol"; import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; import { CompoundedInterest } from "contracts/v2/interestRate/CompoundedInterest.sol"; import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; import { SafeCast } from "contracts/common/SafeCast.sol"; +import { TempleMath } from "contracts/common/TempleMath.sol"; /* solhint-disable not-rely-on-time */ @@ -556,7 +556,7 @@ contract TempleDebtToken is ITempleDebtToken, TempleElevatedAccess { function _debtToShares(uint128 _debt, uint128 _totalDebt, uint128 _totalShares, bool roundUp) internal pure returns (uint128) { return _totalDebt > 0 - ? _mulDivRound(_debt, _totalShares, _totalDebt, roundUp).encodeUInt128() + ? TempleMath.mulDivRound(_debt, _totalShares, _totalDebt, roundUp).encodeUInt128() : _debt; } @@ -571,7 +571,7 @@ contract TempleDebtToken is ITempleDebtToken, TempleElevatedAccess { function _sharesToDebt(uint128 _shares, uint128 _totalDebt, uint128 _totalShares, bool roundUp) internal pure returns (uint128) { return _totalShares > 0 - ? _mulDivRound(_shares, _totalDebt, _totalShares, roundUp).encodeUInt128() + ? TempleMath.mulDivRound(_shares, _totalDebt, _totalShares, roundUp).encodeUInt128() : _shares; } @@ -752,15 +752,6 @@ contract TempleDebtToken is ITempleDebtToken, TempleElevatedAccess { _initDebtorCache(_baseCache, _debtor, debtorCache, _roundUp); } - /// @notice mulDiv with an option to round the result up or down to the nearest wei - function _mulDivRound(uint256 x, uint256 y, uint256 denominator, bool roundUp) internal pure returns (uint256 result) { - result = mulDiv(x, y, denominator); - // See OZ Math.sol for the equivalent mulDiv() with rounding. - if (roundUp && mulmod(x, y, denominator) > 0) { - result += 1; - } - } - /// @dev The difference between `a - b`, floored at zero (will not revert) for two uint128 variables function _subFloorZero(uint128 a, uint128 b) internal pure returns (uint128) { unchecked { diff --git a/protocol/contracts/v2/TreasuryPriceIndexOracle.sol b/protocol/contracts/v2/TreasuryPriceIndexOracle.sol index 227d045c7..f25b99c38 100644 --- a/protocol/contracts/v2/TreasuryPriceIndexOracle.sol +++ b/protocol/contracts/v2/TreasuryPriceIndexOracle.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/TreasuryPriceIndexOracle.sol) diff --git a/protocol/contracts/v2/TreasuryReservesVault.sol b/protocol/contracts/v2/TreasuryReservesVault.sol index e5bab9205..f0309090f 100644 --- a/protocol/contracts/v2/TreasuryReservesVault.sol +++ b/protocol/contracts/v2/TreasuryReservesVault.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/TreasuryReservesVault.sol) diff --git a/protocol/contracts/v2/access/TempleElevatedAccess.sol b/protocol/contracts/v2/access/TempleElevatedAccess.sol index 834c366bb..4b1d79eab 100644 --- a/protocol/contracts/v2/access/TempleElevatedAccess.sol +++ b/protocol/contracts/v2/access/TempleElevatedAccess.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/access/TempleElevatedAccess.sol) diff --git a/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol b/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol index ece4c762c..50e53e672 100644 --- a/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol +++ b/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol) diff --git a/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol b/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol index c18d1d95b..908244fce 100644 --- a/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol +++ b/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/circuitBreaker/ITempleCircuitBreakerProxy.sol) diff --git a/protocol/contracts/v2/interestRate/BaseInterestRateModel.sol b/protocol/contracts/v2/interestRate/BaseInterestRateModel.sol index 0f5245cf9..28a8092a6 100644 --- a/protocol/contracts/v2/interestRate/BaseInterestRateModel.sol +++ b/protocol/contracts/v2/interestRate/BaseInterestRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/interestRate/BaseInterestRateModel.sol) diff --git a/protocol/contracts/v2/interestRate/CompoundedInterest.sol b/protocol/contracts/v2/interestRate/CompoundedInterest.sol index e8cb151e3..422667f31 100644 --- a/protocol/contracts/v2/interestRate/CompoundedInterest.sol +++ b/protocol/contracts/v2/interestRate/CompoundedInterest.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/interestRate/CompoundedInterest.sol) diff --git a/protocol/contracts/v2/interestRate/LinearWithKinkInterestRateModel.sol b/protocol/contracts/v2/interestRate/LinearWithKinkInterestRateModel.sol index 1ea139b56..56d058bbd 100644 --- a/protocol/contracts/v2/interestRate/LinearWithKinkInterestRateModel.sol +++ b/protocol/contracts/v2/interestRate/LinearWithKinkInterestRateModel.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/interestRate/LinearWithKinkInterestRateModel.sol) diff --git a/protocol/contracts/v2/safeGuards/SafeForked.sol b/protocol/contracts/v2/safeGuards/SafeForked.sol index 99cb45550..dc3d56964 100644 --- a/protocol/contracts/v2/safeGuards/SafeForked.sol +++ b/protocol/contracts/v2/safeGuards/SafeForked.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/SafeGuards/SafeForked.sol) diff --git a/protocol/contracts/v2/safeGuards/ThresholdSafeGuard.sol b/protocol/contracts/v2/safeGuards/ThresholdSafeGuard.sol index dda0ccd17..209ddad7d 100644 --- a/protocol/contracts/v2/safeGuards/ThresholdSafeGuard.sol +++ b/protocol/contracts/v2/safeGuards/ThresholdSafeGuard.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/SafeGuards/ThresholdSafeGuard.sol) diff --git a/protocol/contracts/v2/strategies/AbstractStrategy.sol b/protocol/contracts/v2/strategies/AbstractStrategy.sol index 99611521c..d98d7e5a9 100644 --- a/protocol/contracts/v2/strategies/AbstractStrategy.sol +++ b/protocol/contracts/v2/strategies/AbstractStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/AbstractStrategy.sol) diff --git a/protocol/contracts/v2/strategies/DsrBaseStrategy.sol b/protocol/contracts/v2/strategies/DsrBaseStrategy.sol index 28cc968d4..0c9b2a6ce 100644 --- a/protocol/contracts/v2/strategies/DsrBaseStrategy.sol +++ b/protocol/contracts/v2/strategies/DsrBaseStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/DSRStrategy.sol) diff --git a/protocol/contracts/v2/strategies/GnosisStrategy.sol b/protocol/contracts/v2/strategies/GnosisStrategy.sol index 62511e897..cdd6292b5 100644 --- a/protocol/contracts/v2/strategies/GnosisStrategy.sol +++ b/protocol/contracts/v2/strategies/GnosisStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/GnosisStrategy.sol) diff --git a/protocol/contracts/v2/strategies/RamosStrategy.sol b/protocol/contracts/v2/strategies/RamosStrategy.sol index 670c0edc0..e2258ef5c 100644 --- a/protocol/contracts/v2/strategies/RamosStrategy.sol +++ b/protocol/contracts/v2/strategies/RamosStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/RamosStrategy.sol) diff --git a/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol b/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol index 23c6f3ec9..bdcdd5972 100644 --- a/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol +++ b/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/TempleTokenBaseStrategy.sol) diff --git a/protocol/contracts/v2/strategies/TlcStrategy.sol b/protocol/contracts/v2/strategies/TlcStrategy.sol index 27f69bbe1..5efc05985 100644 --- a/protocol/contracts/v2/strategies/TlcStrategy.sol +++ b/protocol/contracts/v2/strategies/TlcStrategy.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/strategies/TlcStrategy.sol) diff --git a/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol b/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol index 59902cc2e..e6a2685b5 100644 --- a/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol +++ b/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later // Temple (v2/templeLineOfCredit/TempleLineOfCredit.sol) @@ -11,7 +11,7 @@ import { ITempleLineOfCredit } from "contracts/interfaces/v2/templeLineOfCredit/ import { ITlcStrategy } from "contracts/interfaces/v2/strategies/ITlcStrategy.sol"; import { CompoundedInterest } from "contracts/v2/interestRate/CompoundedInterest.sol"; import { ITempleCircuitBreakerProxy } from "contracts/interfaces/v2/circuitBreaker/ITempleCircuitBreakerProxy.sol"; - +import { TempleMath } from "contracts/common/TempleMath.sol"; import { SafeCast } from "contracts/common/SafeCast.sol"; import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; import { TempleElevatedAccess } from "contracts/v2/access/TempleElevatedAccess.sol"; @@ -796,17 +796,6 @@ contract TempleLineOfCredit is ITempleLineOfCredit, TempleElevatedAccess { ? 0 : mulDiv(_cache.totalDebt, PRECISION, _cache.trvDebtCeiling); } - - /** - * @dev mulDiv with an option to round the result up or down to the nearest wei - */ - function _mulDivRound(uint256 x, uint256 y, uint256 denominator, bool roundUp) internal pure returns (uint256 result) { - result = mulDiv(x, y, denominator); - // See OZ Math.sol for the equivalent mulDiv() with rounding. - if (roundUp && mulmod(x, y, denominator) > 0) { - result += 1; - } - } /** * @dev Calculate the latest debt for a given account & token. @@ -820,7 +809,7 @@ contract TempleLineOfCredit is ITempleLineOfCredit, TempleElevatedAccess { ) internal pure returns (uint128 result) { return (_accountDebtCheckpoint == 0) ? 0 - : _mulDivRound( + : TempleMath.mulDivRound( _accountDebtCheckpoint, _cache.interestAccumulator, _accountInterestAccumulator, diff --git a/protocol/foundry.toml b/protocol/foundry.toml index b30268efe..32edbb3cf 100644 --- a/protocol/foundry.toml +++ b/protocol/foundry.toml @@ -1,5 +1,6 @@ [profile.default] optimizer = true + auto_detect_solc = true optimizer_runs = 10_000_000 verbosity = 3 src = 'contracts' @@ -10,6 +11,7 @@ gas_reports = ["*"] evm_version = "paris" # See https://www.evmdiff.com/features?name=PUSH0&kind=opcode + [profile.ci] fuzz = { runs = 5000, seed = "0x4444" } invariant = { runs = 1000 } diff --git a/protocol/hardhat.config.ts b/protocol/hardhat.config.ts index 8bb4206e6..56584c908 100644 --- a/protocol/hardhat.config.ts +++ b/protocol/hardhat.config.ts @@ -8,6 +8,7 @@ import '@nomiclabs/hardhat-etherscan'; import 'hardhat-contract-sizer'; import 'hardhat-gas-reporter'; import 'solidity-coverage'; +import { EndpointId } from '@layerzerolabs/lz-definitions' // NOTE: Any tasks that depend on the generated typechain makes the build flaky. // Favour scripts instead @@ -70,12 +71,21 @@ module.exports = { solidity: { compilers: [ { - version: '0.8.20', + version: '0.8.28', settings: { - optimizer: { + optimizer: { enabled: true, runs: 999999, + }, }, + }, + { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, }, }, { @@ -181,6 +191,7 @@ module.exports = { ? [process.env.SEPOLIA_ADDRESS_PRIVATE_KEY] : [], gasPrice: parseInt(process.env.SEPOLIA_GAS_IN_GWEI || '0') * 1000000000, + eid: EndpointId.SEPOLIA_V2_TESTNET }, anvil: { url: "http://127.0.0.1:8545/", @@ -192,6 +203,7 @@ module.exports = { ? [process.env.ARBITRUM_SEPOLIA_ADDRESS_PRIVATE_KEY] : [], gasPrice: 2000000000, + eid: EndpointId.ARBITRUM_V2_TESTNET } }, etherscan: { diff --git a/protocol/layerzero.config.ts b/protocol/layerzero.config.ts new file mode 100644 index 000000000..637d89b85 --- /dev/null +++ b/protocol/layerzero.config.ts @@ -0,0 +1,41 @@ +import { EndpointId, TestnetV2EndpointId } from '@layerzerolabs/lz-definitions' + +import type { OAppOmniGraphHardhat, OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat' + +const sepoliaContract: OmniPointHardhat = { + eid: Number(TestnetV2EndpointId.SEPOLIA_V2_TESTNET), + contractName: 'TempleGold', +} + +const arbitrumSepoliaContract: OmniPointHardhat = { + eid: Number(TestnetV2EndpointId.ARBITRUM_V2_TESTNET), + contractName: 'TempleGold', +} + +const mainnetContract: OmniPointHardhat = { + eid: Number(EndpointId.ETHEREUM_MAINNET), + contractName: 'TempleGold', +} + +const config: OAppOmniGraphHardhat = { + contracts: [ + { + contract: sepoliaContract, + }, + { + contract: arbitrumSepoliaContract, + }, + ], + connections: [ + { + from: arbitrumSepoliaContract, + to: sepoliaContract, + }, + { + from: sepoliaContract, + to: arbitrumSepoliaContract, + }, + ], +} + +export default config \ No newline at end of file diff --git a/protocol/package.json b/protocol/package.json index 1c8631fec..de267561d 100644 --- a/protocol/package.json +++ b/protocol/package.json @@ -9,6 +9,15 @@ "@balancer-labs/sdk": "^1.1.2", "@ethersproject/bytes": "^5.7.0", "@gnosis.pm/safe-contracts": "^1.3.0", + "@layerzerolabs/lz-definitions": "~2.3.34", + "@layerzerolabs/lz-evm-messagelib-v2": "~2.3.34", + "@layerzerolabs/lz-evm-oapp-v2": "~2.3.34", + "@layerzerolabs/lz-evm-protocol-v2": "~2.3.34", + "@layerzerolabs/lz-evm-v1-0.7": "~2.3.34", + "@layerzerolabs/lz-v2-utilities": "~2.3.34", + "@layerzerolabs/test-devtools-evm-foundry": "~0.2.2", + "@layerzerolabs/toolbox-foundry": "~0.1.2", + "@layerzerolabs/toolbox-hardhat": "~0.2.4", "@nomicfoundation/hardhat-chai-matchers": "^1.0.4", "@nomicfoundation/hardhat-network-helpers": "^1.0.6", "@nomicfoundation/hardhat-toolbox": "^2.0.0", @@ -35,6 +44,7 @@ "hardhat": "^2.17.1", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.9", + "solidity-bytes-utils": "^0.8.2", "solidity-coverage": "^0.8.4", "ts-node": "^10.9.1", "typechain": "^8.1.1", @@ -67,7 +77,7 @@ "local-fork:test:templev2": "hardhat run --network localhost scripts/deploys/localhost/v2/999-localhost-fork-test.ts", "forge-test": "forge test", "forge-coverage": "forge coverage", - "forge-coverage-html": "forge coverage --report lcov && genhtml lcov.info -o report --branch-coverage --legend" + "forge-coverage-html": "forge coverage --report summary --report lcov && lcov --remove lcov.info 'contracts/fakes/*' 'contracts/deprecated/*' 'test/*' 'script/*' 'node_modules/*' --output-file lcov.info --rc lcov_branch_coverage=1 && genhtml lcov.info -o report --branch-coverage --legend" }, "engines": { "node": ">=16.0.0" diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x30223FD9CDBCb97F15FE188769B0170F2a993A3E.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x30223FD9CDBCb97F15FE188769B0170F2a993A3E.js new file mode 100644 index 000000000..434f5ef12 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x30223FD9CDBCb97F15FE188769B0170F2a993A3E.js @@ -0,0 +1,11 @@ +// arbitrumSepolia: SPICE_AUCTION_FACTORY=0x30223FD9CDBCb97F15FE188769B0170F2a993A3E +// yarn hardhat verify --network arbitrumSepolia 0x30223FD9CDBCb97F15FE188769B0170F2a993A3E --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x30223FD9CDBCb97F15FE188769B0170F2a993A3E.js +module.exports = [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x8afB7E03a6e115577361C5648924eBA3163381Fc", + 40231, + 421614 +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js new file mode 100644 index 000000000..636a8b513 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js @@ -0,0 +1,8 @@ +// arbitrumSepolia: TEMPLE_TOKEN=0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB +// yarn hardhat verify --network arbitrumSepolia 0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB.js +module.exports = [ + "Temple Token", + "TEMPLE", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "100000000000000000000000" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x51ebd148AE75B3e2CfDF972c94D7775B16060672.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x51ebd148AE75B3e2CfDF972c94D7775B16060672.js new file mode 100644 index 000000000..72bb4b4ae --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x51ebd148AE75B3e2CfDF972c94D7775B16060672.js @@ -0,0 +1,11 @@ +// arbitrumSepolia: SPICE_AUCTION=0x51ebd148AE75B3e2CfDF972c94D7775B16060672 +// yarn hardhat verify --network arbitrumSepolia 0x51ebd148AE75B3e2CfDF972c94D7775B16060672 --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x51ebd148AE75B3e2CfDF972c94D7775B16060672.js +module.exports = [ + "0x8afB7E03a6e115577361C5648924eBA3163381Fc", + "0x5879B1ae381DDbBa701170160162025d297ce3D3", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + 40231, + 421614, + "DAI_TGLD_SPICE" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x57cde11128c70948B910Bf34cF6F834c78B66b0f.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x57cde11128c70948B910Bf34cF6F834c78B66b0f.js new file mode 100644 index 000000000..0de6431dd --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x57cde11128c70948B910Bf34cF6F834c78B66b0f.js @@ -0,0 +1,7 @@ +// arbitrumSepolia: TEMPLE_TELEPORTER=0x57cde11128c70948B910Bf34cF6F834c78B66b0f +// yarn hardhat verify --network arbitrumSepolia 0x57cde11128c70948B910Bf34cF6F834c78B66b0f --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x57cde11128c70948B910Bf34cF6F834c78B66b0f.js +module.exports = [ + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB", + "0x6EDCE65403992e310A62460808c4b910D972f10f" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x5879B1ae381DDbBa701170160162025d297ce3D3.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x5879B1ae381DDbBa701170160162025d297ce3D3.js new file mode 100644 index 000000000..82979a8c0 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x5879B1ae381DDbBa701170160162025d297ce3D3.js @@ -0,0 +1,8 @@ +// arbitrumSepolia: DAI_TOKEN=0x5879B1ae381DDbBa701170160162025d297ce3D3 +// yarn hardhat verify --network arbitrumSepolia 0x5879B1ae381DDbBa701170160162025d297ce3D3 --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x5879B1ae381DDbBa701170160162025d297ce3D3.js +module.exports = [ + "Dai Token", + "DAI", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "100000000000000000000000" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x8afB7E03a6e115577361C5648924eBA3163381Fc.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x8afB7E03a6e115577361C5648924eBA3163381Fc.js new file mode 100644 index 000000000..0e7a609ac --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0x8afB7E03a6e115577361C5648924eBA3163381Fc.js @@ -0,0 +1,12 @@ +// arbitrumSepolia: TEMPLE_GOLD=0x8afB7E03a6e115577361C5648924eBA3163381Fc +// yarn hardhat verify --network arbitrumSepolia 0x8afB7E03a6e115577361C5648924eBA3163381Fc --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0x8afB7E03a6e115577361C5648924eBA3163381Fc.js +module.exports = [ + { + "executor": "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "layerZeroEndpoint": "0x6EDCE65403992e310A62460808c4b910D972f10f", + "mintChainId": 421614, + "mintChainLzEid": 40231, + "name": "TEMPLE GOLD", + "symbol": "TGLD" + } +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js new file mode 100644 index 000000000..2271a9c27 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js @@ -0,0 +1,10 @@ +// arbitrumSepolia: DAI_GOLD_AUCTION=0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1 +// yarn hardhat verify --network arbitrumSepolia 0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1 --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1.js +module.exports = [ + "0x8afB7E03a6e115577361C5648924eBA3163381Fc", + "0x5879B1ae381DDbBa701170160162025d297ce3D3", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xa2f7B537B530481b12A5538bE7309fB6a34849f3.js b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xa2f7B537B530481b12A5538bE7309fB6a34849f3.js new file mode 100644 index 000000000..7f681b351 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/deploymentArgs/0xa2f7B537B530481b12A5538bE7309fB6a34849f3.js @@ -0,0 +1,8 @@ +// arbitrumSepolia: TEMPLE_GOLD_STAKING=0xa2f7B537B530481b12A5538bE7309fB6a34849f3 +// yarn hardhat verify --network arbitrumSepolia 0xa2f7B537B530481b12A5538bE7309fB6a34849f3 --constructor-args scripts/deploys/arbitrumSepolia/deploymentArgs/0xa2f7B537B530481b12A5538bE7309fB6a34849f3.js +module.exports = [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB", + "0x8afB7E03a6e115577361C5648924eBA3163381Fc" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/01a-temple-token.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/01a-temple-token.ts new file mode 100644 index 000000000..d734ce614 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/01a-temple-token.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { FakeERC20__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, + toAtto, +} from '../../helpers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + + await _deployTempleToken(owner); +} + +async function _deployTempleToken(owner: SignerWithAddress) { + const factory = new FakeERC20__factory(owner); + await deployAndMine( + 'TEMPLE_TOKEN', + factory, + factory.deploy, + "Temple Token", + "TEMPLE", + await owner.getAddress(), + toAtto(100_000) + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/01b-dai-token.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/01b-dai-token.ts new file mode 100644 index 000000000..6991f1e6c --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/01b-dai-token.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { FakeERC20__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, + toAtto, +} from '../../helpers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + + await _deployTempleToken(owner); +} + +async function _deployTempleToken(owner: SignerWithAddress) { + const factory = new FakeERC20__factory(owner); + await deployAndMine( + 'DAI_TOKEN', + factory, + factory.deploy, + "Dai Token", + "DAI", + await owner.getAddress(), + toAtto(100_000) + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/01c-temple-gold.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/01c-temple-gold.ts new file mode 100644 index 000000000..46396a65b --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/01c-temple-gold.ts @@ -0,0 +1,43 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGold__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const ARBITRUM_SEPOLIA_CHAIN_ID = 421614; + const ARBITRUM_SEPOLIA_LZ_EID = 40231; + const _initArgs = { + // Changed in transfer ownership to TempleAdmin + executor: ownerAddress, // executor is also used as delegate in LayerZero Endpoint. + layerZeroEndpoint: TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT, // local endpoint address + mintChainId: ARBITRUM_SEPOLIA_CHAIN_ID, + mintChainLzEid: ARBITRUM_SEPOLIA_LZ_EID, + name: "TEMPLE GOLD", + symbol: "TGLD" + }; + const factory = new TempleGold__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD', + factory, + factory.deploy, + _initArgs + ); + +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/02-temple-teleporter.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/02-temple-teleporter.ts new file mode 100644 index 000000000..09190178d --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/02-temple-teleporter.ts @@ -0,0 +1,33 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleTeleporter__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + + const factory = new TempleTeleporter__factory(owner); + await deployAndMine( + 'TEMPLE_TELEPORTER', + factory, + factory.deploy, + await owner.getAddress(), + TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/03-temple-gold-staking.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/03-temple-gold-staking.ts new file mode 100644 index 000000000..7b16503a2 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/03-temple-gold-staking.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGoldStaking__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + console.log("ADDYSDSDFAS"); + console.log(TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN); + console.log(TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD); + console.log(ownerAddress); + const factory = new TempleGoldStaking__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD_STAKING', + factory, + factory.deploy, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, + TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/04-dai-gold-auction.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/04-dai-gold-auction.ts new file mode 100644 index 000000000..519b8104a --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/04-dai-gold-auction.ts @@ -0,0 +1,37 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { DaiGoldAuction__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + + const factory = new DaiGoldAuction__factory(owner); + await deployAndMine( + 'DAI_GOLD_AUCTION', + factory, + factory.deploy, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + TEMPLEGOLD_ADDRESSES.EXTERNAL.MAKER_DAO.DAI_TOKEN, + ownerAddress, // treasury + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, // executor + ownerAddress // auction automation eoa + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/05-spice-factory.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/05-spice-factory.ts new file mode 100644 index 000000000..a161d6c70 --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/05-spice-factory.ts @@ -0,0 +1,40 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { SpiceAuctionFactory__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const ARBITRUM_SEPOLIA_CHAIN_ID = 421614; + const ARBITRUM_SEPOLIA_LZ_EID = 40231; + + const factory = new SpiceAuctionFactory__factory(owner); + await deployAndMine( + 'SPICE_AUCTION_FACTORY', + factory, + factory.deploy, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, // executor + ownerAddress, // dao executor, placeholder + ownerAddress, // spice auction operator + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + ARBITRUM_SEPOLIA_LZ_EID, + ARBITRUM_SEPOLIA_CHAIN_ID + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/arbitrumSepolia/templegold/99a-post-deploy.ts b/protocol/scripts/deploys/arbitrumSepolia/templegold/99a-post-deploy.ts new file mode 100644 index 000000000..49d3bffcb --- /dev/null +++ b/protocol/scripts/deploys/arbitrumSepolia/templegold/99a-post-deploy.ts @@ -0,0 +1,121 @@ +import { ethers } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, ContractInstances, getDeployedTempleGoldContracts, ContractAddresses } from '../../mainnet/templegold/contract-addresses'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + + // await _templeGoldPostDeploy(owner, TEMPLE_GOLD_ADDRESSES, TEMPLE_GOLD_INSTANCES); + // await _stakingPostDeploy(owner, TEMPLE_GOLD_INSTANCES); + // await _daiGoldPostDeploy(owner, TEMPLE_GOLD_INSTANCES); + // await _templeTeleporterPostDeploy(); + // await _setSpiceAuctionConfig(owner, TEMPLE_GOLD_INSTANCES); +} + +async function _templeGoldPostDeploy( + owner: SignerWithAddress, + TEMPLE_GOLD_ADDRESSES: ContractAddresses, + TEMPLE_GOLD_INSTANCES: ContractInstances +) { + const ownerAddress = await owner.getAddress(); + const distributionParams = { + staking: ethers.utils.parseEther("20"), + daiGoldAuction: ethers.utils.parseEther("70"), + gnosis: ethers.utils.parseEther("10") + } + const vestingFactor = { + value: 35, + weekMultiplier: 3600 * 24 * 7 // 1 week + } + // Set and whitelist contracts + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setTeamGnosis(ownerAddress)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setDaiGoldAuction(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setStaking(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setVestingFactor(vestingFactor)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setDistributionParams(distributionParams)); + // authorize contracts + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION, true)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, true)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(ownerAddress, true)); +} + +async function _stakingPostDeploy( + owner: SignerWithAddress, + TEMPLE_GOLD_INSTANCES: ContractInstances +) { + const ownerAddress = await owner.getAddress(); + const ONE_DAY = 24 * 3600; + const duration = ONE_DAY * 7; + const unstakeCooldown = ONE_DAY; + const rewardsDistributionCooldown = 2 * 3600; // 2 minutes + // reward duration + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setRewardDuration(duration)); + // distribution starter + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setDistributionStarter(ownerAddress)); + // rewards distribution cool down + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setRewardDistributionCoolDown(rewardsDistributionCooldown)); + // unstake cool down + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setUnstakeCooldown(unstakeCooldown)); +} + +async function _daiGoldPostDeploy( + owner: SignerWithAddress, + TEMPLE_GOLD_INSTANCES: ContractInstances +) { + const ownerAddress = await owner.getAddress(); + const auctionsTimeDiff = 24 * 3600; // 1 hour + const auctionConfig = { + /// Time diff between two auctions. Usually 2 weeks + auctionsTimeDiff: auctionsTimeDiff, + /// Cooldown after auction start is triggered, to allow deposits + auctionStartCooldown: 60, + /// Minimum Gold distributed to enable auction start + auctionMinimumDistributedGold: ethers.utils.parseEther("10"), + }; + // auction starter + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.DAI_GOLD_AUCTION.setAuctionStarter(ownerAddress)); + // auction config + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.DAI_GOLD_AUCTION.setAuctionConfig(auctionConfig)); +} + +async function _templeTeleporterPostDeploy() { + // Add all temple teleporter contracts cross chain as minters of TEMPLE token + // ownership of temple is multisig so this is here as a reminder + // const addresses: string[] = []; + // for (const address of addresses) { + + // } +} + +async function _setSpiceAuctionConfig( + owner: SignerWithAddress, + TEMPLE_GOLD_INSTANCES: ContractInstances +) { + const config = { + duration: 60 * 60 * 24 * 7, + waitPeriod: 1, // 1 seocnd. testing reasons + startCooldown: 10, + minimumDistributedAuctionToken: 1, + starter: "0x0000000000000000000000000000000000000000", + isTempleGoldAuctionToken: true, + recipient: "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD" + } + + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.SPICE_AUCTION.setAuctionConfig(config)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/localhost/templegold/01-localhost.ts b/protocol/scripts/deploys/localhost/templegold/01-localhost.ts new file mode 100644 index 000000000..02703eebb --- /dev/null +++ b/protocol/scripts/deploys/localhost/templegold/01-localhost.ts @@ -0,0 +1,133 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGold__factory, TempleGoldAdmin__factory, + TempleGoldStaking__factory, TempleTeleporter__factory, + DaiGoldAuction__factory, FakeERC20__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, + toAtto, +} from '../../helpers'; +import { getDeployedContracts } from '../../mainnet/v2/contract-addresses'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner, rescuer] = await ethers.getSigners(); + + await _deployTempleToken(owner); + await _deployTempleGold(owner); + await _deployTempleGoldAdmin(owner, rescuer); + + await _deployTempleGoldStaking(owner, rescuer); + await _deployTempleTeleporter(owner); + + await _deployDaiGoldAuction(owner, rescuer); +} + +async function _deployTempleToken(owner: SignerWithAddress) { + const factory = new FakeERC20__factory(owner); + await deployAndMine( + 'TEMPLE_TOKEN', + factory, + factory.deploy, + "Temple", + "TEMPLE", + await owner.getAddress(), + toAtto(1000) + ); +} + +async function _deployTempleGold(owner: SignerWithAddress) { + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const ARBITRUM_ONE_CHAIN_ID = 42161; + const ARBITRUM_ONE_LZ_EID = 30110; + const _initArgs = { + // Changed in transfer ownership to TempleAdmin + executor: await owner.getAddress(), // executor is also used as delegate in LayerZero Endpoint. + layerZeroEndpoint: TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT, // local endpoint address + mintChainId: ARBITRUM_ONE_CHAIN_ID, + mintChainLzEid: ARBITRUM_ONE_LZ_EID, + name: "TEMPLE GOLD", + symbol: "TGLD" + }; + const factory = new TempleGold__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD', + factory, + factory.deploy, + _initArgs + ); +} + +async function _deployTempleGoldAdmin(owner: SignerWithAddress, rescuer: SignerWithAddress) { + const factory = new TempleGoldAdmin__factory(owner); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + await deployAndMine( + 'TEMPLE_GOLD_ADMIN', + factory, + factory.deploy, + await rescuer.getAddress(), + await owner.getAddress(), + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +async function _deployTempleGoldStaking(owner: SignerWithAddress, rescuer: SignerWithAddress) { + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + + const factory = new TempleGoldStaking__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD_STAKING', + factory, + factory.deploy, + await rescuer.getAddress(), + await owner.getAddress(), + TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN, // CORE_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +async function _deployTempleTeleporter(owner: SignerWithAddress) { + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + const factory = new TempleTeleporter__factory(owner); + await deployAndMine( + 'TEMPLE_TELEPORTER', + factory, + factory.deploy, + await owner.getAddress(), + CORE_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT + ); +} + +async function _deployDaiGoldAuction(owner: SignerWithAddress, rescuer: SignerWithAddress): Promise { + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const arbDaiToken = "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"; + const factory = new DaiGoldAuction__factory(owner); + await deployAndMine( + 'DAI_GOLD_AUCTION', + factory, + factory.deploy, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + arbDaiToken, + await owner.getAddress(), // treasury + await rescuer.getAddress(), + await owner.getAddress(), + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.AUCTION_AUTOMATION_EOA + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/localhost/templegold/02-ops.ts b/protocol/scripts/deploys/localhost/templegold/02-ops.ts new file mode 100644 index 000000000..598a2ffd8 --- /dev/null +++ b/protocol/scripts/deploys/localhost/templegold/02-ops.ts @@ -0,0 +1,30 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGoldStaking__factory, + FakeERC20__factory } from '../../../../typechain'; +import { + ensureExpectedEnvvars, + toAtto, + mine +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const staking = TempleGoldStaking__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, owner); + const templeToken = FakeERC20__factory.connect(TEMPLE_GOLD_ADDRESSES.CORE.TEMPLE_TOKEN, owner); + + await mine(templeToken.approve(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, toAtto(1000))); + await mine(staking.stake(toAtto(1))); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/localhost/templegold/999-localhost.ts b/protocol/scripts/deploys/localhost/templegold/999-localhost.ts new file mode 100644 index 000000000..da0de3f5e --- /dev/null +++ b/protocol/scripts/deploys/localhost/templegold/999-localhost.ts @@ -0,0 +1,80 @@ +import { ethers, network } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; +import { TempleGold__factory, TempleGoldStaking__factory, DaiGoldAuction__factory } from '../../../../typechain'; + + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + // signer 0 + const teamGnosis = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'; + console.log(`OWNER ${await TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.owner()}`); + console.log(`OWNER ${await TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.executor()}`); + const distributionParams = { + staking: ethers.utils.parseEther("20"), + daiGoldAuction: ethers.utils.parseEther("70"), + gnosis: ethers.utils.parseEther("10") + } + const vestingFactor = { + value: 35, + weekMultiplier: 3600 * 24 * 7 // 1 week + } + ///// TEMPLE GOLD + const templeGold = TempleGold__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, owner); + const staking = TempleGoldStaking__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, owner); + const daiGoldAuction = DaiGoldAuction__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION, owner); + console.log(`TempleGOld: ${await daiGoldAuction.templeGold()}`); + // // Set and whitelist contracts + await mine(templeGold.setTeamGnosis(teamGnosis)); + await mine(templeGold.setDaiGoldAuction(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION)); + await mine(templeGold.setStaking(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING)); + await mine(templeGold.setVestingFactor(vestingFactor)); + await mine(templeGold.setDistributionParams(distributionParams)); + // // authorize contracts + await mine(templeGold.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION, true)); + await mine(templeGold.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, true)); + await mine(templeGold.authorizeContract(teamGnosis, true)); + + // ///// Staking + const duration = 24 * 3600 * 7; + const unstakeCooldown = duration * 2; // 2 weeks + const rewardsDistributionCooldown = 3600; // 1 hour + // reward duration + await mine(staking.setRewardDuration(duration)); + // distribution starter + await mine(staking.setDistributionStarter(teamGnosis)); + // rewards distribution cool down + await mine(staking.setRewardDistributionCoolDown(rewardsDistributionCooldown)); + // unstake cool down + await mine(staking.setUnstakeCooldown(unstakeCooldown)); + + ////// DAI GOLD AUCTION + const auctionsTimeDiff = 60; + const auctionConfig = { + /// Time diff between two auctions. Usually 2 weeks + auctionsTimeDiff: auctionsTimeDiff, + /// Cooldown after auction start is triggered, to allow deposits + auctionStartCooldown: 60, + /// Minimum Gold distributed to enable auction start + auctionMinimumDistributedGold: ethers.utils.parseEther("0.01"), + }; + // auction starter + await mine(daiGoldAuction.setAuctionStarter(teamGnosis)); + // auction config + await mine(daiGoldAuction.setAuctionConfig(auctionConfig)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/localhost/templegold/deploy-anvil.sh b/protocol/scripts/deploys/localhost/templegold/deploy-anvil.sh new file mode 100755 index 000000000..b6efac7bb --- /dev/null +++ b/protocol/scripts/deploys/localhost/templegold/deploy-anvil.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +anvil --fork-url $ARBITRUM_ONE_RPC_URL + +npx hardhat --network localhost run scripts/deploys/localhost/templegold/01-localhost.ts diff --git a/protocol/scripts/deploys/mainnet/templegold/01-temple-gold.ts b/protocol/scripts/deploys/mainnet/templegold/01-temple-gold.ts new file mode 100644 index 000000000..862e487c5 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/01-temple-gold.ts @@ -0,0 +1,44 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGold__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedContracts } from '../v2/contract-addresses'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const CORE_ADDRESSES = getDeployedContracts(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const MAINNET_CHAIN_ID = 1; + const MAINNET_LZ_EID = 30101; + const _initArgs = { + // Changed in transfer ownership to TempleAdmin + executor: CORE_ADDRESSES.CORE.EXECUTOR_MSIG, // executor is also used as delegate in LayerZero Endpoint. + layerZeroEndpoint: TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT, // local endpoint address + mintChainId: MAINNET_CHAIN_ID, + mintChainLzEid: MAINNET_LZ_EID, + name: "TEMPLE GOLD", + symbol: "TGLD" + }; + const factory = new TempleGold__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD', + factory, + factory.deploy, + _initArgs + ); + +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/02-temple-admin.ts b/protocol/scripts/deploys/mainnet/templegold/02-temple-admin.ts new file mode 100644 index 000000000..6ce0ec771 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/02-temple-admin.ts @@ -0,0 +1,35 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGoldAdmin__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + const factory = new TempleGoldAdmin__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD_ADMIN', + factory, + factory.deploy, + CORE_ADDRESSES.CORE.RESCUER_MSIG, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/03-temple-gold-staking.ts b/protocol/scripts/deploys/mainnet/templegold/03-temple-gold-staking.ts new file mode 100644 index 000000000..ba6ff7629 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/03-temple-gold-staking.ts @@ -0,0 +1,37 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGoldStaking__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + + const factory = new TempleGoldStaking__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD_STAKING', + factory, + factory.deploy, + CORE_ADDRESSES.CORE.RESCUER_MSIG, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, + CORE_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/04-temple-teleporter.ts b/protocol/scripts/deploys/mainnet/templegold/04-temple-teleporter.ts new file mode 100644 index 000000000..f19b6cdd2 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/04-temple-teleporter.ts @@ -0,0 +1,36 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleTeleporter__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + + const factory = new TempleTeleporter__factory(owner); + await deployAndMine( + 'TEMPLE_TELEPORTER', + factory, + factory.deploy, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, + CORE_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/05-dai-gold-auction.ts b/protocol/scripts/deploys/mainnet/templegold/05-dai-gold-auction.ts new file mode 100644 index 000000000..8517f37c7 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/05-dai-gold-auction.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { DaiGoldAuction__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + const factory = new DaiGoldAuction__factory(owner); + await deployAndMine( + 'DAI_GOLD_AUCTION', + factory, + factory.deploy, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + CORE_ADDRESSES.EXTERNAL.MAKER_DAO.DAI_TOKEN, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, // treasury + CORE_ADDRESSES.CORE.RESCUER_MSIG, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.AUCTION_AUTOMATION_EOA + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/06-spice-auction.ts b/protocol/scripts/deploys/mainnet/templegold/06-spice-auction.ts new file mode 100644 index 000000000..b6aba8e0b --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/06-spice-auction.ts @@ -0,0 +1,41 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { SpiceAuction__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + const MAINNET_CHAIN_ID = 1; + const MAINNET_LZ_EID = 30101; + + const factory = new SpiceAuction__factory(owner); + await deployAndMine( + 'SPICE_AUCTION', + factory, + factory.deploy, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + '', // spice token + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, // dao executor placeholder + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.SPICE_AUCTION_OPERATOR, // operator + MAINNET_LZ_EID, // layer zero EID mainnet + MAINNET_CHAIN_ID, // mint source chain + 'spice_auction_name' + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/07-spice-auction-factory.ts b/protocol/scripts/deploys/mainnet/templegold/07-spice-auction-factory.ts new file mode 100644 index 000000000..87c09a033 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/07-spice-auction-factory.ts @@ -0,0 +1,41 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { SpiceAuctionFactory__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from './contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + const MAINNET_CHAIN_ID = 1; + const MAINNET_LZ_EID = 30101; + + const factory = new SpiceAuctionFactory__factory(owner); + await deployAndMine( + 'SPICE_AUCTION_FACTORY', + factory, + factory.deploy, + CORE_ADDRESSES.CORE.RESCUER_MSIG, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, + CORE_ADDRESSES.CORE.EXECUTOR_MSIG, // dao executor, placeholder + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.SPICE_AUCTION_OPERATOR, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + MAINNET_LZ_EID, + MAINNET_CHAIN_ID + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/mainnet/templegold/999-transfer-ownership.ts b/protocol/scripts/deploys/mainnet/templegold/999-transfer-ownership.ts new file mode 100644 index 000000000..b851a81e8 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/999-transfer-ownership.ts @@ -0,0 +1,25 @@ +import { ethers } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, getDeployedTempleGoldContracts } from './contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + + // Transfer ownership to the temple gold admin + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.transferOwnership(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_ADMIN)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/mainnet/templegold/99a-post-temple-gold.ts b/protocol/scripts/deploys/mainnet/templegold/99a-post-temple-gold.ts new file mode 100644 index 000000000..b3b2526a0 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/99a-post-temple-gold.ts @@ -0,0 +1,42 @@ +import { ethers } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, getDeployedTempleGoldContracts } from './contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + const teamGnosis = ''; + const distributionParams = { + staking: ethers.utils.parseEther("15"), + daiGoldAuction: ethers.utils.parseEther("70"), + gnosis: ethers.utils.parseEther("15") + } + const vestingFactor = { + value: 35, + weekMultiplier: 3600 * 24 * 7 // 1 week + } + // Set and whitelist contracts + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setTeamGnosis(teamGnosis)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setDaiGoldAuction(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setStaking(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setVestingFactor(vestingFactor)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.setDistributionParams(distributionParams)); + // authorize contracts + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION, true)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, true)); + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD.authorizeContract(teamGnosis, true)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/mainnet/templegold/99b-post-temple-gold-staking.ts b/protocol/scripts/deploys/mainnet/templegold/99b-post-temple-gold-staking.ts new file mode 100644 index 000000000..7586eb21f --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/99b-post-temple-gold-staking.ts @@ -0,0 +1,33 @@ +import { ethers } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, getDeployedTempleGoldContracts } from './contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + const duration = 24 * 3600 * 7; + const unstakeCooldown = duration * 2; // 2 weeks + const rewardsDistributionCooldown = 3600; // 1 hour + // reward duration + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setRewardDuration(duration)); + // distribution starter + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setDistributionStarter(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.STAKING_AUTOMATION_EOA)); + // rewards distribution cool down + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setRewardDistributionCoolDown(rewardsDistributionCooldown)); + // unstake cool down + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING.setUnstakeCooldown(unstakeCooldown)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/mainnet/templegold/99c-post-dai-gold-auction.ts b/protocol/scripts/deploys/mainnet/templegold/99c-post-dai-gold-auction.ts new file mode 100644 index 000000000..586a150d2 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/99c-post-dai-gold-auction.ts @@ -0,0 +1,36 @@ +import { ethers } from 'hardhat'; +import { + ensureExpectedEnvvars, + mine, +} from '../../helpers'; +import { connectToContracts, getDeployedTempleGoldContracts } from './contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const TEMPLE_GOLD_INSTANCES = connectToContracts(owner); + + const auctionsTimeDiff = 24 * 3600 * 7 * 2; + const auctionConfig = { + /// Time diff between two auctions. Usually 2 weeks + auctionsTimeDiff: auctionsTimeDiff, + /// Cooldown after auction start is triggered, to allow deposits + auctionStartCooldown: 3600, + /// Minimum Gold distributed to enable auction start + auctionMinimumDistributedGold: ethers.utils.parseEther("10_000"), + }; + // auction starter + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.DAI_GOLD_AUCTION.setAuctionStarter(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.AUCTION_AUTOMATION_EOA)); + // auction config + await mine(TEMPLE_GOLD_INSTANCES.TEMPLE_GOLD.DAI_GOLD_AUCTION.setAuctionConfig(auctionConfig)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/protocol/scripts/deploys/mainnet/templegold/contract-addresses.ts b/protocol/scripts/deploys/mainnet/templegold/contract-addresses.ts new file mode 100644 index 000000000..55dad4786 --- /dev/null +++ b/protocol/scripts/deploys/mainnet/templegold/contract-addresses.ts @@ -0,0 +1,232 @@ +import { network } from "hardhat"; +import { + FakeERC20, FakeERC20__factory, + TempleGold__factory, TempleGold, + TempleGoldAdmin, TempleGoldAdmin__factory, + TempleGoldStaking, TempleGoldStaking__factory, + SpiceAuction__factory, SpiceAuction, + SpiceAuctionFactory__factory, SpiceAuctionFactory, + DaiGoldAuction__factory, DaiGoldAuction, + TempleTeleporter, TempleTeleporter__factory, + TempleERC20Token, TempleERC20Token__factory +} from '../../../../typechain'; +import { Signer } from "ethers"; + +export interface ContractAddresses { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: string, + STAKING_AUTOMATION_EOA: string, + SPICE_AUCTION_OPERATOR: string, + TEMPLE_GOLD: string, + TEMPLE_GOLD_ADMIN: string, + TEMPLE_GOLD_STAKING: string, + TEMPLE_TELEPORTER: string, + SPICE_AUCTION: string, + SPICE_AUCTION_FACTORY: string, + DAI_GOLD_AUCTION: string, + EXECUTOR_MSIG: string, + RESCUER_MSIG: string, + }, + CORE: { + TEMPLE_TOKEN: string, + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: string, + }, + MAKER_DAO: { + DAI_TOKEN: string, + } + } +} + +const TEMPLEGOLD_DEPLOYED_CONTRACTS: {[key: string]: ContractAddresses} = { + arbitrumOne: { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: "string", + STAKING_AUTOMATION_EOA: "string", + SPICE_AUCTION_OPERATOR: "string", + TEMPLE_GOLD: "string", + TEMPLE_GOLD_ADMIN: "string", + TEMPLE_GOLD_STAKING: "string", + TEMPLE_TELEPORTER: "string", + SPICE_AUCTION: "string", + SPICE_AUCTION_FACTORY: "string", + DAI_GOLD_AUCTION: "string", + EXECUTOR_MSIG: "string", + RESCUER_MSIG: "string", + }, + CORE: { + TEMPLE_TOKEN: "string", + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: "0x1a44076050125825900e736c501f859c50fE728c", + }, + MAKER_DAO: { + DAI_TOKEN: "", + } + }, + }, + mainnet: { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: "string", + STAKING_AUTOMATION_EOA: "string", + SPICE_AUCTION_OPERATOR: "string", + TEMPLE_GOLD: "string", + TEMPLE_GOLD_ADMIN: "string", + TEMPLE_GOLD_STAKING: "string", + TEMPLE_TELEPORTER: "string", + SPICE_AUCTION: "string", + SPICE_AUCTION_FACTORY: "string", + DAI_GOLD_AUCTION: "string", + EXECUTOR_MSIG: "string", + RESCUER_MSIG: "string", + }, + CORE: { + TEMPLE_TOKEN: "string", + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: "0x1a44076050125825900e736c501f859c50fE728c", + }, + MAKER_DAO: { + DAI_TOKEN: "", + } + }, + }, + sepolia: { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: "string", + STAKING_AUTOMATION_EOA: "string", + SPICE_AUCTION_OPERATOR: "string", + TEMPLE_GOLD: "0x2ae6318e34bb97ae3755AFcE75559452aA223A5D", //"0x192aA9BfDcA5540406E211950C226C8E0cd5047F", + TEMPLE_GOLD_ADMIN: "string", + TEMPLE_GOLD_STAKING: "0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F", + TEMPLE_TELEPORTER: "0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5", + SPICE_AUCTION: "string", + SPICE_AUCTION_FACTORY: "0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1", + DAI_GOLD_AUCTION: "0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB", + EXECUTOR_MSIG: "string", + RESCUER_MSIG: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + }, + CORE: { + TEMPLE_TOKEN: "0x98c5E61b1B3731A1f379E8770861164d23118cdc", + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: "0x6EDCE65403992e310A62460808c4b910D972f10f", + }, + MAKER_DAO: { + DAI_TOKEN: "0xBe9162230D9e637218D74C7f41f62ef2385fEe64", + } + }, + }, + arbitrumSepolia: { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: "string", + STAKING_AUTOMATION_EOA: "string", + SPICE_AUCTION_OPERATOR: "string", + TEMPLE_GOLD: "0x8afB7E03a6e115577361C5648924eBA3163381Fc", + TEMPLE_GOLD_ADMIN: "string", + TEMPLE_GOLD_STAKING: "0xa2f7B537B530481b12A5538bE7309fB6a34849f3", + TEMPLE_TELEPORTER: "0x57cde11128c70948B910Bf34cF6F834c78B66b0f", + SPICE_AUCTION: "0x51ebd148AE75B3e2CfDF972c94D7775B16060672", + SPICE_AUCTION_FACTORY: "0x30223FD9CDBCb97F15FE188769B0170F2a993A3E", + DAI_GOLD_AUCTION: "0xF5B76f09B9df3eBD45155007590a9C14fEa2D4c1", + EXECUTOR_MSIG: "string", + RESCUER_MSIG: "string", + }, + CORE: { + TEMPLE_TOKEN: "0x36061ce3Ac2F5d69667F0c7B98Ec6021ef33b8cB", + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: "0x6EDCE65403992e310A62460808c4b910D972f10f", + }, + MAKER_DAO: { + DAI_TOKEN: "0x5879B1ae381DDbBa701170160162025d297ce3D3", + } + }, + }, + localhost: { + TEMPLE_GOLD: { + AUCTION_AUTOMATION_EOA: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + STAKING_AUTOMATION_EOA: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + SPICE_AUCTION_OPERATOR: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + TEMPLE_GOLD: "0xf3800C1f5374d9104ab20A48F1F83485BD9a37da", + TEMPLE_GOLD_ADMIN: "0x0222F49C69567eB50f425AF01E2F9FCc451e807B", + TEMPLE_GOLD_STAKING: "0xa7390dA200fcB4ce8C1032Cc024779F488B0D03a", + TEMPLE_TELEPORTER: "0x876d471068e723279Fe52Eb10A6A587cA1a26CA4", + SPICE_AUCTION: "string", + SPICE_AUCTION_FACTORY: "string", + DAI_GOLD_AUCTION: "0xA3174691290D9F0D8Fe3E98D8222441e117d1c46", + EXECUTOR_MSIG: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + RESCUER_MSIG: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + }, + CORE: { + TEMPLE_TOKEN: "0x7816d99063dfEc136d2139681D3fbD92375Ec14c", + }, + EXTERNAL: { + LAYER_ZERO: { + ENDPOINT: '0x1a44076050125825900e736c501f859c50fE728c', + }, + MAKER_DAO: { + DAI_TOKEN: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", + } + }, + } +} + +export function getDeployedTempleGoldContracts(): ContractAddresses { + if (TEMPLEGOLD_DEPLOYED_CONTRACTS[network.name] === undefined) { + console.log(`No contracts configured for ${network.name}`); + throw new Error(`No contracts configured for ${network.name}`); + } else { + return TEMPLEGOLD_DEPLOYED_CONTRACTS[network.name]; + } +} + +export interface ContractInstances { + TEMPLE_GOLD: { + TEMPLE_GOLD: TempleGold, + TEMPLE_GOLD_ADMIN: TempleGoldAdmin, + TEMPLE_GOLD_STAKING: TempleGoldStaking, + TEMPLE_TELEPORTER: TempleTeleporter, + SPICE_AUCTION: SpiceAuction, + SPICE_AUCTION_FACTORY: SpiceAuctionFactory, + DAI_GOLD_AUCTION: DaiGoldAuction, + }, + CORE: { + TEMPLE_TOKEN: TempleERC20Token + }, + EXTERNAL: { + MAKER_DAO: { + DAI_TOKEN: FakeERC20, + }, + }, +} + +export function connectToContracts(owner: Signer): ContractInstances { + const TEMPLE_GOLD_ADDRESSES = getDeployedTempleGoldContracts(); + + return { + TEMPLE_GOLD: { + TEMPLE_GOLD: TempleGold__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, owner), + TEMPLE_GOLD_ADMIN: TempleGoldAdmin__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_ADMIN, owner), + TEMPLE_GOLD_STAKING: TempleGoldStaking__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD_STAKING, owner), + SPICE_AUCTION: SpiceAuction__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.SPICE_AUCTION, owner), + SPICE_AUCTION_FACTORY: SpiceAuctionFactory__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.SPICE_AUCTION_FACTORY, owner), + DAI_GOLD_AUCTION: DaiGoldAuction__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.DAI_GOLD_AUCTION, owner), + TEMPLE_TELEPORTER: TempleTeleporter__factory.connect(TEMPLE_GOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_TELEPORTER, owner), + }, + CORE: { + TEMPLE_TOKEN: TempleERC20Token__factory.connect(TEMPLE_GOLD_ADDRESSES.CORE.TEMPLE_TOKEN, owner), + }, + EXTERNAL: { + MAKER_DAO: { + DAI_TOKEN: FakeERC20__factory.connect(TEMPLE_GOLD_ADDRESSES.EXTERNAL.MAKER_DAO.DAI_TOKEN, owner), + }, + } + } +} \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js new file mode 100644 index 000000000..65db01f44 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js @@ -0,0 +1,12 @@ +// sepolia: TEMPLE_GOLD=0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149 +// yarn hardhat verify --network sepolia 0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149 --constructor-args scripts/deploys/sepolia/deploymentArgs/0x0090F9655a0B0A32cEE0Da5ae45E93EAB4C6d149.js +module.exports = [ + { + "executor": "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "layerZeroEndpoint": "0x6EDCE65403992e310A62460808c4b910D972f10f", + "mintChainId": 421614, + "mintChainLzEid": 40231, + "name": "TEMPLE GOLD", + "symbol": "TGLD" + } +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1.js new file mode 100644 index 000000000..58da23995 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1.js @@ -0,0 +1,11 @@ +// sepolia: SPICE_AUCTION_FACTORY=0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1 +// yarn hardhat verify --network sepolia 0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1 --constructor-args scripts/deploys/sepolia/deploymentArgs/0x0231340BBAf990B3Aa9f2B095b9DC11e493059c1.js +module.exports = [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x2ae6318e34bb97ae3755AFcE75559452aA223A5D", + 40161, + 11155111 +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x192aA9BfDcA5540406E211950C226C8E0cd5047F.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x192aA9BfDcA5540406E211950C226C8E0cd5047F.js new file mode 100644 index 000000000..62b28ae7c --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x192aA9BfDcA5540406E211950C226C8E0cd5047F.js @@ -0,0 +1,12 @@ +// sepolia: TEMPLE_GOLD=0x192aA9BfDcA5540406E211950C226C8E0cd5047F +// yarn hardhat verify --network sepolia 0x192aA9BfDcA5540406E211950C226C8E0cd5047F --constructor-args scripts/deploys/sepolia/deploymentArgs/0x192aA9BfDcA5540406E211950C226C8E0cd5047F.js +module.exports = [ + { + "executor": "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "layerZeroEndpoint": "0x6EDCE65403992e310A62460808c4b910D972f10f", + "mintChainId": 421614, + "mintChainLzEid": 40231, + "name": "TEMPLE GOLD", + "symbol": "TGLD" + } +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x2ae6318e34bb97ae3755AFcE75559452aA223A5D.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x2ae6318e34bb97ae3755AFcE75559452aA223A5D.js new file mode 100644 index 000000000..13f111f98 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x2ae6318e34bb97ae3755AFcE75559452aA223A5D.js @@ -0,0 +1,12 @@ +// sepolia: TEMPLE_GOLD=0x2ae6318e34bb97ae3755AFcE75559452aA223A5D +// yarn hardhat verify --network sepolia 0x2ae6318e34bb97ae3755AFcE75559452aA223A5D --constructor-args scripts/deploys/sepolia/deploymentArgs/0x2ae6318e34bb97ae3755AFcE75559452aA223A5D.js +module.exports = [ + { + "executor": "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "layerZeroEndpoint": "0x6EDCE65403992e310A62460808c4b910D972f10f", + "mintChainId": 11155111, + "mintChainLzEid": 40161, + "name": "TEMPLE GOLD", + "symbol": "TGLD" + } +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5.js new file mode 100644 index 000000000..f71685597 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5.js @@ -0,0 +1,7 @@ +// sepolia: TEMPLE_TELEPORTER=0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5 +// yarn hardhat verify --network sepolia 0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5 --constructor-args scripts/deploys/sepolia/deploymentArgs/0x7De0066A6BD454B2Ecaeb3E54814458a71D345A5.js +module.exports = [ + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x64a925B0fA211c44337148C0807f959Bd44b0B67", + "0x6EDCE65403992e310A62460808c4b910D972f10f" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB.js new file mode 100644 index 000000000..bbf676721 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB.js @@ -0,0 +1,10 @@ +// sepolia: DAI_GOLD_AUCTION=0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB +// yarn hardhat verify --network sepolia 0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB --constructor-args scripts/deploys/sepolia/deploymentArgs/0x8d3671d794d511Bb0E3D28e260F8E2233C0653aB.js +module.exports = [ + "0x2ae6318e34bb97ae3755AFcE75559452aA223A5D", + "0xBe9162230D9e637218D74C7f41f62ef2385fEe64", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0x98c5E61b1B3731A1f379E8770861164d23118cdc.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0x98c5E61b1B3731A1f379E8770861164d23118cdc.js new file mode 100644 index 000000000..44ee3d4a4 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0x98c5E61b1B3731A1f379E8770861164d23118cdc.js @@ -0,0 +1,8 @@ +// sepolia: TEMPLE_TOKEN=0x98c5E61b1B3731A1f379E8770861164d23118cdc +// yarn hardhat verify --network sepolia 0x98c5E61b1B3731A1f379E8770861164d23118cdc --constructor-args scripts/deploys/sepolia/deploymentArgs/0x98c5E61b1B3731A1f379E8770861164d23118cdc.js +module.exports = [ + "Temple Token", + "TEMPLE", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "100000000000000000000000" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0xBe9162230D9e637218D74C7f41f62ef2385fEe64.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0xBe9162230D9e637218D74C7f41f62ef2385fEe64.js new file mode 100644 index 000000000..0e7557b24 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0xBe9162230D9e637218D74C7f41f62ef2385fEe64.js @@ -0,0 +1,8 @@ +// sepolia: DAI_TOKEN=0xBe9162230D9e637218D74C7f41f62ef2385fEe64 +// yarn hardhat verify --network sepolia 0xBe9162230D9e637218D74C7f41f62ef2385fEe64 --constructor-args scripts/deploys/sepolia/deploymentArgs/0xBe9162230D9e637218D74C7f41f62ef2385fEe64.js +module.exports = [ + "Dai Token", + "DAI", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "100000000000000000000000" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js new file mode 100644 index 000000000..ce0b6b92e --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js @@ -0,0 +1,7 @@ +// sepolia: TEMPLE_TELEPORTER=0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658 +// yarn hardhat verify --network sepolia 0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658 --constructor-args scripts/deploys/sepolia/deploymentArgs/0xcbc7cf85dd0AB91Aa2671400E86ebf3AaC6dc658.js +module.exports = [ + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x64a925B0fA211c44337148C0807f959Bd44b0B67", + "0x6EDCE65403992e310A62460808c4b910D972f10f" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/deploymentArgs/0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js b/protocol/scripts/deploys/sepolia/deploymentArgs/0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js new file mode 100644 index 000000000..af8dec01a --- /dev/null +++ b/protocol/scripts/deploys/sepolia/deploymentArgs/0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js @@ -0,0 +1,8 @@ +// sepolia: TEMPLE_GOLD_STAKING=0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F +// yarn hardhat verify --network sepolia 0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F --constructor-args scripts/deploys/sepolia/deploymentArgs/0xdbDAc0FCA9cF8CA2F2Ef718775f0F265f581808F.js +module.exports = [ + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "0xC785695710292c042a2de8A0Ba16F3a054cC2eAD", + "0x98c5E61b1B3731A1f379E8770861164d23118cdc", + "0x2ae6318e34bb97ae3755AFcE75559452aA223A5D" +]; \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/01a-temple-gold.ts b/protocol/scripts/deploys/sepolia/templegold/01a-temple-gold.ts new file mode 100644 index 000000000..ebfecab98 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/01a-temple-gold.ts @@ -0,0 +1,43 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGold__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const SEPOLIA_CHAIN_ID = 11155111; + const SEPOLIA_LZ_EID = 40161; + const _initArgs = { + // Changed in transfer ownership to TempleAdmin + executor: ownerAddress, // executor is also used as delegate in LayerZero Endpoint. + layerZeroEndpoint: TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT, // local endpoint address + mintChainId: SEPOLIA_CHAIN_ID, + mintChainLzEid: SEPOLIA_LZ_EID, + name: "TEMPLE GOLD", + symbol: "TGLD" + }; + const factory = new TempleGold__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD', + factory, + factory.deploy, + _initArgs + ); + +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/01b-dai-token.ts b/protocol/scripts/deploys/sepolia/templegold/01b-dai-token.ts new file mode 100644 index 000000000..6991f1e6c --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/01b-dai-token.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { FakeERC20__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, + toAtto, +} from '../../helpers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + + await _deployTempleToken(owner); +} + +async function _deployTempleToken(owner: SignerWithAddress) { + const factory = new FakeERC20__factory(owner); + await deployAndMine( + 'DAI_TOKEN', + factory, + factory.deploy, + "Dai Token", + "DAI", + await owner.getAddress(), + toAtto(100_000) + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/02-temple-token.ts b/protocol/scripts/deploys/sepolia/templegold/02-temple-token.ts new file mode 100644 index 000000000..d734ce614 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/02-temple-token.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { FakeERC20__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, + toAtto, +} from '../../helpers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + + await _deployTempleToken(owner); +} + +async function _deployTempleToken(owner: SignerWithAddress) { + const factory = new FakeERC20__factory(owner); + await deployAndMine( + 'TEMPLE_TOKEN', + factory, + factory.deploy, + "Temple Token", + "TEMPLE", + await owner.getAddress(), + toAtto(100_000) + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/03-temple-teleporter.ts b/protocol/scripts/deploys/sepolia/templegold/03-temple-teleporter.ts new file mode 100644 index 000000000..d1867d7ec --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/03-temple-teleporter.ts @@ -0,0 +1,36 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleTeleporter__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; +import { getDeployedContracts } from '../v2/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const CORE_ADDRESSES = getDeployedContracts(); + + + const factory = new TempleTeleporter__factory(owner); + await deployAndMine( + 'TEMPLE_TELEPORTER', + factory, + factory.deploy, + await owner.getAddress(), // executor + CORE_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.EXTERNAL.LAYER_ZERO.ENDPOINT + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/03b-temple-gold-staking.ts b/protocol/scripts/deploys/sepolia/templegold/03b-temple-gold-staking.ts new file mode 100644 index 000000000..7b16503a2 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/03b-temple-gold-staking.ts @@ -0,0 +1,38 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { TempleGoldStaking__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + console.log("ADDYSDSDFAS"); + console.log(TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN); + console.log(TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD); + console.log(ownerAddress); + const factory = new TempleGoldStaking__factory(owner); + await deployAndMine( + 'TEMPLE_GOLD_STAKING', + factory, + factory.deploy, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, + TEMPLEGOLD_ADDRESSES.CORE.TEMPLE_TOKEN, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/04-dai-gold-auction.ts b/protocol/scripts/deploys/sepolia/templegold/04-dai-gold-auction.ts new file mode 100644 index 000000000..519b8104a --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/04-dai-gold-auction.ts @@ -0,0 +1,37 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { DaiGoldAuction__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + + const factory = new DaiGoldAuction__factory(owner); + await deployAndMine( + 'DAI_GOLD_AUCTION', + factory, + factory.deploy, + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + TEMPLEGOLD_ADDRESSES.EXTERNAL.MAKER_DAO.DAI_TOKEN, + ownerAddress, // treasury + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, // executor + ownerAddress // auction automation eoa + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/scripts/deploys/sepolia/templegold/05-spice-factory.ts b/protocol/scripts/deploys/sepolia/templegold/05-spice-factory.ts new file mode 100644 index 000000000..70abca0b7 --- /dev/null +++ b/protocol/scripts/deploys/sepolia/templegold/05-spice-factory.ts @@ -0,0 +1,40 @@ +import '@nomiclabs/hardhat-ethers'; +import { ethers } from 'hardhat'; +import { SpiceAuctionFactory__factory } from '../../../../typechain'; +import { + deployAndMine, + ensureExpectedEnvvars, +} from '../../helpers'; +import { getDeployedTempleGoldContracts } from '../../mainnet/templegold/contract-addresses'; + +async function main() { + ensureExpectedEnvvars(); + const [owner] = await ethers.getSigners(); + const ownerAddress = await owner.getAddress(); + const TEMPLEGOLD_ADDRESSES = getDeployedTempleGoldContracts(); + const SEPOLIA_CHAIN_ID = 11155111; + const SEPOLIA_LZ_EID = 40161; + + const factory = new SpiceAuctionFactory__factory(owner); + await deployAndMine( + 'SPICE_AUCTION_FACTORY', + factory, + factory.deploy, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", // rescuer can't be executor. using placeholder + ownerAddress, // executor + ownerAddress, // dao executor, placeholder + ownerAddress, // spice auction operator + TEMPLEGOLD_ADDRESSES.TEMPLE_GOLD.TEMPLE_GOLD, + SEPOLIA_LZ_EID, + SEPOLIA_CHAIN_ID + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/protocol/slither.db.json b/protocol/slither.db.json index b78499f24..c3793f7e4 100644 --- a/protocol/slither.db.json +++ b/protocol/slither.db.json @@ -3,945 +3,870 @@ "elements": [ { "type": "function", - "name": "_swap", + "name": "borrowAndDeposit", "source_mapping": { - "start": 13925, - "length": 768, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "MultiOtcOffer", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1160, - "length": 13535, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_swap(bytes32,uint256)" + "signature": "borrowAndDeposit(uint256)" } }, { "type": "node", - "name": "_userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)", + "name": "treasuryReservesVault.borrow(daiToken,amount,address(this))", "source_mapping": { - "start": 14615, - "length": 71, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 7960, + "length": 61, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [306], + "lines": [197], "starting_column": 9, - "ending_column": 80 + "ending_column": 70 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_swap", + "name": "borrowAndDeposit", "source_mapping": { - "start": 13925, - "length": 768, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307 - ], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "MultiOtcOffer", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1160, - "length": 13535, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_swap(bytes32,uint256)" + "signature": "borrowAndDeposit(uint256)" } } - } - } - ], - "description": "MultiOtcOffer._swap(bytes32,uint256) (contracts/core/MultiOtcOffer.sol#296-307) uses arbitrary from in transferFrom: _userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount) (contracts/core/MultiOtcOffer.sol#306)\n", - "markdown": "[MultiOtcOffer._swap(bytes32,uint256)](contracts/core/MultiOtcOffer.sol#L296-L307) uses arbitrary from in transferFrom: [_userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)](contracts/core/MultiOtcOffer.sol#L306)\n", - "first_markdown_element": "contracts/core/MultiOtcOffer.sol#L296-L307", - "id": "5fcc674f3a64b4a8a632801f25795f7fc58332f3a16f9dbb5c2653279f239534", - "check": "arbitrary-send-erc20", - "impact": "High", - "confidence": "High" - }, - { - "elements": [ - { - "type": "function", - "name": "swap", - "source_mapping": { - "start": 5782, - "length": 517, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", - "is_dependency": false, - "lines": [131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OtcOffer", - "source_mapping": { - "start": 844, - "length": 6488, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", - "is_dependency": false, - "lines": [ - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "swap(uint256)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)", + "name": "_dsrDeposit(amount)", "source_mapping": { - "start": 6222, - "length": 70, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 8031, + "length": 19, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [140], + "lines": [198], "starting_column": 9, - "ending_column": 79 + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "borrowAndDeposit", "source_mapping": { - "start": 5782, - "length": 517, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OtcOffer", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 844, - "length": 6488, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "swap(uint256)" + "signature": "borrowAndDeposit(uint256)" } } - } - } - ], - "description": "OtcOffer.swap(uint256) (contracts/core/OtcOffer.sol#131-141) uses arbitrary from in transferFrom: userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount) (contracts/core/OtcOffer.sol#140)\n", - "markdown": "[OtcOffer.swap(uint256)](contracts/core/OtcOffer.sol#L131-L141) uses arbitrary from in transferFrom: [userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)](contracts/core/OtcOffer.sol#L140)\n", - "first_markdown_element": "contracts/core/OtcOffer.sol#L131-L141", - "id": "05d3d20016db7bcfcaa4746897ba0c55c97e64e9bbf77842db5d2e2d9ceae5fd", - "check": "arbitrary-send-erc20", - "impact": "High", - "confidence": "High" - }, - { - "elements": [ - { - "type": "function", - "name": "_update", - "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleUniswapV2Pair", - "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_update(uint256,uint256,uint112,uint112)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "blockTimestamp = uint32(block.timestamp % 2 ** 32)", + "name": "daiJoin.join(address(this),amount)", "source_mapping": { - "start": 3302, - "length": 55, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 8344, + "length": 35, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [82], + "lines": [207], "starting_column": 9, - "ending_column": 64 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "_dsrDeposit", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "_dsrDeposit(uint256)" } } - } - } - ], - "description": "TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93) uses a weak PRNG: \"blockTimestamp = uint32(block.timestamp % 2 ** 32) (contracts/amm/TempleUniswapV2Pair.sol#82)\" \n", - "markdown": "[TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93) uses a weak PRNG: \"[blockTimestamp = uint32(block.timestamp % 2 ** 32)](contracts/amm/TempleUniswapV2Pair.sol#L82)\" \n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L80-L93", - "id": "290357789cffd43bf264062cb5a528e9a368f77182c65ce7dcfbd4feb9020833", - "check": "weak-prng", - "impact": "High", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "calc", - "source_mapping": { - "start": 856, - "length": 613, - "filename_relative": "contracts/core/JoiningFee.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", - "filename_short": "contracts/core/JoiningFee.sol", - "is_dependency": false, - "lines": [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "JoiningFee", - "source_mapping": { - "start": 461, - "length": 1365, - "filename_relative": "contracts/core/JoiningFee.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", - "filename_short": "contracts/core/JoiningFee.sol", - "is_dependency": false, - "lines": [ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "calc(uint256,uint256,address)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "(block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour", + "name": "chi = pot.drip()", "source_mapping": { - "start": 1359, - "length": 103, - "filename_relative": "contracts/core/JoiningFee.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", - "filename_short": "contracts/core/JoiningFee.sol", + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [38], + "lines": [142], "starting_column": 9, - "ending_column": 112 + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "calc", + "name": "_checkpointChi", "source_mapping": { - "start": 856, - "length": 613, - "filename_relative": "contracts/core/JoiningFee.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", - "filename_short": "contracts/core/JoiningFee.sol", + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], + "lines": [140, 141, 142, 143], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "JoiningFee", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 461, - "length": 1365, - "filename_relative": "contracts/core/JoiningFee.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", - "filename_short": "contracts/core/JoiningFee.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53 - ], + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], "starting_column": 1, "ending_column": 0 } }, - "signature": "calc(uint256,uint256,address)" + "signature": "_checkpointChi()" } } - } - } - ], - "description": "JoiningFee.calc(uint256,uint256,address) (contracts/core/JoiningFee.sol#26-39) performs a multiplication on the result of a division:\n\t- (block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour (contracts/core/JoiningFee.sol#38)\n", - "markdown": "[JoiningFee.calc(uint256,uint256,address)](contracts/core/JoiningFee.sol#L26-L39) performs a multiplication on the result of a division:\n\t- [(block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour](contracts/core/JoiningFee.sol#L38)\n", - "first_markdown_element": "contracts/core/JoiningFee.sol#L26-L39", - "id": "c0d4beb09bbb97e4ec3e7a9e3bd4fc713e216c086a2436671c0e4fdbaa26965b", - "check": "divide-before-multiply", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "inEnterExitWindow", + "type": "node", + "name": "pot.join(shares)", "source_mapping": { - "start": 5308, - "length": 569, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 8389, + "length": 16, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], - "starting_column": 5, - "ending_column": 6 + "lines": [208], + "starting_column": 9, + "ending_column": 25 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "Vault", + "type": "function", + "name": "_dsrDeposit", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 - ], - "starting_column": 1, - "ending_column": 2 + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrDeposit(uint256)" } - }, - "signature": "inEnterExitWindow()" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration", + "name": "DaiDeposited(amount)", "source_mapping": { - "start": 5646, - "length": 76, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 8309, + "length": 25, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [142], + "lines": [206], "starting_column": 9, - "ending_column": 85 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "inEnterExitWindow", + "name": "_dsrDeposit", "source_mapping": { - "start": 5308, - "length": 569, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "inEnterExitWindow()" + "signature": "_dsrDeposit(uint256)" } } - } + }, + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp", + "name": "_dsrDeposit(amount)", "source_mapping": { - "start": 5732, - "length": 138, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 8031, + "length": 19, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [143], + "lines": [198], "starting_column": 9, - "ending_column": 147 + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "inEnterExitWindow", + "name": "borrowAndDeposit", "source_mapping": { - "start": 5308, - "length": 569, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "inEnterExitWindow()" + "signature": "borrowAndDeposit(uint256)" } } - } + }, + "additional_fields": { "underlying_type": "event" } } ], - "description": "Vault.inEnterExitWindow() (contracts/core/Vault.sol#136-144) performs a multiplication on the result of a division:\n\t- cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration (contracts/core/Vault.sol#142)\n\t- inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp (contracts/core/Vault.sol#143)\n", - "markdown": "[Vault.inEnterExitWindow()](contracts/core/Vault.sol#L136-L144) performs a multiplication on the result of a division:\n\t- [cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration](contracts/core/Vault.sol#L142)\n\t- [inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp](contracts/core/Vault.sol#L143)\n", - "first_markdown_element": "contracts/core/Vault.sol#L136-L144", - "id": "8c7714b71ec341b6d2099880abd107a6f2fea28b8e3eacb52ca0a2b093c07ec7", - "check": "divide-before-multiply", - "impact": "Medium", + "description": "Reentrancy in DsrBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#195-199):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(daiToken,amount,address(this)) (contracts/v2/strategies/DsrBaseStrategy.sol#197)\n\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n\t\t- daiJoin.join(address(this),amount) (contracts/v2/strategies/DsrBaseStrategy.sol#207)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t\t- pot.join(shares) (contracts/v2/strategies/DsrBaseStrategy.sol#208)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#206)\n\t\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(daiToken,amount,address(this))](contracts/v2/strategies/DsrBaseStrategy.sol#L197)\n\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n\t\t- [daiJoin.join(address(this),amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L207)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t\t- [pot.join(shares)](contracts/v2/strategies/DsrBaseStrategy.sol#L208)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L206)\n\t\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199", + "id": "6f150fd09fac2796a24b461a93dcda378e0b73d3d94cc538625af3f9b9d80747", + "check": "reentrancy-events", + "impact": "Low", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "_safeTransfer", + "name": "_swap", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 13926, + "length": 768, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "MultiOtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1161, + "length": 13535, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "_swap(bytes32,uint256)" } }, { "type": "node", - "name": "require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED)", + "name": "_userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)", "source_mapping": { - "start": 2073, - "length": 96, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 14616, + "length": 71, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [51], + "lines": [306], "starting_column": 9, - "ending_column": 105 + "ending_column": 80 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "_swap", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 13926, + "length": 768, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "MultiOtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1161, + "length": 13535, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "_swap(bytes32,uint256)" } } } } ], - "description": "TempleUniswapV2Pair._safeTransfer(address,address,uint256) (contracts/amm/TempleUniswapV2Pair.sol#49-52) uses a dangerous strict equality:\n\t- require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED) (contracts/amm/TempleUniswapV2Pair.sol#51)\n", - "markdown": "[TempleUniswapV2Pair._safeTransfer(address,address,uint256)](contracts/amm/TempleUniswapV2Pair.sol#L49-L52) uses a dangerous strict equality:\n\t- [require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED)](contracts/amm/TempleUniswapV2Pair.sol#L51)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L49-L52", - "id": "2ee4045d0f377d6f8b394394680249a386668a22c42975e90902df9d8fa3b850", - "check": "incorrect-equality", - "impact": "Medium", + "description": "MultiOtcOffer._swap(bytes32,uint256) (contracts/core/MultiOtcOffer.sol#296-307) uses arbitrary from in transferFrom: _userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount) (contracts/core/MultiOtcOffer.sol#306)\n", + "markdown": "[MultiOtcOffer._swap(bytes32,uint256)](contracts/core/MultiOtcOffer.sol#L296-L307) uses arbitrary from in transferFrom: [_userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)](contracts/core/MultiOtcOffer.sol#L306)\n", + "first_markdown_element": "contracts/core/MultiOtcOffer.sol#L296-L307", + "id": "5fcc674f3a64b4a8a632801f25795f7fc58332f3a16f9dbb5c2653279f239534", + "check": "arbitrary-send-erc20", + "impact": "High", "confidence": "High" }, { "elements": [ { "type": "function", - "name": "mint", + "name": "swap", "source_mapping": { - "start": 4063, - "length": 1069, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5783, + "length": 517, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [ - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115 - ], + "lines": [131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 845, + "length": 6488, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "mint(address)" + "signature": "swap(uint256)" } }, { "type": "node", - "name": "_totalSupply == 0", + "name": "userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)", "source_mapping": { - "start": 4568, - "length": 17, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 6223, + "length": 70, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [104], - "starting_column": 13, - "ending_column": 30 + "lines": [140], + "starting_column": 9, + "ending_column": 79 }, "type_specific_fields": { "parent": { "type": "function", - "name": "mint", + "name": "swap", "source_mapping": { - "start": 4063, - "length": 1069, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5783, + "length": 517, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [ - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115 - ], + "lines": [131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 845, + "length": 6488, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "mint(address)" + "signature": "swap(uint256)" } } } } ], - "description": "TempleUniswapV2Pair.mint(address) (contracts/amm/TempleUniswapV2Pair.sol#96-115) uses a dangerous strict equality:\n\t- _totalSupply == 0 (contracts/amm/TempleUniswapV2Pair.sol#104)\n", - "markdown": "[TempleUniswapV2Pair.mint(address)](contracts/amm/TempleUniswapV2Pair.sol#L96-L115) uses a dangerous strict equality:\n\t- [_totalSupply == 0](contracts/amm/TempleUniswapV2Pair.sol#L104)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L96-L115", - "id": "f3faa53f859ed259e9ff2509250c109f539dc4c8a41ed53a9c3a3342c73a4cea", - "check": "incorrect-equality", - "impact": "Medium", + "description": "OtcOffer.swap(uint256) (contracts/core/OtcOffer.sol#131-141) uses arbitrary from in transferFrom: userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount) (contracts/core/OtcOffer.sol#140)\n", + "markdown": "[OtcOffer.swap(uint256)](contracts/core/OtcOffer.sol#L131-L141) uses arbitrary from in transferFrom: [userBuyToken.safeTransferFrom(_fundsOwner,msg.sender,buyTokenAmount)](contracts/core/OtcOffer.sol#L140)\n", + "first_markdown_element": "contracts/core/OtcOffer.sol#L131-L141", + "id": "05d3d20016db7bcfcaa4746897ba0c55c97e64e9bbf77842db5d2e2d9ceae5fd", + "check": "arbitrary-send-erc20", + "impact": "High", "confidence": "High" }, { "elements": [ { "type": "function", - "name": "amountPerShare", + "name": "_burnAndNotify", "source_mapping": { - "start": 4930, - "length": 372, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -949,13 +874,13 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "SpiceAuction", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, @@ -971,43 +896,66 @@ 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "amountPerShare()" + "signature": "_burnAndNotify(uint256,address,bool)" } }, { "type": "node", - "name": "p == 0", + "name": "IERC20(templeGold).safeTransferFrom(from,address(this),amount)", "source_mapping": { - "start": 5206, - "length": 6, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 21379, + "length": 64, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [127], - "starting_column": 13, - "ending_column": 19 + "lines": [453], + "starting_column": 9, + "ending_column": 73 }, "type_specific_fields": { "parent": { "type": "function", - "name": "amountPerShare", + "name": "_burnAndNotify", "source_mapping": { - "start": 4930, - "length": 372, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -1015,13 +963,13 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "SpiceAuction", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, @@ -1038,41 +986,66 @@ 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "amountPerShare()" + "signature": "_burnAndNotify(uint256,address,bool)" } } } } ], - "description": "Vault.amountPerShare() (contracts/core/Vault.sol#121-134) uses a dangerous strict equality:\n\t- p == 0 (contracts/core/Vault.sol#127)\n", - "markdown": "[Vault.amountPerShare()](contracts/core/Vault.sol#L121-L134) uses a dangerous strict equality:\n\t- [p == 0](contracts/core/Vault.sol#L127)\n", - "first_markdown_element": "contracts/core/Vault.sol#L121-L134", - "id": "de749cfce8ce80cfe760160d413ea1c1c688ac04215e9656e646ee64ebe27c1c", - "check": "incorrect-equality", - "impact": "Medium", + "description": "SpiceAuction._burnAndNotify(uint256,address,bool) (contracts/templegold/SpiceAuction.sol#451-486) uses arbitrary from in transferFrom: IERC20(templeGold).safeTransferFrom(from,address(this),amount) (contracts/templegold/SpiceAuction.sol#453)\n", + "markdown": "[SpiceAuction._burnAndNotify(uint256,address,bool)](contracts/templegold/SpiceAuction.sol#L451-L486) uses arbitrary from in transferFrom: [IERC20(templeGold).safeTransferFrom(from,address(this),amount)](contracts/templegold/SpiceAuction.sol#L453)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L451-L486", + "id": "030a98e76d59cd5d23020d701f11fa98361ffe54cd8bac40101466a875ff26bd", + "check": "arbitrary-send-erc20", + "impact": "High", "confidence": "High" }, { "elements": [ { "type": "function", - "name": "burn", + "name": "_burnAndNotify", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -1080,64 +1053,88 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "SpiceAuction", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "_burnAndNotify(uint256,address,bool)" } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0)", + "name": "ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this)))", "source_mapping": { - "start": 6213, - "length": 35, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 22546, + "length": 92, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [131], - "starting_column": 9, - "ending_column": 44 + "lines": [477], + "starting_column": 13, + "ending_column": 105 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "_burnAndNotify", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -1145,135 +1142,242 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "SpiceAuction", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "_burnAndNotify(uint256,address,bool)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender))", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 22669, + "length": 89, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [479], + "starting_column": 13, + "ending_column": 102 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "_burnAndNotify", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "SpiceAuction", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "_burnAndNotify(uint256,address,bool)" } } + } + } + ], + "description": "SpiceAuction._burnAndNotify(uint256,address,bool) (contracts/templegold/SpiceAuction.sol#451-486) sends eth to arbitrary user\n\tDangerous calls:\n\t- ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this))) (contracts/templegold/SpiceAuction.sol#477)\n\t- ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender)) (contracts/templegold/SpiceAuction.sol#479)\n", + "markdown": "[SpiceAuction._burnAndNotify(uint256,address,bool)](contracts/templegold/SpiceAuction.sol#L451-L486) sends eth to arbitrary user\n\tDangerous calls:\n\t- [ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this)))](contracts/templegold/SpiceAuction.sol#L477)\n\t- [ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender))](contracts/templegold/SpiceAuction.sol#L479)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L451-L486", + "id": "62d227c48e51cc074ca3c1e6ffb5aeb5cd159436393cf8f08e7b0e1aea388b71", + "check": "arbitrary-send-eth", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_update", + "source_mapping": { + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_update(uint256,uint256,uint112,uint112)" + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1)", + "name": "blockTimestamp = uint32(block.timestamp % 2 ** 32)", "source_mapping": { - "start": 6258, - "length": 35, + "start": 3302, + "length": 55, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [132], + "lines": [82], "starting_column": 9, - "ending_column": 44 + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "_update", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 3107, + "length": 847, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, @@ -1308,248 +1412,388 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", - "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + } + } + ], + "description": "TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93) uses a weak PRNG: \"blockTimestamp = uint32(block.timestamp % 2 ** 32) (contracts/amm/TempleUniswapV2Pair.sol#82)\" \n", + "markdown": "[TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93) uses a weak PRNG: \"[blockTimestamp = uint32(block.timestamp % 2 ** 32)](contracts/amm/TempleUniswapV2Pair.sol#L82)\" \n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L80-L93", + "id": "290357789cffd43bf264062cb5a528e9a368f77182c65ce7dcfbd4feb9020833", + "check": "weak-prng", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "calc", + "source_mapping": { + "start": 856, + "length": 613, + "filename_relative": "contracts/core/JoiningFee.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", + "filename_short": "contracts/core/JoiningFee.sol", "is_dependency": false, - "lines": [50], + "lines": [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "JoiningFee", + "source_mapping": { + "start": 461, + "length": 1365, + "filename_relative": "contracts/core/JoiningFee.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", + "filename_short": "contracts/core/JoiningFee.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "calc(uint256,uint256,address)" + } + }, + { + "type": "node", + "name": "(block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour", + "source_mapping": { + "start": 1359, + "length": 103, + "filename_relative": "contracts/core/JoiningFee.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", + "filename_short": "contracts/core/JoiningFee.sol", + "is_dependency": false, + "lines": [38], "starting_column": 9, - "ending_column": 100 + "ending_column": 112 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "calc", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 856, + "length": 613, + "filename_relative": "contracts/core/JoiningFee.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", + "filename_short": "contracts/core/JoiningFee.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "JoiningFee", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 461, + "length": 1365, + "filename_relative": "contracts/core/JoiningFee.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/JoiningFee.sol", + "filename_short": "contracts/core/JoiningFee.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "calc(uint256,uint256,address)" } } + } + } + ], + "description": "JoiningFee.calc(uint256,uint256,address) (contracts/core/JoiningFee.sol#26-39) performs a multiplication on the result of a division:\n\t- (block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour (contracts/core/JoiningFee.sol#38)\n", + "markdown": "[JoiningFee.calc(uint256,uint256,address)](contracts/core/JoiningFee.sol#L26-L39) performs a multiplication on the result of a division:\n\t- [(block.timestamp - (numCycles * periodDuration) - firstPeriodStartTimestamp) / 3600 * feePerHour](contracts/core/JoiningFee.sol#L38)\n", + "first_markdown_element": "contracts/core/JoiningFee.sol#L26-L39", + "id": "c0d4beb09bbb97e4ec3e7a9e3bd4fc713e216c086a2436671c0e4fdbaa26965b", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "inEnterExitWindow", + "source_mapping": { + "start": 5308, + "length": 569, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "inEnterExitWindow()" + } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration", "source_mapping": { - "start": 6426, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5646, + "length": 76, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [136], + "lines": [142], "starting_column": 9, - "ending_column": 58 + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "inEnterExitWindow", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5308, + "length": 569, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Vault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "burn(address)" + "signature": "inEnterExitWindow()" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "blockTimestampLast" } }, { "type": "node", - "name": "blockTimestampLast = blockTimestamp", + "name": "inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp", "source_mapping": { - "start": 3873, - "length": 35, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5732, + "length": 138, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [91], + "lines": [143], "starting_column": 9, - "ending_column": 44 + "ending_column": 147 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "inEnterExitWindow", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5308, + "length": 569, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [136, 137, 138, 139, 140, 141, 142, 143, 144], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Vault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "inEnterExitWindow()" } } + } + } + ], + "description": "Vault.inEnterExitWindow() (contracts/core/Vault.sol#136-144) performs a multiplication on the result of a division:\n\t- cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration (contracts/core/Vault.sol#142)\n\t- inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp (contracts/core/Vault.sol#143)\n", + "markdown": "[Vault.inEnterExitWindow()](contracts/core/Vault.sol#L136-L144) performs a multiplication on the result of a division:\n\t- [cycleNumber = (block.timestamp - firstPeriodStartTimestamp) / periodDuration](contracts/core/Vault.sol#L142)\n\t- [inWindow = cycleNumber * periodDuration + firstPeriodStartTimestamp + enterExitWindowDuration + ENTER_EXIT_WINDOW_BUFFER > block.timestamp](contracts/core/Vault.sol#L143)\n", + "first_markdown_element": "contracts/core/Vault.sol#L136-L144", + "id": "8c7714b71ec341b6d2099880abd107a6f2fea28b8e3eacb52ca0a2b093c07ec7", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_safeTransfer", + "source_mapping": { + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [49, 50, 51, 52], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "blockTimestampLast" + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_safeTransfer(address,address,uint256)" } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED)", "source_mapping": { - "start": 6426, - "length": 49, + "start": 2073, + "length": 96, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [136], + "lines": [51], "starting_column": 9, - "ending_column": 58 + "ending_column": 105 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "_safeTransfer", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 1892, + "length": 284, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, @@ -1584,41 +1828,101 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "_safeTransfer(address,address,uint256)" } } + } + } + ], + "description": "TempleUniswapV2Pair._safeTransfer(address,address,uint256) (contracts/amm/TempleUniswapV2Pair.sol#49-52) uses a dangerous strict equality:\n\t- require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED) (contracts/amm/TempleUniswapV2Pair.sol#51)\n", + "markdown": "[TempleUniswapV2Pair._safeTransfer(address,address,uint256)](contracts/amm/TempleUniswapV2Pair.sol#L49-L52) uses a dangerous strict equality:\n\t- [require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),UniswapV2: TRANSFER_FAILED)](contracts/amm/TempleUniswapV2Pair.sol#L51)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L49-L52", + "id": "2ee4045d0f377d6f8b394394680249a386668a22c42975e90902df9d8fa3b850", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "mint", + "source_mapping": { + "start": 4063, + "length": 1069, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "reserve0" + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "mint(address)" } }, { "type": "node", - "name": "reserve0 = uint112(balance0)", + "name": "_totalSupply == 0", "source_mapping": { - "start": 3797, - "length": 28, + "start": 4568, + "length": 17, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [89], - "starting_column": 9, - "ending_column": 37 + "lines": [104], + "starting_column": 13, + "ending_column": 30 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "mint", "source_mapping": { - "start": 3107, - "length": 847, + "start": 4063, + "length": 1069, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115 + ], "starting_column": 5, "ending_column": 6 }, @@ -1653,43 +1957,100 @@ "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "mint(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "reserve0" } - }, - { - "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", - "source_mapping": { - "start": 6426, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + } + ], + "description": "TempleUniswapV2Pair.mint(address) (contracts/amm/TempleUniswapV2Pair.sol#96-115) uses a dangerous strict equality:\n\t- _totalSupply == 0 (contracts/amm/TempleUniswapV2Pair.sol#104)\n", + "markdown": "[TempleUniswapV2Pair.mint(address)](contracts/amm/TempleUniswapV2Pair.sol#L96-L115) uses a dangerous strict equality:\n\t- [_totalSupply == 0](contracts/amm/TempleUniswapV2Pair.sol#L104)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L96-L115", + "id": "f3faa53f859ed259e9ff2509250c109f539dc4c8a41ed53a9c3a3342c73a4cea", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "amountPerShare", + "source_mapping": { + "start": 4930, + "length": 372, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [136], - "starting_column": 9, - "ending_column": 58 + "lines": [ + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "amountPerShare()" + } + }, + { + "type": "node", + "name": "p == 0", + "source_mapping": { + "start": 5206, + "length": 6, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [127], + "starting_column": 13, + "ending_column": 19 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "amountPerShare", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4930, + "length": 372, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134 ], "starting_column": 5, "ending_column": 6 @@ -1697,203 +2058,310 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Vault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "burn(address)" + "signature": "amountPerShare()" } } + } + } + ], + "description": "Vault.amountPerShare() (contracts/core/Vault.sol#121-134) uses a dangerous strict equality:\n\t- p == 0 (contracts/core/Vault.sol#127)\n", + "markdown": "[Vault.amountPerShare()](contracts/core/Vault.sol#L121-L134) uses a dangerous strict equality:\n\t- [p == 0](contracts/core/Vault.sol#L127)\n", + "first_markdown_element": "contracts/core/Vault.sol#L121-L134", + "id": "de749cfce8ce80cfe760160d413ea1c1c688ac04215e9656e646ee64ebe27c1c", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "_getMintAmount", + "source_mapping": { + "start": 11499, + "length": 895, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "reserve1" + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "_getMintAmount(ITempleGold.VestingFactor)" } }, { "type": "node", - "name": "reserve1 = uint112(balance1)", + "name": "_lastMintTimestamp == 0", "source_mapping": { - "start": 3835, - "length": 28, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 11787, + "length": 23, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [90], - "starting_column": 9, - "ending_column": 37 + "lines": [262], + "starting_column": 13, + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "_getMintAmount", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 11499, + "length": 895, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleGold", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "_getMintAmount(ITempleGold.VestingFactor)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "reserve1" } } ], - "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- blockTimestampLast = blockTimestamp (contracts/amm/TempleUniswapV2Pair.sol#91)\n\tTempleUniswapV2Pair.blockTimestampLast (contracts/amm/TempleUniswapV2Pair.sol#25) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- reserve0 = uint112(balance0) (contracts/amm/TempleUniswapV2Pair.sol#89)\n\tTempleUniswapV2Pair.reserve0 (contracts/amm/TempleUniswapV2Pair.sol#23) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- reserve1 = uint112(balance1) (contracts/amm/TempleUniswapV2Pair.sol#90)\n\tTempleUniswapV2Pair.reserve1 (contracts/amm/TempleUniswapV2Pair.sol#24) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [blockTimestampLast = blockTimestamp](contracts/amm/TempleUniswapV2Pair.sol#L91)\n\t[TempleUniswapV2Pair.blockTimestampLast](contracts/amm/TempleUniswapV2Pair.sol#L25) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [reserve0 = uint112(balance0)](contracts/amm/TempleUniswapV2Pair.sol#L89)\n\t[TempleUniswapV2Pair.reserve0](contracts/amm/TempleUniswapV2Pair.sol#L23) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [reserve1 = uint112(balance1)](contracts/amm/TempleUniswapV2Pair.sol#L90)\n\t[TempleUniswapV2Pair.reserve1](contracts/amm/TempleUniswapV2Pair.sol#L24) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", - "id": "0379a89cc8645c2b5e10653eb1e7b3fe6480ded71ea4fc2c34965051d126019a", - "check": "reentrancy-no-eth", + "description": "TempleGold._getMintAmount(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#259-274) uses a dangerous strict equality:\n\t- _lastMintTimestamp == 0 (contracts/templegold/TempleGold.sol#262)\n", + "markdown": "[TempleGold._getMintAmount(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L259-L274) uses a dangerous strict equality:\n\t- [_lastMintTimestamp == 0](contracts/templegold/TempleGold.sol#L262)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L259-L274", + "id": "d39879cfcca7dc263f292466e610d26e7126070fbe93772bb38b9883e930d1d3", + "check": "incorrect-equality", "impact": "Medium", - "confidence": "Medium" + "confidence": "High" }, { "elements": [ { "type": "function", - "name": "swap", + "name": "_rewardPerToken", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 16893, + "length": 469, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleGoldStaking", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "_rewardPerToken()" } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0Out)", + "name": "totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish", "source_mapping": { - "start": 7388, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 16966, + "length": 72, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [153], - "starting_column": 29, - "ending_column": 67 + "lines": [437], + "starting_column": 13, + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "_rewardPerToken", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 16893, + "length": 469, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447 ], "starting_column": 5, "ending_column": 6 @@ -1901,135 +2369,520 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleGoldStaking", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "_rewardPerToken()" } } + } + } + ], + "description": "TempleGoldStaking._rewardPerToken() (contracts/templegold/TempleGoldStaking.sol#436-447) uses a dangerous strict equality:\n\t- totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish (contracts/templegold/TempleGoldStaking.sol#437)\n", + "markdown": "[TempleGoldStaking._rewardPerToken()](contracts/templegold/TempleGoldStaking.sol#L436-L447) uses a dangerous strict equality:\n\t- [totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish](contracts/templegold/TempleGoldStaking.sol#L437)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L436-L447", + "id": "040221d63167451b8c2bfb1dc3b3ce00e51c020ea30d9d7d045f513fa6dd638e", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "_writeCheckpoint", + "source_mapping": { + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "nCheckpoints > 0 && _checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 20166, + "length": 87, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, + "lines": [517], + "starting_column": 13, "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "_writeCheckpoint", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleGoldStaking", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } + } + ], + "description": "TempleGoldStaking._writeCheckpoint(address,uint256,uint256,uint256) (contracts/templegold/TempleGoldStaking.sol#511-524) uses a dangerous strict equality:\n\t- nCheckpoints > 0 && _checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number (contracts/templegold/TempleGoldStaking.sol#517)\n", + "markdown": "[TempleGoldStaking._writeCheckpoint(address,uint256,uint256,uint256)](contracts/templegold/TempleGoldStaking.sol#L511-L524) uses a dangerous strict equality:\n\t- [nCheckpoints > 0 && _checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number](contracts/templegold/TempleGoldStaking.sol#L517)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L511-L524", + "id": "b7e196344c0f6a620f01b7bda19f71ee5d56a8fbc631de8dbe7dcf661062a282", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "getAccountUnstakeTime", + "source_mapping": { + "start": 13201, + "length": 181, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [331, 332, 333], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "getAccountUnstakeTime(address)" + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1Out)", + "name": "stakeTimes[account] == 0", "source_mapping": { - "start": 7490, - "length": 38, + "start": 13300, + "length": 75, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [332], + "starting_column": 9, + "ending_column": 84 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "getAccountUnstakeTime", + "source_mapping": { + "start": 13201, + "length": 181, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [331, 332, 333], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "getAccountUnstakeTime(address)" + } + } + } + } + ], + "description": "TempleGoldStaking.getAccountUnstakeTime(address) (contracts/templegold/TempleGoldStaking.sol#331-333) uses a dangerous strict equality:\n\t- stakeTimes[account] == 0 (contracts/templegold/TempleGoldStaking.sol#332)\n", + "markdown": "[TempleGoldStaking.getAccountUnstakeTime(address)](contracts/templegold/TempleGoldStaking.sol#L331-L333) uses a dangerous strict equality:\n\t- [stakeTimes[account] == 0](contracts/templegold/TempleGoldStaking.sol#L332)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L331-L333", + "id": "aeb68fe6974d920bb54950f55baaee4ea8bcc3fba03cc02dff9d405f7b7d674a", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "burn", + "source_mapping": { + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [154], - "starting_column": 29, - "ending_column": 67 + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "burn(address)" + } + }, + { + "type": "node", + "name": "_safeTransfer(_token0,to,amount0)", + "source_mapping": { + "start": 6213, + "length": 35, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [131], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -2065,7 +2918,7 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, @@ -2139,33 +2992,32 @@ }, { "type": "node", - "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", + "name": "_safeTransfer(_token1,to,amount1)", "source_mapping": { - "start": 7593, - "length": 76, + "start": 6258, + "length": 35, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [155], - "starting_column": 30, - "ending_column": 106 + "lines": [132], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -2201,41 +3053,106 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, "additional_fields": { "underlying_type": "external_calls" } }, + { + "type": "node", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "source_mapping": { + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [50], + "starting_column": 9, + "ending_column": 100 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_safeTransfer", + "source_mapping": { + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [49, 50, 51, 52], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_safeTransfer(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { "type": "node", "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 8457, + "start": 6426, "length": 49, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [168], + "lines": [136], "starting_column": 9, "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -2271,7 +3188,7 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, @@ -2353,31 +3270,30 @@ "type": "node", "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 8457, + "start": 6426, "length": 49, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [168], + "lines": [136], "starting_column": 9, "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -2413,7 +3329,7 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, @@ -2495,31 +3411,30 @@ "type": "node", "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 8457, + "start": 6426, "length": 49, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [168], + "lines": [136], "starting_column": 9, "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -2555,7 +3470,7 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, @@ -2634,10 +3549,10 @@ } } ], - "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- blockTimestampLast = blockTimestamp (contracts/amm/TempleUniswapV2Pair.sol#91)\n\tTempleUniswapV2Pair.blockTimestampLast (contracts/amm/TempleUniswapV2Pair.sol#25) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- reserve0 = uint112(balance0) (contracts/amm/TempleUniswapV2Pair.sol#89)\n\tTempleUniswapV2Pair.reserve0 (contracts/amm/TempleUniswapV2Pair.sol#23) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- reserve1 = uint112(balance1) (contracts/amm/TempleUniswapV2Pair.sol#90)\n\tTempleUniswapV2Pair.reserve1 (contracts/amm/TempleUniswapV2Pair.sol#24) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [blockTimestampLast = blockTimestamp](contracts/amm/TempleUniswapV2Pair.sol#L91)\n\t[TempleUniswapV2Pair.blockTimestampLast](contracts/amm/TempleUniswapV2Pair.sol#L25) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [reserve0 = uint112(balance0)](contracts/amm/TempleUniswapV2Pair.sol#L89)\n\t[TempleUniswapV2Pair.reserve0](contracts/amm/TempleUniswapV2Pair.sol#L23) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [reserve1 = uint112(balance1)](contracts/amm/TempleUniswapV2Pair.sol#L90)\n\t[TempleUniswapV2Pair.reserve1](contracts/amm/TempleUniswapV2Pair.sol#L24) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", - "id": "5cdaaff3e567de31630793ad7f06e2a605da21349f80f6007c70ec2bd319fbc0", + "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- blockTimestampLast = blockTimestamp (contracts/amm/TempleUniswapV2Pair.sol#91)\n\tTempleUniswapV2Pair.blockTimestampLast (contracts/amm/TempleUniswapV2Pair.sol#25) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- reserve0 = uint112(balance0) (contracts/amm/TempleUniswapV2Pair.sol#89)\n\tTempleUniswapV2Pair.reserve0 (contracts/amm/TempleUniswapV2Pair.sol#23) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- reserve1 = uint112(balance1) (contracts/amm/TempleUniswapV2Pair.sol#90)\n\tTempleUniswapV2Pair.reserve1 (contracts/amm/TempleUniswapV2Pair.sol#24) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [blockTimestampLast = blockTimestamp](contracts/amm/TempleUniswapV2Pair.sol#L91)\n\t[TempleUniswapV2Pair.blockTimestampLast](contracts/amm/TempleUniswapV2Pair.sol#L25) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [reserve0 = uint112(balance0)](contracts/amm/TempleUniswapV2Pair.sol#L89)\n\t[TempleUniswapV2Pair.reserve0](contracts/amm/TempleUniswapV2Pair.sol#L23) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [reserve1 = uint112(balance1)](contracts/amm/TempleUniswapV2Pair.sol#L90)\n\t[TempleUniswapV2Pair.reserve1](contracts/amm/TempleUniswapV2Pair.sol#L24) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", + "id": "0379a89cc8645c2b5e10653eb1e7b3fe6480ded71ea4fc2c34965051d126019a", "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" @@ -2646,97 +3561,120 @@ "elements": [ { "type": "function", - "name": "decreaseShares", + "name": "swap", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } }, { "type": "node", - "name": "claimFor(account)", + "name": "_safeTransfer(_token0,to,amount0Out)", "source_mapping": { - "start": 2461, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 7388, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [70], - "starting_column": 9, - "ending_column": 26 + "lines": [153], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "swap", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, @@ -2744,57 +3682,65 @@ }, { "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91], + "lines": [50], "starting_column": 9, - "ending_column": 65 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "_safeTransfer", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "_safeTransfer(address,address,uint256)" } } }, @@ -2802,214 +3748,169 @@ }, { "type": "node", - "name": "claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare", + "name": "_safeTransfer(_token1,to,amount1Out)", "source_mapping": { - "start": 2555, - "length": 68, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 7490, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74], - "starting_column": 9, - "ending_column": 77 + "lines": [154], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "swap", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "claimedByScaled" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "shares[account] -= amount", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 2489, - "length": 25, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [72], + "lines": [50], "starting_column": 9, - "ending_column": 34 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "_safeTransfer", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "shares" - } - } - ], - "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare (contracts/core/TreasuryFarmingRevenue.sol#74)\n\tTreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- shares[account] -= amount (contracts/core/TreasuryFarmingRevenue.sol#72)\n\tTreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- TreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare](contracts/core/TreasuryFarmingRevenue.sol#L74)\n\t[TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [shares[account] -= amount](contracts/core/TreasuryFarmingRevenue.sol#L72)\n\t[TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", - "id": "cc45c8f5d22793c2ba894c4d32e4043890c1184c0a94e5502d25b97876a95c86", - "check": "reentrancy-no-eth", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "deployPayouts", - "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "paymentContract.initialize(_token)", + "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", "source_mapping": { - "start": 3294, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 7593, + "length": 76, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [89], - "starting_column": 9, - "ending_column": 43 + "lines": [155], + "starting_column": 30, + "ending_column": 106 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "swap", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], "starting_column": 5, "ending_column": 6 @@ -3017,31 +3918,35 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, @@ -3049,33 +3954,33 @@ }, { "type": "node", - "name": "paymentContract.setAllocations(_dests,_allocations)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3338, - "length": 52, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [90], + "lines": [168], "starting_column": 9, - "ending_column": 61 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "swap", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], "starting_column": 5, "ending_column": 6 @@ -3083,131 +3988,141 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "blockTimestampLast" + } }, { "type": "node", - "name": "paymentContract.transferOwnership(msg.sender)", + "name": "blockTimestampLast = blockTimestamp", "source_mapping": { - "start": 3401, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3873, + "length": 35, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [92], + "lines": [91], "starting_column": 9, - "ending_column": 54 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "_update", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 - ], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "blockTimestampLast" + } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3493, - "length": 165, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [95, 96, 97, 98, 99, 100], - "starting_column": 13, - "ending_column": 14 + "lines": [168], + "starting_column": 9, + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "swap", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], "starting_column": 5, "ending_column": 6 @@ -3215,464 +4130,259 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "incrementEpoch(address(paymentContract),_totalFunding)", - "source_mapping": { - "start": 3669, - "length": 55, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [102], - "starting_column": 9, - "ending_column": 64 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "deployPayouts", - "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, "additional_fields": { "underlying_type": "variables_written", - "variable_name": "lastPaidEpoch" + "variable_name": "reserve0" } }, { "type": "node", - "name": "data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})", + "name": "reserve0 = uint112(balance0)", "source_mapping": { - "start": 1562, - "length": 182, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3797, + "length": 28, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [50, 51, 52, 53, 54], + "lines": [89], "starting_column": 9, - "ending_column": 11 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "incrementEpoch", + "name": "_update", "source_mapping": { - "start": 1448, - "length": 347, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "incrementEpoch(address,uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, "additional_fields": { "underlying_type": "variables_written", - "variable_name": "lastPaidEpoch" - } - } - ], - "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#102)\n\t\t- data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++}) (contracts/admin/TempleTeamPaymentsFactory.sol#50-54)\n\tTempleTeamPaymentsFactory.lastPaidEpoch (contracts/admin/TempleTeamPaymentsFactory.sol#23) can be used in cross function reentrancies:\n\t- TempleTeamPaymentsFactory.constructor(address,uint16) (contracts/admin/TempleTeamPaymentsFactory.sol#40-44)\n\t- TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112)\n\t- TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143)\n\t- TempleTeamPaymentsFactory.incrementEpoch(address,uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#46-56)\n\t- TempleTeamPaymentsFactory.lastPaidEpoch (contracts/admin/TempleTeamPaymentsFactory.sol#23)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L102)\n\t\t- [data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})](contracts/admin/TempleTeamPaymentsFactory.sol#L50-L54)\n\t[TempleTeamPaymentsFactory.lastPaidEpoch](contracts/admin/TempleTeamPaymentsFactory.sol#L23) can be used in cross function reentrancies:\n\t- [TempleTeamPaymentsFactory.constructor(address,uint16)](contracts/admin/TempleTeamPaymentsFactory.sol#L40-L44)\n\t- [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112)\n\t- [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143)\n\t- [TempleTeamPaymentsFactory.incrementEpoch(address,uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L46-L56)\n\t- [TempleTeamPaymentsFactory.lastPaidEpoch](contracts/admin/TempleTeamPaymentsFactory.sol#L23)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", - "id": "1239a22bea2c9a42dbde3ae4ac80f8aa9a378a084fd732a81c3169ae01c87319", - "check": "reentrancy-no-eth", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "increaseShares", - "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "increaseShares(address,uint256)" + "variable_name": "reserve0" } }, { "type": "node", - "name": "claimFor(account)", - "source_mapping": { - "start": 2093, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [57], - "starting_column": 9, - "ending_column": 26 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "increaseShares", - "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "increaseShares(address,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", - "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [91], - "starting_column": 9, - "ending_column": 65 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "claimFor", - "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "claimFor(address)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { - "type": "node", - "name": "claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 2187, - "length": 68, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [61], + "lines": [168], "starting_column": 9, - "ending_column": 77 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "swap", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, "additional_fields": { "underlying_type": "variables_written", - "variable_name": "claimedByScaled" + "variable_name": "reserve1" } }, { "type": "node", - "name": "shares[account] += amount", + "name": "reserve1 = uint112(balance1)", "source_mapping": { - "start": 2121, - "length": 25, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3835, + "length": 28, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [59], + "lines": [90], "starting_column": 9, - "ending_column": 34 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "_update", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, "additional_fields": { "underlying_type": "variables_written", - "variable_name": "shares" + "variable_name": "reserve1" } } ], - "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare (contracts/core/TreasuryFarmingRevenue.sol#61)\n\tTreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- shares[account] += amount (contracts/core/TreasuryFarmingRevenue.sol#59)\n\tTreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- TreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare](contracts/core/TreasuryFarmingRevenue.sol#L61)\n\t[TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [shares[account] += amount](contracts/core/TreasuryFarmingRevenue.sol#L59)\n\t[TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", - "id": "7136d46cea8f0cb4f10b428d075c61a8ad801ba9ca1ef8c90733aaa52034f6ed", + "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- blockTimestampLast = blockTimestamp (contracts/amm/TempleUniswapV2Pair.sol#91)\n\tTempleUniswapV2Pair.blockTimestampLast (contracts/amm/TempleUniswapV2Pair.sol#25) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- reserve0 = uint112(balance0) (contracts/amm/TempleUniswapV2Pair.sol#89)\n\tTempleUniswapV2Pair.reserve0 (contracts/amm/TempleUniswapV2Pair.sol#23) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- reserve1 = uint112(balance1) (contracts/amm/TempleUniswapV2Pair.sol#90)\n\tTempleUniswapV2Pair.reserve1 (contracts/amm/TempleUniswapV2Pair.sol#24) can be used in cross function reentrancies:\n\t- TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93)\n\t- TempleUniswapV2Pair.getReserves() (contracts/amm/TempleUniswapV2Pair.sol#43-47)\n\t- TempleUniswapV2Pair.skim(address) (contracts/amm/TempleUniswapV2Pair.sol#173-178)\n\t- TempleUniswapV2Pair.sync() (contracts/amm/TempleUniswapV2Pair.sol#181-183)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [blockTimestampLast = blockTimestamp](contracts/amm/TempleUniswapV2Pair.sol#L91)\n\t[TempleUniswapV2Pair.blockTimestampLast](contracts/amm/TempleUniswapV2Pair.sol#L25) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [reserve0 = uint112(balance0)](contracts/amm/TempleUniswapV2Pair.sol#L89)\n\t[TempleUniswapV2Pair.reserve0](contracts/amm/TempleUniswapV2Pair.sol#L23) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [reserve1 = uint112(balance1)](contracts/amm/TempleUniswapV2Pair.sol#L90)\n\t[TempleUniswapV2Pair.reserve1](contracts/amm/TempleUniswapV2Pair.sol#L24) can be used in cross function reentrancies:\n\t- [TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93)\n\t- [TempleUniswapV2Pair.getReserves()](contracts/amm/TempleUniswapV2Pair.sol#L43-L47)\n\t- [TempleUniswapV2Pair.skim(address)](contracts/amm/TempleUniswapV2Pair.sol#L173-L178)\n\t- [TempleUniswapV2Pair.sync()](contracts/amm/TempleUniswapV2Pair.sol#L181-L183)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", + "id": "5cdaaff3e567de31630793ad7f06e2a605da21349f80f6007c70ec2bd319fbc0", "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" @@ -3683,7 +4393,7 @@ "type": "function", "name": "_burnDToken", "source_mapping": { - "start": 29999, + "start": 30000, "length": 1179, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3702,7 +4412,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3777,7 +4487,7 @@ "type": "node", "name": "_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)", "source_mapping": { - "start": 30398, + "start": 30399, "length": 71, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3792,7 +4502,7 @@ "type": "function", "name": "_burnDToken", "source_mapping": { - "start": 29999, + "start": 30000, "length": 1179, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3811,7 +4521,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3894,7 +4604,7 @@ "type": "node", "name": "_tokenCredits[token] = _creditBalance", "source_mapping": { - "start": 31023, + "start": 31024, "length": 37, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3909,7 +4619,7 @@ "type": "function", "name": "_burnDToken", "source_mapping": { - "start": 29999, + "start": 30000, "length": 1179, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -3928,7 +4638,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4025,7 +4735,7 @@ "type": "function", "name": "_mintDToken", "source_mapping": { - "start": 28533, + "start": 28534, "length": 1205, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4044,7 +4754,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4119,7 +4829,7 @@ "type": "node", "name": "tokenConfig.dToken.mint(strategy,_newDebt)", "source_mapping": { - "start": 29294, + "start": 29295, "length": 43, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4134,7 +4844,7 @@ "type": "function", "name": "_mintDToken", "source_mapping": { - "start": 28533, + "start": 28534, "length": 1205, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4153,7 +4863,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4236,7 +4946,7 @@ "type": "node", "name": "_tokenCredits[token] = _creditBalance = 0", "source_mapping": { - "start": 29387, + "start": 29388, "length": 41, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4251,7 +4961,7 @@ "type": "function", "name": "_mintDToken", "source_mapping": { - "start": 28533, + "start": 28534, "length": 1205, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4270,7 +4980,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -4367,7 +5077,7 @@ "type": "function", "name": "removeCollateral", "source_mapping": { - "start": 6498, + "start": 6560, "length": 1031, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4385,8 +5095,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4455,8 +5165,7 @@ 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -4469,7 +5178,7 @@ "type": "node", "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", "source_mapping": { - "start": 7012, + "start": 7074, "length": 118, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4484,7 +5193,7 @@ "type": "function", "name": "removeCollateral", "source_mapping": { - "start": 6498, + "start": 6560, "length": 1031, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4502,8 +5211,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4578,8 +5287,7 @@ 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -4595,7 +5303,7 @@ "type": "node", "name": "_accountData.collateral = _collateral - amount", "source_mapping": { - "start": 7229, + "start": 7291, "length": 46, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4610,7 +5318,7 @@ "type": "function", "name": "removeCollateral", "source_mapping": { - "start": 6498, + "start": 6560, "length": 1031, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4628,8 +5336,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4704,8 +5412,7 @@ 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -4735,7 +5442,7 @@ "type": "function", "name": "setTlcStrategy", "source_mapping": { - "start": 15688, + "start": 15750, "length": 819, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4753,8 +5460,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4823,8 +5530,7 @@ 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -4837,7 +5543,7 @@ "type": "node", "name": "daiToken.approve(previousTrv,0)", "source_mapping": { - "start": 16002, + "start": 16064, "length": 32, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4852,7 +5558,7 @@ "type": "function", "name": "setTlcStrategy", "source_mapping": { - "start": 15688, + "start": 15750, "length": 819, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4870,8 +5576,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4946,8 +5652,7 @@ 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -4963,7 +5668,7 @@ "type": "node", "name": "treasuryReservesVault = ITreasuryReservesVault(_trv)", "source_mapping": { - "start": 16124, + "start": 16186, "length": 52, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4978,7 +5683,7 @@ "type": "function", "name": "setTlcStrategy", "source_mapping": { - "start": 15688, + "start": 15750, "length": 819, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -4996,8 +5701,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -5072,8 +5777,7 @@ 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 @@ -5103,7 +5807,7 @@ "type": "function", "name": "setTokenVault", "source_mapping": { - "start": 7960, + "start": 7961, "length": 628, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5121,7 +5825,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5184,7 +5888,7 @@ "type": "node", "name": "protocolToken.approve(previousVault,0)", "source_mapping": { - "start": 8228, + "start": 8229, "length": 39, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5199,7 +5903,7 @@ "type": "function", "name": "setTokenVault", "source_mapping": { - "start": 7960, + "start": 7961, "length": 628, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5217,7 +5921,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5287,7 +5991,7 @@ "type": "node", "name": "quoteToken.approve(previousVault,0)", "source_mapping": { - "start": 8281, + "start": 8282, "length": 36, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5302,7 +6006,7 @@ "type": "function", "name": "setTokenVault", "source_mapping": { - "start": 7960, + "start": 7961, "length": 628, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5320,7 +6024,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5390,7 +6094,7 @@ "type": "node", "name": "tokenVault = IRamosTokenVault(vault)", "source_mapping": { - "start": 8338, + "start": 8339, "length": 36, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5405,7 +6109,7 @@ "type": "function", "name": "setTokenVault", "source_mapping": { - "start": 7960, + "start": 7961, "length": 628, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5423,7 +6127,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -5507,7 +6211,7 @@ "type": "function", "name": "shutdown", "source_mapping": { - "start": 11822, + "start": 11823, "length": 1632, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5526,7 +6230,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5601,7 +6305,7 @@ "type": "node", "name": "_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)", "source_mapping": { - "start": 12499, + "start": 12500, "length": 64, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5616,7 +6320,7 @@ "type": "function", "name": "shutdown", "source_mapping": { - "start": 11822, + "start": 11823, "length": 1632, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5635,7 +6339,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5718,7 +6422,7 @@ "type": "node", "name": "delete strategies[strategy]", "source_mapping": { - "start": 13381, + "start": 13382, "length": 27, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5733,7 +6437,7 @@ "type": "function", "name": "shutdown", "source_mapping": { - "start": 11822, + "start": 11823, "length": 1632, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5752,7 +6456,7 @@ "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", @@ -5846,158 +6550,106 @@ { "elements": [ { - "type": "variable", - "name": "baseStrategyAvailable", + "type": "function", + "name": "bid", "source_mapping": { - "start": 21089, - "length": 29, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [476], - "starting_column": 9, - "ending_column": 38 + "lines": [ + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "totalAvailable", + "type": "contract", + "name": "SpiceAuction", "source_mapping": { - "start": 20920, - "length": 877, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "totalAvailable(IERC20)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "bid(uint256)" } - } - ], - "description": "TreasuryReservesVault.totalAvailable(IERC20).baseStrategyAvailable (contracts/v2/TreasuryReservesVault.sol#476) is a local variable never initialized\n", - "markdown": "[TreasuryReservesVault.totalAvailable(IERC20).baseStrategyAvailable](contracts/v2/TreasuryReservesVault.sol#L476) is a local variable never initialized\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L476", - "id": "5a877bceafff56259a481e94173f69b6c70a20fc470647802278ccdef5ab0fcd", - "check": "uninitialized-local", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "shutdownParams", + "type": "node", + "name": "IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)", "source_mapping": { - "start": 9302, - "length": 36, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 11928, + "length": 65, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [238], + "lines": [239], "starting_column": 9, - "ending_column": 45 + "ending_column": 74 }, "type_specific_fields": { "parent": { "type": "function", - "name": "populateShutdownData", + "name": "bid", "source_mapping": { - "start": 9022, - "length": 564, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243 + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 ], "starting_column": 5, "ending_column": 6 @@ -6005,84 +6657,93 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "SpiceAuction", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "populateShutdownData(bytes)" + "signature": "bid(uint256)" } } - } - } - ], - "description": "RamosStrategy.populateShutdownData(bytes).shutdownParams (contracts/v2/strategies/RamosStrategy.sol#238) is a local variable never initialized\n", - "markdown": "[RamosStrategy.populateShutdownData(bytes).shutdownParams](contracts/v2/strategies/RamosStrategy.sol#L238) is a local variable never initialized\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L238", - "id": "e3b0c7352e8da48d32a58f5b6962b6132c525566519d363234f70e52d4760882", - "check": "uninitialized-local", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls" } + }, { - "type": "variable", - "name": "i", + "type": "node", + "name": "info.totalBidTokenAmount += amount", "source_mapping": { - "start": 8364, - "length": 9, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 12285, + "length": 34, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [213], + "lines": [245], "starting_column": 9, - "ending_column": 18 + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "updateStrategyEnabledBorrowTokens", + "name": "bid", "source_mapping": { - "start": 8067, - "length": 898, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227 + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 ], "starting_column": 5, "ending_column": 6 @@ -6090,92 +6751,74 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "SpiceAuction", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[])" + "signature": "bid(uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochs" } } ], - "description": "TreasuryReservesVault.updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[]).i (contracts/v2/TreasuryReservesVault.sol#213) is a local variable never initialized\n", - "markdown": "[TreasuryReservesVault.updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[]).i](contracts/v2/TreasuryReservesVault.sol#L213) is a local variable never initialized\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L213", - "id": "ccb61a70ed00f67ef5318dfebba8dd5906b02a2b7022418f095ca6131f2e87a0", - "check": "uninitialized-local", + "description": "Reentrancy in SpiceAuction.bid(uint256) (contracts/templegold/SpiceAuction.sol#227-247):\n\tExternal calls:\n\t- IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount) (contracts/templegold/SpiceAuction.sol#239)\n\tState variables written after the call(s):\n\t- info.totalBidTokenAmount += amount (contracts/templegold/SpiceAuction.sol#245)\n\tAuctionBase.epochs (contracts/templegold/AuctionBase.sol#15) can be used in cross function reentrancies:\n\t- SpiceAuction.bid(uint256) (contracts/templegold/SpiceAuction.sol#227-247)\n\t- SpiceAuction.claim(uint256) (contracts/templegold/SpiceAuction.sol#253-272)\n\t- SpiceAuction.getAuctionBidAmount(uint256) (contracts/templegold/SpiceAuction.sol#287-290)\n\t- SpiceAuction.getAuctionTokenAmount(uint256) (contracts/templegold/SpiceAuction.sol#278-281)\n\t- SpiceAuction.getClaimableForEpoch(address,uint256) (contracts/templegold/SpiceAuction.sol#435-441)\n\t- AuctionBase.getEpochInfo(uint256) (contracts/templegold/AuctionBase.sol#29-31)\n\t- SpiceAuction.isActive() (contracts/templegold/SpiceAuction.sol#424-426)\n\t- SpiceAuction.recoverAuctionTokenForZeroBidAuction(uint256,address) (contracts/templegold/SpiceAuction.sol#339-358)\n\t- SpiceAuction.recoverToken(address,address,uint256) (contracts/templegold/SpiceAuction.sol#298-332)\n\t- SpiceAuction.removeAuctionConfig() (contracts/templegold/SpiceAuction.sol#150-179)\n\t- SpiceAuction.setAuctionConfig(ISpiceAuction.SpiceAuctionConfig) (contracts/templegold/SpiceAuction.sol#127-147)\n\t- SpiceAuction.startAuction() (contracts/templegold/SpiceAuction.sol#184-220)\n", + "markdown": "Reentrancy in [SpiceAuction.bid(uint256)](contracts/templegold/SpiceAuction.sol#L227-L247):\n\tExternal calls:\n\t- [IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)](contracts/templegold/SpiceAuction.sol#L239)\n\tState variables written after the call(s):\n\t- [info.totalBidTokenAmount += amount](contracts/templegold/SpiceAuction.sol#L245)\n\t[AuctionBase.epochs](contracts/templegold/AuctionBase.sol#L15) can be used in cross function reentrancies:\n\t- [SpiceAuction.bid(uint256)](contracts/templegold/SpiceAuction.sol#L227-L247)\n\t- [SpiceAuction.claim(uint256)](contracts/templegold/SpiceAuction.sol#L253-L272)\n\t- [SpiceAuction.getAuctionBidAmount(uint256)](contracts/templegold/SpiceAuction.sol#L287-L290)\n\t- [SpiceAuction.getAuctionTokenAmount(uint256)](contracts/templegold/SpiceAuction.sol#L278-L281)\n\t- [SpiceAuction.getClaimableForEpoch(address,uint256)](contracts/templegold/SpiceAuction.sol#L435-L441)\n\t- [AuctionBase.getEpochInfo(uint256)](contracts/templegold/AuctionBase.sol#L29-L31)\n\t- [SpiceAuction.isActive()](contracts/templegold/SpiceAuction.sol#L424-L426)\n\t- [SpiceAuction.recoverAuctionTokenForZeroBidAuction(uint256,address)](contracts/templegold/SpiceAuction.sol#L339-L358)\n\t- [SpiceAuction.recoverToken(address,address,uint256)](contracts/templegold/SpiceAuction.sol#L298-L332)\n\t- [SpiceAuction.removeAuctionConfig()](contracts/templegold/SpiceAuction.sol#L150-L179)\n\t- [SpiceAuction.setAuctionConfig(ISpiceAuction.SpiceAuctionConfig)](contracts/templegold/SpiceAuction.sol#L127-L147)\n\t- [SpiceAuction.startAuction()](contracts/templegold/SpiceAuction.sol#L184-L220)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L227-L247", + "id": "0ee8404008e621fa27bda79b074b31fc9cd13684239e75839d855b0a2ba0ef9f", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -6183,85 +6826,89 @@ "elements": [ { "type": "function", - "name": "_addLiquidity", + "name": "bid", "source_mapping": { - "start": 1776, - "length": 1076, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83 - ], + "lines": [138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "StableGoldAuction", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)" + "signature": "bid(uint256)" } }, { "type": "node", - "name": "(reserveA,reserveB) = pair.getReserves()", + "name": "bidToken.safeTransferFrom(msg.sender,treasury,amount)", "source_mapping": { - "start": 2006, - "length": 52, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 6511, + "length": 55, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [68], + "lines": [141], "starting_column": 9, - "ending_column": 61 + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_addLiquidity", + "name": "bid", "source_mapping": { - "start": 1776, - "length": 1076, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83 + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 ], "starting_column": 5, "ending_column": 6 @@ -6269,177 +6916,141 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "StableGoldAuction", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)" + "signature": "bid(uint256)" } } - } - } - ], - "description": "TempleStableAMMRouter._addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair) (contracts/amm/TempleStableAMMRouter.sol#61-83) ignores return value by (reserveA,reserveB) = pair.getReserves() (contracts/amm/TempleStableAMMRouter.sol#68)\n", - "markdown": "[TempleStableAMMRouter._addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)](contracts/amm/TempleStableAMMRouter.sol#L61-L83) ignores return value by [(reserveA,reserveB) = pair.getReserves()](contracts/amm/TempleStableAMMRouter.sol#L68)\n", - "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L61-L83", - "id": "f24551aba47520a07ab79471d9ec9cfe2fe87cd09c197da35e42997dcded68a8", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "swapExactStableForTempleQuote", - "source_mapping": { - "start": 7571, - "length": 271, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", - "is_dependency": false, - "lines": [202, 203, 204, 205], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleStableAMMRouter", - "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", - "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "swapExactStableForTempleQuote(address,uint256)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()", + "name": "info.totalBidTokenAmount += amount", "source_mapping": { - "start": 7687, - "length": 76, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 6737, + "length": 34, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [203], + "lines": [147], "starting_column": 9, - "ending_column": 85 + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swapExactStableForTempleQuote", + "name": "bid", "source_mapping": { - "start": 7571, - "length": 271, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [202, 203, 204, 205], + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "StableGoldAuction", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swapExactStableForTempleQuote(address,uint256)" + "signature": "bid(uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochs" } } ], - "description": "TempleStableAMMRouter.swapExactStableForTempleQuote(address,uint256) (contracts/amm/TempleStableAMMRouter.sol#202-205) ignores return value by (reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves() (contracts/amm/TempleStableAMMRouter.sol#203)\n", - "markdown": "[TempleStableAMMRouter.swapExactStableForTempleQuote(address,uint256)](contracts/amm/TempleStableAMMRouter.sol#L202-L205) ignores return value by [(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()](contracts/amm/TempleStableAMMRouter.sol#L203)\n", - "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L202-L205", - "id": "bcaddbd83baa19b08f21d46eaa6d5040ec3da28323505b65de50fbfbd874521c", - "check": "unused-return", + "description": "Reentrancy in StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149):\n\tExternal calls:\n\t- bidToken.safeTransferFrom(msg.sender,treasury,amount) (contracts/templegold/StableGoldAuction.sol#141)\n\tState variables written after the call(s):\n\t- info.totalBidTokenAmount += amount (contracts/templegold/StableGoldAuction.sol#147)\n\tAuctionBase.epochs (contracts/templegold/AuctionBase.sol#15) can be used in cross function reentrancies:\n\t- StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149)\n\t- StableGoldAuction.canDeposit() (contracts/templegold/StableGoldAuction.sol#222-224)\n\t- StableGoldAuction.claim(uint256) (contracts/templegold/StableGoldAuction.sol#156-171)\n\t- StableGoldAuction.epochGoldSupply(uint256) (contracts/templegold/StableGoldAuction.sol#190-192)\n\t- StableGoldAuction.getClaimableAtEpoch(address,uint256) (contracts/templegold/StableGoldAuction.sol#251-257)\n\t- AuctionBase.getEpochInfo(uint256) (contracts/templegold/AuctionBase.sol#29-31)\n\t- StableGoldAuction.isCurrentEpochEnded() (contracts/templegold/StableGoldAuction.sol#214-216)\n\t- StableGoldAuction.onlyWhenLive() (contracts/templegold/StableGoldAuction.sol#338-341)\n\t- StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address) (contracts/templegold/StableGoldAuction.sol#309-324)\n\t- StableGoldAuction.recoverToken(address,address,uint256) (contracts/templegold/StableGoldAuction.sol#268-302)\n\t- StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig) (contracts/templegold/StableGoldAuction.sol#67-77)\n\t- StableGoldAuction.setAuctionStarter(address) (contracts/templegold/StableGoldAuction.sol#83-88)\n\t- StableGoldAuction.setBidToken(address) (contracts/templegold/StableGoldAuction.sol#94-99)\n\t- StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132)\n", + "markdown": "Reentrancy in [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149):\n\tExternal calls:\n\t- [bidToken.safeTransferFrom(msg.sender,treasury,amount)](contracts/templegold/StableGoldAuction.sol#L141)\n\tState variables written after the call(s):\n\t- [info.totalBidTokenAmount += amount](contracts/templegold/StableGoldAuction.sol#L147)\n\t[AuctionBase.epochs](contracts/templegold/AuctionBase.sol#L15) can be used in cross function reentrancies:\n\t- [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149)\n\t- [StableGoldAuction.canDeposit()](contracts/templegold/StableGoldAuction.sol#L222-L224)\n\t- [StableGoldAuction.claim(uint256)](contracts/templegold/StableGoldAuction.sol#L156-L171)\n\t- [StableGoldAuction.epochGoldSupply(uint256)](contracts/templegold/StableGoldAuction.sol#L190-L192)\n\t- [StableGoldAuction.getClaimableAtEpoch(address,uint256)](contracts/templegold/StableGoldAuction.sol#L251-L257)\n\t- [AuctionBase.getEpochInfo(uint256)](contracts/templegold/AuctionBase.sol#L29-L31)\n\t- [StableGoldAuction.isCurrentEpochEnded()](contracts/templegold/StableGoldAuction.sol#L214-L216)\n\t- [StableGoldAuction.onlyWhenLive()](contracts/templegold/StableGoldAuction.sol#L338-L341)\n\t- [StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address)](contracts/templegold/StableGoldAuction.sol#L309-L324)\n\t- [StableGoldAuction.recoverToken(address,address,uint256)](contracts/templegold/StableGoldAuction.sol#L268-L302)\n\t- [StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig)](contracts/templegold/StableGoldAuction.sol#L67-L77)\n\t- [StableGoldAuction.setAuctionStarter(address)](contracts/templegold/StableGoldAuction.sol#L83-L88)\n\t- [StableGoldAuction.setBidToken(address)](contracts/templegold/StableGoldAuction.sol#L94-L99)\n\t- [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L138-L149", + "id": "1deb6b0db2cd908ce22928eded5aad4f5f9eef5a4b2b2cc6fb9f4229b19882b3", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -6447,492 +7058,288 @@ "elements": [ { "type": "function", - "name": "swapExactTempleForStableQuote", + "name": "decreaseShares", "source_mapping": { - "start": 7848, - "length": 639, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221 - ], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swapExactTempleForStableQuote(address,uint256)" + "signature": "decreaseShares(address,uint256)" } }, { "type": "node", - "name": "(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()", + "name": "claimFor(account)", "source_mapping": { - "start": 7982, - "length": 76, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 2461, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [208], + "lines": [70], "starting_column": 9, - "ending_column": 85 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swapExactTempleForStableQuote", + "name": "decreaseShares", "source_mapping": { - "start": 7848, - "length": 639, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221 - ], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swapExactTempleForStableQuote(address,uint256)" + "signature": "decreaseShares(address,uint256)" } } - } - } - ], - "description": "TempleStableAMMRouter.swapExactTempleForStableQuote(address,uint256) (contracts/amm/TempleStableAMMRouter.sol#207-221) ignores return value by (reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves() (contracts/amm/TempleStableAMMRouter.sol#208)\n", - "markdown": "[TempleStableAMMRouter.swapExactTempleForStableQuote(address,uint256)](contracts/amm/TempleStableAMMRouter.sol#L207-L221) ignores return value by [(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()](contracts/amm/TempleStableAMMRouter.sol#L208)\n", - "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L207-L221", - "id": "43ba957c0d22f3540a298f9bbbe3e7ef022879a661282996ee551c7d780c6394", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "rebalance", - "source_mapping": { - "start": 1808, - "length": 798, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", - "is_dependency": false, - "lines": [ - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OpsManagerLib", - "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", - "is_dependency": false, - "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "rebalance(Vault,TreasuryFarmingRevenue)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "(inWindow) = vault.inEnterExitWindow()", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 1916, - "length": 45, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [59], + "lines": [91], "starting_column": 9, - "ending_column": 54 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalance", + "name": "claimFor", "source_mapping": { - "start": 1808, - "length": 798, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72 - ], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalance(Vault,TreasuryFarmingRevenue)" + "signature": "claimFor(address)" } } - } - } - ], - "description": "OpsManagerLib.rebalance(Vault,TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#55-72) ignores return value by (inWindow) = vault.inEnterExitWindow() (contracts/core/OpsManagerLib.sol#59)\n", - "markdown": "[OpsManagerLib.rebalance(Vault,TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L55-L72) ignores return value by [(inWindow) = vault.inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L59)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L55-L72", - "id": "7e51402c4c3f903960137b695ab80a5a95e96c56eb93a4b7d980470911d0bde6", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "requiresRebalance", - "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OpsManagerLib", - "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", - "is_dependency": false, - "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "(inWindow) = vaults[i].inEnterExitWindow()", + "name": "claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare", "source_mapping": { - "start": 3101, - "length": 49, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 2555, + "length": 68, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [86], - "starting_column": 13, - "ending_column": 62 + "lines": [74], + "starting_column": 9, + "ending_column": 77 }, "type_specific_fields": { "parent": { "type": "function", - "name": "requiresRebalance", + "name": "decreaseShares", "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95 - ], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + "signature": "decreaseShares(address,uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "claimedByScaled" } - } - ], - "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) ignores return value by (inWindow) = vaults[i].inEnterExitWindow() (contracts/core/OpsManagerLib.sol#86)\n", - "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) ignores return value by [(inWindow) = vaults[i].inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L86)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", - "id": "0d939f6443be831bd662e4b85b8b26b8ca9716b8fd984c5961f3bbf84c6a1301", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "relayedSetEndorsementsFor", - "source_mapping": { - "start": 3547, - "length": 759, - "filename_relative": "contracts/governance/ElderElection.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", - "filename_short": "contracts/governance/ElderElection.sol", - "is_dependency": false, - "lines": [ - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ElderElection", - "source_mapping": { - "start": 906, - "length": 4629, - "filename_relative": "contracts/governance/ElderElection.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", - "filename_short": "contracts/governance/ElderElection.sol", - "is_dependency": false, - "lines": [ - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)" - } - }, + }, { "type": "node", - "name": "(signer,err) = ECDSA.tryRecover(digest,signature)", + "name": "shares[account] -= amount", "source_mapping": { - "start": 3799, - "length": 79, - "filename_relative": "contracts/governance/ElderElection.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", - "filename_short": "contracts/governance/ElderElection.sol", + "start": 2489, + "length": 25, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [120], + "lines": [72], "starting_column": 9, - "ending_column": 88 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "relayedSetEndorsementsFor", + "name": "decreaseShares", "source_mapping": { - "start": 3547, - "length": 759, - "filename_relative": "contracts/governance/ElderElection.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", - "filename_short": "contracts/governance/ElderElection.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129 - ], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ElderElection", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 906, - "length": 4629, - "filename_relative": "contracts/governance/ElderElection.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", - "filename_short": "contracts/governance/ElderElection.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)" + "signature": "decreaseShares(address,uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "shares" } } ], - "description": "ElderElection.relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes) (contracts/governance/ElderElection.sol#112-129) ignores return value by (signer,err) = ECDSA.tryRecover(digest,signature) (contracts/governance/ElderElection.sol#120)\n", - "markdown": "[ElderElection.relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)](contracts/governance/ElderElection.sol#L112-L129) ignores return value by [(signer,err) = ECDSA.tryRecover(digest,signature)](contracts/governance/ElderElection.sol#L120)\n", - "first_markdown_element": "contracts/governance/ElderElection.sol#L112-L129", - "id": "9b64f931f815683d4712a17416d4cf6183b989dbcbcf6cf13a099a9bb82f7fbd", - "check": "unused-return", + "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare (contracts/core/TreasuryFarmingRevenue.sol#74)\n\tTreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- shares[account] -= amount (contracts/core/TreasuryFarmingRevenue.sol#72)\n\tTreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- TreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [claimedByScaled[account] -= amount * lifetimeAccRevenueScaledByShare](contracts/core/TreasuryFarmingRevenue.sol#L74)\n\t[TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [shares[account] -= amount](contracts/core/TreasuryFarmingRevenue.sol#L72)\n\t[TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", + "id": "cc45c8f5d22793c2ba894c4d32e4043890c1184c0a94e5502d25b97876a95c86", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -6940,313 +7347,279 @@ "elements": [ { "type": "function", - "name": "depositAndStake", + "name": "deployPayouts", "source_mapping": { - "start": 2874, - "length": 351, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [79, 80, 81, 82, 83, 84, 85], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStake(uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } }, { "type": "node", - "name": "booster.deposit(auraPoolInfo.pId,amount,true)", + "name": "paymentContract.initialize(_token)", "source_mapping": { - "start": 3161, - "length": 47, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 3294, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [83], - "starting_column": 13, - "ending_column": 60 + "lines": [89], + "starting_column": 9, + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositAndStake", + "name": "deployPayouts", "source_mapping": { - "start": 2874, - "length": 351, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [79, 80, 81, 82, 83, 84, 85], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStake(uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } - } - } - ], - "description": "AuraStaking.depositAndStake(uint256) (contracts/amo/AuraStaking.sol#79-85) ignores return value by booster.deposit(auraPoolInfo.pId,amount,true) (contracts/amo/AuraStaking.sol#83)\n", - "markdown": "[AuraStaking.depositAndStake(uint256)](contracts/amo/AuraStaking.sol#L79-L85) ignores return value by [booster.deposit(auraPoolInfo.pId,amount,true)](contracts/amo/AuraStaking.sol#L83)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L79-L85", - "id": "df1bba2db758866958a0bd3d600869193c2a4c54635aeec3c0158683eb3c6bd1", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdrawAndUnwrap", - "source_mapping": { - "start": 3286, - "length": 634, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", - "is_dependency": false, - "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuraStaking", - "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", - "is_dependency": false, - "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "withdrawAndUnwrap(uint256,bool,address)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim)", + "name": "paymentContract.setAllocations(_dests,_allocations)", "source_mapping": { - "start": 3680, - "length": 77, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 3338, + "length": 52, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [93], - "starting_column": 13, - "ending_column": 90 + "lines": [90], + "starting_column": 9, + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawAndUnwrap", + "name": "deployPayouts", "source_mapping": { - "start": 3286, - "length": 634, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "withdrawAndUnwrap(uint256,bool,address)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } - } - } - ], - "description": "AuraStaking.withdrawAndUnwrap(uint256,bool,address) (contracts/amo/AuraStaking.sol#88-100) ignores return value by IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim) (contracts/amo/AuraStaking.sol#93)\n", - "markdown": "[AuraStaking.withdrawAndUnwrap(uint256,bool,address)](contracts/amo/AuraStaking.sol#L88-L100) ignores return value by [IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim)](contracts/amo/AuraStaking.sol#L93)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L88-L100", - "id": "a3f11c21d94cc0286397b0f4acf966b2e7b4421bbb8026550ce5beae49adbf78", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls" } + }, { - "type": "function", - "name": "getReward", + "type": "node", + "name": "paymentContract.transferOwnership(msg.sender)", "source_mapping": { - "start": 4291, - "length": 657, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 3401, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [92], + "starting_column": 9, + "ending_column": 54 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "AuraStaking", + "type": "function", + "name": "deployPayouts", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } - }, - "signature": "getReward(bool)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras)", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", "source_mapping": { - "start": 4356, - "length": 79, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 3493, + "length": 165, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [111], - "starting_column": 9, - "ending_column": 88 + "lines": [95, 96, 97, 98, 99, 100], + "starting_column": 13, + "ending_column": 14 }, "type_specific_fields": { "parent": { "type": "function", - "name": "getReward", + "name": "deployPayouts", "source_mapping": { - "start": 4291, - "length": 657, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 ], "starting_column": 5, "ending_column": 6 @@ -7254,156 +7627,65 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "getReward(bool)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } - } - } - ], - "description": "AuraStaking.getReward(bool) (contracts/amo/AuraStaking.sol#110-125) ignores return value by IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras) (contracts/amo/AuraStaking.sol#111)\n", - "markdown": "[AuraStaking.getReward(bool)](contracts/amo/AuraStaking.sol#L110-L125) ignores return value by [IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras)](contracts/amo/AuraStaking.sol#L111)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L110-L125", - "id": "334cc08346f4acb06b750e6d7ca0bbba6ed0f1443127882a8bce2dba76eedff5", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "setTokenVault", - "source_mapping": { - "start": 7960, - "length": 628, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setTokenVault(address)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "protocolToken.approve(previousVault,0)", + "name": "incrementEpoch(address(paymentContract),_totalFunding)", "source_mapping": { - "start": 8228, - "length": 39, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 3669, + "length": 55, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [195], - "starting_column": 13, - "ending_column": 52 + "lines": [102], + "starting_column": 9, + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTokenVault", + "name": "deployPayouts", "source_mapping": { - "start": 7960, - "length": 628, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 ], "starting_column": 5, "ending_column": 6 @@ -7411,273 +7693,110 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "setTokenVault(address)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } - } - } - ], - "description": "Ramos.setTokenVault(address) (contracts/amo/Ramos.sol#189-207) ignores return value by protocolToken.approve(previousVault,0) (contracts/amo/Ramos.sol#195)\n", - "markdown": "[Ramos.setTokenVault(address)](contracts/amo/Ramos.sol#L189-L207) ignores return value by [protocolToken.approve(previousVault,0)](contracts/amo/Ramos.sol#L195)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L189-L207", - "id": "f3361a65ee76c42e014ac2084189cb808a536ace3a08c0927237056d9aee806c", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "setTokenVault", - "source_mapping": { - "start": 7960, - "length": 628, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setTokenVault(address)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastPaidEpoch" } }, { "type": "node", - "name": "quoteToken.approve(previousVault,0)", + "name": "data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})", "source_mapping": { - "start": 8281, - "length": 36, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1562, + "length": 182, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [196], - "starting_column": 13, - "ending_column": 49 + "lines": [50, 51, 52, 53, 54], + "starting_column": 9, + "ending_column": 11 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTokenVault", + "name": "incrementEpoch", "source_mapping": { - "start": 7960, - "length": 628, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1448, + "length": 347, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207 - ], + "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "setTokenVault(address)" + "signature": "incrementEpoch(address,uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastPaidEpoch" } } ], - "description": "Ramos.setTokenVault(address) (contracts/amo/Ramos.sol#189-207) ignores return value by quoteToken.approve(previousVault,0) (contracts/amo/Ramos.sol#196)\n", - "markdown": "[Ramos.setTokenVault(address)](contracts/amo/Ramos.sol#L189-L207) ignores return value by [quoteToken.approve(previousVault,0)](contracts/amo/Ramos.sol#L196)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L189-L207", - "id": "aface72eecf0b7ba93b6bf44cc1f3e5761d97abf8c0de3daa4bfebcc0d8b3ccf", - "check": "unused-return", + "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#102)\n\t\t- data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++}) (contracts/admin/TempleTeamPaymentsFactory.sol#50-54)\n\tTempleTeamPaymentsFactory.lastPaidEpoch (contracts/admin/TempleTeamPaymentsFactory.sol#23) can be used in cross function reentrancies:\n\t- TempleTeamPaymentsFactory.constructor(address,uint16) (contracts/admin/TempleTeamPaymentsFactory.sol#40-44)\n\t- TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112)\n\t- TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143)\n\t- TempleTeamPaymentsFactory.incrementEpoch(address,uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#46-56)\n\t- TempleTeamPaymentsFactory.lastPaidEpoch (contracts/admin/TempleTeamPaymentsFactory.sol#23)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L102)\n\t\t- [data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})](contracts/admin/TempleTeamPaymentsFactory.sol#L50-L54)\n\t[TempleTeamPaymentsFactory.lastPaidEpoch](contracts/admin/TempleTeamPaymentsFactory.sol#L23) can be used in cross function reentrancies:\n\t- [TempleTeamPaymentsFactory.constructor(address,uint16)](contracts/admin/TempleTeamPaymentsFactory.sol#L40-L44)\n\t- [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112)\n\t- [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143)\n\t- [TempleTeamPaymentsFactory.incrementEpoch(address,uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L46-L56)\n\t- [TempleTeamPaymentsFactory.lastPaidEpoch](contracts/admin/TempleTeamPaymentsFactory.sol#L23)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", + "id": "1239a22bea2c9a42dbde3ae4ac80f8aa9a378a084fd732a81c3169ae01c87319", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -7685,19 +7804,16 @@ "elements": [ { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -7705,19 +7821,20 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, @@ -7752,50 +7869,42 @@ 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } }, { "type": "node", - "name": "quoteToken.approve(address(balancerVault),0)", + "name": "_distributeGold()", "source_mapping": { - "start": 21130, - "length": 45, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7794, + "length": 17, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [489], - "starting_column": 17, - "ending_column": 62 + "lines": [178], + "starting_column": 9, + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -7803,343 +7912,191 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } } - } - } - ], - "description": "Ramos.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/amo/Ramos.sol#462-511) ignores return value by quoteToken.approve(address(balancerVault),0) (contracts/amo/Ramos.sol#489)\n", - "markdown": "[Ramos.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/amo/Ramos.sol#L462-L511) ignores return value by [quoteToken.approve(address(balancerVault),0)](contracts/amo/Ramos.sol#L489)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L462-L511", - "id": "1acb56caae7ee9b6838e5f5408e687213e838f292c79c37223b9cb790b0a5f6c", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "getBalances", - "source_mapping": { - "start": 2079, - "length": 154, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", - "is_dependency": false, - "lines": [55, 56, 57], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "BalancerPoolHelper", - "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "getBalances()" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "(None,balances,None) = balancerVault.getPoolTokens(balancerPoolId)", + "name": "ITempleGold(address(rewardToken)).mint()", "source_mapping": { - "start": 2167, - "length": 59, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 18706, + "length": 40, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [56], - "starting_column": 7, - "ending_column": 66 + "lines": [477], + "starting_column": 9, + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "getBalances", + "name": "_distributeGold", "source_mapping": { - "start": 2079, - "length": 154, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 18600, + "length": 153, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [55, 56, 57], + "lines": [475, 476, 477, 478], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "BalancerPoolHelper", + "name": "TempleGoldStaking", "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "getBalances()" + "signature": "_distributeGold()" } } - } - } - ], - "description": "BalancerPoolHelper.getBalances() (contracts/amo/helpers/BalancerPoolHelper.sol#55-57) ignores return value by (None,balances,None) = balancerVault.getPoolTokens(balancerPoolId) (contracts/amo/helpers/BalancerPoolHelper.sol#56)\n", - "markdown": "[BalancerPoolHelper.getBalances()](contracts/amo/helpers/BalancerPoolHelper.sol#L55-L57) ignores return value by [(None,balances,None) = balancerVault.getPoolTokens(balancerPoolId)](contracts/amo/helpers/BalancerPoolHelper.sol#L56)\n", - "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L55-L57", - "id": "97630a6a935fd6fa31a1e214fdb8582cf37cbb5ba228037742cc7ccc77486019", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "proportionalAddLiquidityQuote", - "source_mapping": { - "start": 15567, - "length": 1930, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", - "is_dependency": false, - "lines": [ - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "BalancerPoolHelper", - "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "proportionalAddLiquidityQuote(uint256,uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "(expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData)", + "name": "_notifyReward(rewardAmount)", "source_mapping": { - "start": 17103, - "length": 88, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 8084, + "length": 27, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [374], + "lines": [183], "starting_column": 9, - "ending_column": 97 + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "function", - "name": "proportionalAddLiquidityQuote", + "name": "distributeRewards", "source_mapping": { - "start": 15567, - "length": 1930, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -8147,168 +8104,200 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "BalancerPoolHelper", + "name": "TempleGoldStaking", "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "proportionalAddLiquidityQuote(uint256,uint256)" + "signature": "distributeRewards()" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastRewardNotificationTimestamp" } - } - ], - "description": "BalancerPoolHelper.proportionalAddLiquidityQuote(uint256,uint256) (contracts/amo/helpers/BalancerPoolHelper.sol#348-380) ignores return value by (expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData) (contracts/amo/helpers/BalancerPoolHelper.sol#374)\n", - "markdown": "[BalancerPoolHelper.proportionalAddLiquidityQuote(uint256,uint256)](contracts/amo/helpers/BalancerPoolHelper.sol#L348-L380) ignores return value by [(expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData)](contracts/amo/helpers/BalancerPoolHelper.sol#L374)\n", - "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L348-L380", - "id": "44982b3b03e18740f01aed72e03f5657be31a18422cec5c4f5a8d53b084f8256", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, { - "type": "function", - "name": "proportionalRemoveLiquidityQuote", + "type": "node", + "name": "lastRewardNotificationTimestamp = uint32(block.timestamp)", "source_mapping": { - "start": 17648, - "length": 1775, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 18310, + "length": 57, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [465], + "starting_column": 9, + "ending_column": 66 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "BalancerPoolHelper", + "type": "function", + "name": "_notifyReward", "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_notifyReward(uint256)" } - }, - "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastRewardNotificationTimestamp" } }, { "type": "node", - "name": "(None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData)", + "name": "_notifyReward(rewardAmount)", "source_mapping": { - "start": 18569, - "length": 96, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 8084, + "length": 27, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [405], + "lines": [183], "starting_column": 9, - "ending_column": 105 + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "function", - "name": "proportionalRemoveLiquidityQuote", + "name": "distributeRewards", "source_mapping": { - "start": 17648, - "length": 1775, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -8316,173 +8305,223 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "BalancerPoolHelper", + "name": "TempleGoldStaking", "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" + "signature": "distributeRewards()" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } - } - ], - "description": "BalancerPoolHelper.proportionalRemoveLiquidityQuote(uint256,uint256) (contracts/amo/helpers/BalancerPoolHelper.sol#384-416) ignores return value by (None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData) (contracts/amo/helpers/BalancerPoolHelper.sol#405)\n", - "markdown": "[BalancerPoolHelper.proportionalRemoveLiquidityQuote(uint256,uint256)](contracts/amo/helpers/BalancerPoolHelper.sol#L384-L416) ignores return value by [(None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData)](contracts/amo/helpers/BalancerPoolHelper.sol#L405)\n", - "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L384-L416", - "id": "08b9be6d43268a91c87113facf1f93ba28159d15047c9ef6e2a5e42a2a791c97", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, { - "type": "function", - "name": "removeOtcMarket", + "type": "node", + "name": "rewardData.rewardRate = uint216(amount / rewardDurationCache)", "source_mapping": { - "start": 4307, - "length": 464, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 17541, + "length": 61, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [81, 82, 83, 84, 85, 86, 87, 88, 89], - "starting_column": 5, - "ending_column": 6 + "lines": [452], + "starting_column": 13, + "ending_column": 74 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "MultiOtcOffer", + "type": "function", + "name": "_notifyReward", "source_mapping": { - "start": 1160, - "length": 13535, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_notifyReward(uint256)" } - }, - "signature": "removeOtcMarket(address,address)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } }, { "type": "node", - "name": "_otcMarketIds.remove(_marketId)", + "name": "rewardData.rewardRate = uint216((amount + leftover) / rewardDurationCache)", "source_mapping": { - "start": 4576, - "length": 31, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 17898, + "length": 74, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [84], - "starting_column": 9, - "ending_column": 40 + "lines": [458], + "starting_column": 13, + "ending_column": 87 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeOtcMarket", + "name": "_notifyReward", "source_mapping": { - "start": 4307, - "length": 464, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [81, 82, 83, 84, 85, 86, 87, 88, 89], + "lines": [ + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "MultiOtcOffer", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1160, - "length": 13535, - "filename_relative": "contracts/core/MultiOtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", - "filename_short": "contracts/core/MultiOtcOffer.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, @@ -8499,149 +8538,170 @@ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309 + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "removeOtcMarket(address,address)" + "signature": "_notifyReward(uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } - } - ], - "description": "MultiOtcOffer.removeOtcMarket(address,address) (contracts/core/MultiOtcOffer.sol#81-89) ignores return value by _otcMarketIds.remove(_marketId) (contracts/core/MultiOtcOffer.sol#84)\n", - "markdown": "[MultiOtcOffer.removeOtcMarket(address,address)](contracts/core/MultiOtcOffer.sol#L81-L89) ignores return value by [_otcMarketIds.remove(_marketId)](contracts/core/MultiOtcOffer.sol#L84)\n", - "first_markdown_element": "contracts/core/MultiOtcOffer.sol#L81-L89", - "id": "79c4d4701a934e7e79200185323bb45688ce5b0c8b33dda709234bad490f1472", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, { - "type": "function", - "name": "setBorrowToken", + "type": "node", + "name": "rewardData.lastUpdateTime = uint40(block.timestamp)", "source_mapping": { - "start": 4145, - "length": 1025, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 18120, + "length": 51, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [462], + "starting_column": 9, + "ending_column": 60 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TreasuryReservesVault", + "type": "function", + "name": "_notifyReward", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_notifyReward(uint256)" } - }, - "signature": "setBorrowToken(IERC20,address,uint256,uint256,address)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } }, { "type": "node", - "name": "_borrowTokenSet.add(address(token))", + "name": "rewardData.periodFinish = uint40(block.timestamp + rewardDurationCache)", "source_mapping": { - "start": 5128, - "length": 35, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 18181, + "length": 71, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [126], + "lines": [463], "starting_column": 9, - "ending_column": 44 + "ending_column": 80 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setBorrowToken", + "name": "_notifyReward", "source_mapping": { - "start": 4145, - "length": 1025, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], "starting_column": 5, "ending_column": 6 @@ -8649,92 +8709,78 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TempleGoldStaking", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setBorrowToken(IERC20,address,uint256,uint256,address)" + "signature": "_notifyReward(uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } } ], - "description": "TreasuryReservesVault.setBorrowToken(IERC20,address,uint256,uint256,address) (contracts/v2/TreasuryReservesVault.sol#108-127) ignores return value by _borrowTokenSet.add(address(token)) (contracts/v2/TreasuryReservesVault.sol#126)\n", - "markdown": "[TreasuryReservesVault.setBorrowToken(IERC20,address,uint256,uint256,address)](contracts/v2/TreasuryReservesVault.sol#L108-L127) ignores return value by [_borrowTokenSet.add(address(token))](contracts/v2/TreasuryReservesVault.sol#L126)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L108-L127", - "id": "5cf78f34e420dc046a400c32810667b772002358e964fa3e56b9b0a68b28a33f", - "check": "unused-return", + "description": "Reentrancy in TempleGoldStaking.distributeRewards() (contracts/templegold/TempleGoldStaking.sol#172-184):\n\tExternal calls:\n\t- _distributeGold() (contracts/templegold/TempleGoldStaking.sol#178)\n\t\t- ITempleGold(address(rewardToken)).mint() (contracts/templegold/TempleGoldStaking.sol#477)\n\tState variables written after the call(s):\n\t- _notifyReward(rewardAmount) (contracts/templegold/TempleGoldStaking.sol#183)\n\t\t- lastRewardNotificationTimestamp = uint32(block.timestamp) (contracts/templegold/TempleGoldStaking.sol#465)\n\tTempleGoldStaking.lastRewardNotificationTimestamp (contracts/templegold/TempleGoldStaking.sol#46) can be used in cross function reentrancies:\n\t- TempleGoldStaking._notifyReward(uint256) (contracts/templegold/TempleGoldStaking.sol#449-466)\n\t- TempleGoldStaking.distributeRewards() (contracts/templegold/TempleGoldStaking.sol#172-184)\n\t- TempleGoldStaking.lastRewardNotificationTimestamp (contracts/templegold/TempleGoldStaking.sol#46)\n\t- _notifyReward(rewardAmount) (contracts/templegold/TempleGoldStaking.sol#183)\n\t\t- rewardData.rewardRate = uint216(amount / rewardDurationCache) (contracts/templegold/TempleGoldStaking.sol#452)\n\t\t- rewardData.rewardRate = uint216((amount + leftover) / rewardDurationCache) (contracts/templegold/TempleGoldStaking.sol#458)\n\t\t- rewardData.lastUpdateTime = uint40(block.timestamp) (contracts/templegold/TempleGoldStaking.sol#462)\n\t\t- rewardData.periodFinish = uint40(block.timestamp + rewardDurationCache) (contracts/templegold/TempleGoldStaking.sol#463)\n\tTempleGoldStaking.rewardData (contracts/templegold/TempleGoldStaking.sol#55) can be used in cross function reentrancies:\n\t- TempleGoldStaking._notifyReward(uint256) (contracts/templegold/TempleGoldStaking.sol#449-466)\n\t- TempleGoldStaking._rewardPerToken() (contracts/templegold/TempleGoldStaking.sol#436-447)\n\t- TempleGoldStaking.getRewardData() (contracts/templegold/TempleGoldStaking.sol#381-383)\n\t- TempleGoldStaking.rewardPeriodFinish() (contracts/templegold/TempleGoldStaking.sol#322-324)\n\t- TempleGoldStaking.setRewardDuration(uint256) (contracts/templegold/TempleGoldStaking.sol#95-102)\n\t- TempleGoldStaking.updateReward(address) (contracts/templegold/TempleGoldStaking.sol#526-536)\n", + "markdown": "Reentrancy in [TempleGoldStaking.distributeRewards()](contracts/templegold/TempleGoldStaking.sol#L172-L184):\n\tExternal calls:\n\t- [_distributeGold()](contracts/templegold/TempleGoldStaking.sol#L178)\n\t\t- [ITempleGold(address(rewardToken)).mint()](contracts/templegold/TempleGoldStaking.sol#L477)\n\tState variables written after the call(s):\n\t- [_notifyReward(rewardAmount)](contracts/templegold/TempleGoldStaking.sol#L183)\n\t\t- [lastRewardNotificationTimestamp = uint32(block.timestamp)](contracts/templegold/TempleGoldStaking.sol#L465)\n\t[TempleGoldStaking.lastRewardNotificationTimestamp](contracts/templegold/TempleGoldStaking.sol#L46) can be used in cross function reentrancies:\n\t- [TempleGoldStaking._notifyReward(uint256)](contracts/templegold/TempleGoldStaking.sol#L449-L466)\n\t- [TempleGoldStaking.distributeRewards()](contracts/templegold/TempleGoldStaking.sol#L172-L184)\n\t- [TempleGoldStaking.lastRewardNotificationTimestamp](contracts/templegold/TempleGoldStaking.sol#L46)\n\t- [_notifyReward(rewardAmount)](contracts/templegold/TempleGoldStaking.sol#L183)\n\t\t- [rewardData.rewardRate = uint216(amount / rewardDurationCache)](contracts/templegold/TempleGoldStaking.sol#L452)\n\t\t- [rewardData.rewardRate = uint216((amount + leftover) / rewardDurationCache)](contracts/templegold/TempleGoldStaking.sol#L458)\n\t\t- [rewardData.lastUpdateTime = uint40(block.timestamp)](contracts/templegold/TempleGoldStaking.sol#L462)\n\t\t- [rewardData.periodFinish = uint40(block.timestamp + rewardDurationCache)](contracts/templegold/TempleGoldStaking.sol#L463)\n\t[TempleGoldStaking.rewardData](contracts/templegold/TempleGoldStaking.sol#L55) can be used in cross function reentrancies:\n\t- [TempleGoldStaking._notifyReward(uint256)](contracts/templegold/TempleGoldStaking.sol#L449-L466)\n\t- [TempleGoldStaking._rewardPerToken()](contracts/templegold/TempleGoldStaking.sol#L436-L447)\n\t- [TempleGoldStaking.getRewardData()](contracts/templegold/TempleGoldStaking.sol#L381-L383)\n\t- [TempleGoldStaking.rewardPeriodFinish()](contracts/templegold/TempleGoldStaking.sol#L322-L324)\n\t- [TempleGoldStaking.setRewardDuration(uint256)](contracts/templegold/TempleGoldStaking.sol#L95-L102)\n\t- [TempleGoldStaking.updateReward(address)](contracts/templegold/TempleGoldStaking.sol#L526-L536)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L172-L184", + "id": "519d693a69b28688e489033e342b313bf7598529c432ad08ffa4e48217e5b1e5", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -8742,517 +8788,260 @@ "elements": [ { "type": "function", - "name": "removeBorrowToken", + "name": "increaseShares", "source_mapping": { - "start": 5247, - "length": 319, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [132, 133, 134, 135, 136, 137, 138, 139], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "removeBorrowToken(IERC20)" + "signature": "increaseShares(address,uint256)" } }, { "type": "node", - "name": "_borrowTokenSet.remove(address(token))", + "name": "claimFor(account)", "source_mapping": { - "start": 5521, - "length": 38, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 2093, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [138], + "lines": [57], "starting_column": 9, - "ending_column": 47 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeBorrowToken", + "name": "increaseShares", "source_mapping": { - "start": 5247, - "length": 319, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [132, 133, 134, 135, 136, 137, 138, 139], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "removeBorrowToken(IERC20)" + "signature": "increaseShares(address,uint256)" } } - } - } - ], - "description": "TreasuryReservesVault.removeBorrowToken(IERC20) (contracts/v2/TreasuryReservesVault.sol#132-139) ignores return value by _borrowTokenSet.remove(address(token)) (contracts/v2/TreasuryReservesVault.sol#138)\n", - "markdown": "[TreasuryReservesVault.removeBorrowToken(IERC20)](contracts/v2/TreasuryReservesVault.sol#L132-L139) ignores return value by [_borrowTokenSet.remove(address(token))](contracts/v2/TreasuryReservesVault.sol#L138)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L132-L139", - "id": "5474dfbc0dfd2144f1d3592aebc4e72de5fca48cbeb8ec28a4e82aa1c1ea096c", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "shutdown", - "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "shutdown(address)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "_strategySet.remove(strategy)", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 13418, - "length": 29, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [318], + "lines": [91], "starting_column": 9, - "ending_column": 38 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "shutdown", + "name": "claimFor", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "shutdown(address)" + "signature": "claimFor(address)" } } - } - } - ], - "description": "TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319) ignores return value by _strategySet.remove(strategy) (contracts/v2/TreasuryReservesVault.sol#318)\n", - "markdown": "[TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319) ignores return value by [_strategySet.remove(strategy)](contracts/v2/TreasuryReservesVault.sol#L318)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", - "id": "14b0ae4775bb656e93254a9232479092aea49d94c14762546af7a2b568164211", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "setIdentifierForCaller", + "type": "node", + "name": "claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare", "source_mapping": { - "start": 1967, - "length": 555, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "start": 2187, + "length": 68, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], - "starting_column": 5, - "ending_column": 6 + "lines": [61], + "starting_column": 9, + "ending_column": 77 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TempleCircuitBreakerProxy", + "type": "function", + "name": "increaseShares", "source_mapping": { - "start": 808, - "length": 3156, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "increaseShares(address,uint256)" } - }, - "signature": "setIdentifierForCaller(address,string)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "claimedByScaled" } }, { "type": "node", - "name": "_identifiers.add(_identifier)", + "name": "shares[account] += amount", "source_mapping": { - "start": 2409, - "length": 29, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "start": 2121, + "length": 25, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [56], + "lines": [59], "starting_column": 9, - "ending_column": 38 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setIdentifierForCaller", + "name": "increaseShares", "source_mapping": { - "start": 1967, - "length": 555, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerProxy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 808, - "length": 3156, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, @@ -9266,17 +9055,21 @@ "ending_column": 0 } }, - "signature": "setIdentifierForCaller(address,string)" + "signature": "increaseShares(address,uint256)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "shares" } } ], - "description": "TempleCircuitBreakerProxy.setIdentifierForCaller(address,string) (contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#47-59) ignores return value by _identifiers.add(_identifier) (contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#56)\n", - "markdown": "[TempleCircuitBreakerProxy.setIdentifierForCaller(address,string)](contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L47-L59) ignores return value by [_identifiers.add(_identifier)](contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L56)\n", - "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L47-L59", - "id": "e72127f3ec266630bd01282f5d373e9eadb2fa635a529f17decfa267707680e0", - "check": "unused-return", + "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare (contracts/core/TreasuryFarmingRevenue.sol#61)\n\tTreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.claimedByScaled (contracts/core/TreasuryFarmingRevenue.sol#30)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- shares[account] += amount (contracts/core/TreasuryFarmingRevenue.sol#59)\n\tTreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24) can be used in cross function reentrancies:\n\t- TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93)\n\t- TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77)\n\t- TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64)\n\t- TreasuryFarmingRevenue.shares (contracts/core/TreasuryFarmingRevenue.sol#24)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [claimedByScaled[account] += amount * lifetimeAccRevenueScaledByShare](contracts/core/TreasuryFarmingRevenue.sol#L61)\n\t[TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.claimedByScaled](contracts/core/TreasuryFarmingRevenue.sol#L30)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [shares[account] += amount](contracts/core/TreasuryFarmingRevenue.sol#L59)\n\t[TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24) can be used in cross function reentrancies:\n\t- [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93)\n\t- [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77)\n\t- [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64)\n\t- [TreasuryFarmingRevenue.shares](contracts/core/TreasuryFarmingRevenue.sol#L24)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", + "id": "7136d46cea8f0cb4f10b428d075c61a8ad801ba9ca1ef8c90733aaa52034f6ed", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -9284,409 +9077,404 @@ "elements": [ { "type": "function", - "name": "latestAssetBalances", + "name": "setVestingFactor", "source_mapping": { - "start": 5827, - "length": 565, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [ - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159 - ], + "lines": [131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleGold", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 - ], - "starting_column": 1, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, "ending_column": 0 } }, - "signature": "latestAssetBalances()" + "signature": "setVestingFactor(ITempleGold.VestingFactor)" } }, { "type": "node", - "name": "(templeTokenBalance,quoteTokenBalance) = ramos.positions()", + "name": "mint()", "source_mapping": { - "start": 5992, - "length": 77, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6565, + "length": 6, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [148], - "starting_column": 9, - "ending_column": 86 + "lines": [135], + "starting_column": 16, + "ending_column": 22 }, "type_specific_fields": { "parent": { "type": "function", - "name": "latestAssetBalances", + "name": "setVestingFactor", "source_mapping": { - "start": 5827, - "length": 565, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [ - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159 - ], + "lines": [131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleGold", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "latestAssetBalances()" + "signature": "setVestingFactor(ITempleGold.VestingFactor)" } } - } - } - ], - "description": "RamosStrategy.latestAssetBalances() (contracts/v2/strategies/RamosStrategy.sol#144-159) ignores return value by (templeTokenBalance,quoteTokenBalance) = ramos.positions() (contracts/v2/strategies/RamosStrategy.sol#148)\n", - "markdown": "[RamosStrategy.latestAssetBalances()](contracts/v2/strategies/RamosStrategy.sol#L144-L159) ignores return value by [(templeTokenBalance,quoteTokenBalance) = ramos.positions()](contracts/v2/strategies/RamosStrategy.sol#L148)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L144-L159", - "id": "420dcd2cbb24da1b9ab2dafe842594bf844fae670bc85fc21d1d3835c68dd336", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "proportionalAddLiquidityQuote", - "source_mapping": { - "start": 6569, - "length": 393, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", - "is_dependency": false, - "lines": [165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "RamosStrategy", - "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", - "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "proportionalAddLiquidityQuote(uint256,uint256)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps)", + "name": "staking.notifyDistribution(stakingAmount)", "source_mapping": { - "start": 6867, - "length": 88, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 10748, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [174], - "starting_column": 9, - "ending_column": 97 + "lines": [240], + "starting_column": 13, + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "proportionalAddLiquidityQuote", + "name": "_distribute", "source_mapping": { - "start": 6569, - "length": 393, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175], + "lines": [ + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleGold", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "proportionalAddLiquidityQuote(uint256,uint256)" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } - } - } - ], - "description": "RamosStrategy.proportionalAddLiquidityQuote(uint256,uint256) (contracts/v2/strategies/RamosStrategy.sol#165-175) ignores return value by ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps) (contracts/v2/strategies/RamosStrategy.sol#174)\n", - "markdown": "[RamosStrategy.proportionalAddLiquidityQuote(uint256,uint256)](contracts/v2/strategies/RamosStrategy.sol#L165-L175) ignores return value by [ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps)](contracts/v2/strategies/RamosStrategy.sol#L174)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L165-L175", - "id": "b56d2f4548e025710d998bc242ac7f3032f0e8ea504c62f800fead5160f65786", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "proportionalRemoveLiquidityQuote", + "type": "node", + "name": "auction.notifyDistribution(auctionAmount)", "source_mapping": { - "start": 7587, - "length": 438, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 11012, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203], - "starting_column": 5, - "ending_column": 6 + "lines": [246], + "starting_column": 13, + "ending_column": 54 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "RamosStrategy", + "type": "function", + "name": "_distribute", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } - }, - "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps)", + "name": "vestingFactor = _factor", "source_mapping": { - "start": 7934, - "length": 84, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6583, + "length": 23, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [202], + "lines": [136], "starting_column": 9, - "ending_column": 93 + "ending_column": 32 }, "type_specific_fields": { "parent": { "type": "function", - "name": "proportionalRemoveLiquidityQuote", + "name": "setVestingFactor", "source_mapping": { - "start": 7587, - "length": 438, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [ - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203 - ], + "lines": [131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleGold", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" + "signature": "setVestingFactor(ITempleGold.VestingFactor)" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "vestingFactor" } } ], - "description": "RamosStrategy.proportionalRemoveLiquidityQuote(uint256,uint256) (contracts/v2/strategies/RamosStrategy.sol#192-203) ignores return value by ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps) (contracts/v2/strategies/RamosStrategy.sol#202)\n", - "markdown": "[RamosStrategy.proportionalRemoveLiquidityQuote(uint256,uint256)](contracts/v2/strategies/RamosStrategy.sol#L192-L203) ignores return value by [ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps)](contracts/v2/strategies/RamosStrategy.sol#L202)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L192-L203", - "id": "ed71e6585e1914cd70e3ed747dea0a932bd4ba9629191c626628ce16c695c11d", - "check": "unused-return", + "description": "Reentrancy in TempleGold.setVestingFactor(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#131-138):\n\tExternal calls:\n\t- mint() (contracts/templegold/TempleGold.sol#135)\n\t\t- staking.notifyDistribution(stakingAmount) (contracts/templegold/TempleGold.sol#240)\n\t\t- auction.notifyDistribution(auctionAmount) (contracts/templegold/TempleGold.sol#246)\n\tState variables written after the call(s):\n\t- vestingFactor = _factor (contracts/templegold/TempleGold.sol#136)\n\tTempleGold.vestingFactor (contracts/templegold/TempleGold.sol#67) can be used in cross function reentrancies:\n\t- TempleGold.canDistribute() (contracts/templegold/TempleGold.sol#179-182)\n\t- TempleGold.getMintAmount() (contracts/templegold/TempleGold.sol#215-218)\n\t- TempleGold.getVestingFactor() (contracts/templegold/TempleGold.sol#163-165)\n\t- TempleGold.mint() (contracts/templegold/TempleGold.sol#145-157)\n\t- TempleGold.setVestingFactor(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#131-138)\n", + "markdown": "Reentrancy in [TempleGold.setVestingFactor(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L131-L138):\n\tExternal calls:\n\t- [mint()](contracts/templegold/TempleGold.sol#L135)\n\t\t- [staking.notifyDistribution(stakingAmount)](contracts/templegold/TempleGold.sol#L240)\n\t\t- [auction.notifyDistribution(auctionAmount)](contracts/templegold/TempleGold.sol#L246)\n\tState variables written after the call(s):\n\t- [vestingFactor = _factor](contracts/templegold/TempleGold.sol#L136)\n\t[TempleGold.vestingFactor](contracts/templegold/TempleGold.sol#L67) can be used in cross function reentrancies:\n\t- [TempleGold.canDistribute()](contracts/templegold/TempleGold.sol#L179-L182)\n\t- [TempleGold.getMintAmount()](contracts/templegold/TempleGold.sol#L215-L218)\n\t- [TempleGold.getVestingFactor()](contracts/templegold/TempleGold.sol#L163-L165)\n\t- [TempleGold.mint()](contracts/templegold/TempleGold.sol#L145-L157)\n\t- [TempleGold.setVestingFactor(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L131-L138)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L131-L138", + "id": "96fd3896d02241b24c9bfa6684d2c540a28d5ef2d503c65e2fb05ee61bd4d463", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, @@ -9694,83 +9482,93 @@ "elements": [ { "type": "function", - "name": "populateShutdownData", + "name": "startAuction", "source_mapping": { - "start": 9022, - "length": 564, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "populateShutdownData(bytes)" + "signature": "startAuction()" } }, { "type": "node", - "name": "(shutdownParams.bptAmount,None,None) = ramos.positions()", + "name": "_distributeGold()", "source_mapping": { - "start": 9349, - "length": 48, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 5535, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [240], + "lines": [119], "starting_column": 9, - "ending_column": 57 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "populateShutdownData", + "name": "startAuction", "source_mapping": { - "start": 9022, - "length": 564, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243 + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 ], "starting_column": 5, "ending_column": 6 @@ -9778,138 +9576,158 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "populateShutdownData(bytes)" + "signature": "startAuction()" } } - } - } - ], - "description": "RamosStrategy.populateShutdownData(bytes) (contracts/v2/strategies/RamosStrategy.sol#232-243) ignores return value by (shutdownParams.bptAmount,None,None) = ramos.positions() (contracts/v2/strategies/RamosStrategy.sol#240)\n", - "markdown": "[RamosStrategy.populateShutdownData(bytes)](contracts/v2/strategies/RamosStrategy.sol#L232-L243) ignores return value by [(shutdownParams.bptAmount,None,None) = ramos.positions()](contracts/v2/strategies/RamosStrategy.sol#L240)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L232-L243", - "id": "e68b668794a623b6a5a283b3672d9ddf56508b69062c77c9f4af7f0faf1aa51e", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, + "additional_fields": { "underlying_type": "external_calls" } + }, { - "type": "function", - "name": "_doShutdown", + "type": "node", + "name": "templeGold.mint()", "source_mapping": { - "start": 9818, - "length": 631, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 14719, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [335], + "starting_column": 9, + "ending_column": 26 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "RamosStrategy", + "type": "function", + "name": "_distributeGold", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 14614, + "length": 129, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 - ], - "starting_column": 1, - "ending_column": 0 + "lines": [333, 334, 335, 336], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_distributeGold()" } - }, - "signature": "_doShutdown(bytes)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "ramos.removeLiquidity(params.requestData,params.bptAmount)", + "name": "epochId = _currentEpochId = currentEpochCache + 1", "source_mapping": { - "start": 9989, - "length": 59, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 5654, + "length": 57, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [252], + "lines": [122], "starting_column": 9, - "ending_column": 68 + "ending_column": 66 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_doShutdown", + "name": "startAuction", "source_mapping": { - "start": 9818, - "length": 631, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263 + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 ], "starting_column": 5, "ending_column": 6 @@ -9917,440 +9735,430 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_doShutdown(bytes)" + "signature": "startAuction()" } } - } - } - ], - "description": "RamosStrategy._doShutdown(bytes) (contracts/v2/strategies/RamosStrategy.sol#250-263) ignores return value by ramos.removeLiquidity(params.requestData,params.bptAmount) (contracts/v2/strategies/RamosStrategy.sol#252)\n", - "markdown": "[RamosStrategy._doShutdown(bytes)](contracts/v2/strategies/RamosStrategy.sol#L250-L263) ignores return value by [ramos.removeLiquidity(params.requestData,params.bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L252)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L250-L263", - "id": "cab4a6d607fc52a73a76b47684750061e88667af7fd3a9cc5e85e235479031b6", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_daiDeposit", - "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], - "starting_column": 5, - "ending_column": 6 }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "SkyFarmBaseStrategy", - "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_daiDeposit(uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_currentEpochId" } }, { "type": "node", - "name": "usdsVaultToken.deposit(daiAmount,address(this))", + "name": "info.totalAuctionTokenAmount = totalGoldAmount", "source_mapping": { - "start": 7561, - "length": 48, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 5897, + "length": 46, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [179], + "lines": [127], "starting_column": 9, - "ending_column": 57 + "ending_column": 55 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "startAuction", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "startAuction()" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochs" } - } - ], - "description": "SkyFarmBaseStrategy._daiDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#174-181) ignores return value by usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n", - "markdown": "[SkyFarmBaseStrategy._daiDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181) ignores return value by [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181", - "id": "ea9126415afb92b6102d0261a6660453a9520881293e71bebe5637779b0ae002", - "check": "unused-return", - "impact": "Medium", - "confidence": "Medium" - }, - { - "elements": [ + }, { - "type": "function", - "name": "_daiWithdrawal", + "type": "node", + "name": "startTime = info.startTime = uint128(block.timestamp) + config.auctionStartCooldown", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 5953, + "length": 91, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], - "starting_column": 5, - "ending_column": 6 + "lines": [128], + "starting_column": 9, + "ending_column": 100 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "SkyFarmBaseStrategy", + "type": "function", + "name": "startAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" } - }, - "signature": "_daiWithdrawal(uint256)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochs" } }, { "type": "node", - "name": "usdsVaultToken.withdraw(daiAmount,address(this),address(this))", + "name": "endTime = info.endTime = startTime + AUCTION_DURATION", "source_mapping": { - "start": 7770, - "length": 64, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6054, + "length": 61, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [185], + "lines": [129], "starting_column": 9, - "ending_column": 73 + "ending_column": 70 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiWithdrawal", + "name": "startAuction", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiWithdrawal(uint256)" + "signature": "startAuction()" } } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochs" } } ], - "description": "SkyFarmBaseStrategy._daiWithdrawal(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#183-190) ignores return value by usdsVaultToken.withdraw(daiAmount,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#185)\n", - "markdown": "[SkyFarmBaseStrategy._daiWithdrawal(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190) ignores return value by [usdsVaultToken.withdraw(daiAmount,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L185)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190", - "id": "2de15280b0ab705cd46bf60f4b904143d6ecd4c5990bda6a4c2118aeceaec88e", - "check": "unused-return", + "description": "Reentrancy in StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132):\n\tExternal calls:\n\t- _distributeGold() (contracts/templegold/StableGoldAuction.sol#119)\n\t\t- templeGold.mint() (contracts/templegold/StableGoldAuction.sol#335)\n\tState variables written after the call(s):\n\t- epochId = _currentEpochId = currentEpochCache + 1 (contracts/templegold/StableGoldAuction.sol#122)\n\tAuctionBase._currentEpochId (contracts/templegold/AuctionBase.sol#13) can be used in cross function reentrancies:\n\t- StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149)\n\t- StableGoldAuction.canDeposit() (contracts/templegold/StableGoldAuction.sol#222-224)\n\t- StableGoldAuction.currentEpoch() (contracts/templegold/StableGoldAuction.sol#198-200)\n\t- StableGoldAuction.getClaimableAtCurrentEpoch(address) (contracts/templegold/StableGoldAuction.sol#240-242)\n\t- StableGoldAuction.getClaimableAtEpoch(address,uint256) (contracts/templegold/StableGoldAuction.sol#251-257)\n\t- StableGoldAuction.isCurrentEpochEnded() (contracts/templegold/StableGoldAuction.sol#214-216)\n\t- StableGoldAuction.nextEpoch() (contracts/templegold/StableGoldAuction.sol#206-208)\n\t- StableGoldAuction.onlyWhenLive() (contracts/templegold/StableGoldAuction.sol#338-341)\n\t- StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address) (contracts/templegold/StableGoldAuction.sol#309-324)\n\t- StableGoldAuction.recoverToken(address,address,uint256) (contracts/templegold/StableGoldAuction.sol#268-302)\n\t- StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig) (contracts/templegold/StableGoldAuction.sol#67-77)\n\t- StableGoldAuction.setAuctionStarter(address) (contracts/templegold/StableGoldAuction.sol#83-88)\n\t- StableGoldAuction.setBidToken(address) (contracts/templegold/StableGoldAuction.sol#94-99)\n\t- StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132)\n\t- info.totalAuctionTokenAmount = totalGoldAmount (contracts/templegold/StableGoldAuction.sol#127)\n\tAuctionBase.epochs (contracts/templegold/AuctionBase.sol#15) can be used in cross function reentrancies:\n\t- StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149)\n\t- StableGoldAuction.canDeposit() (contracts/templegold/StableGoldAuction.sol#222-224)\n\t- StableGoldAuction.claim(uint256) (contracts/templegold/StableGoldAuction.sol#156-171)\n\t- StableGoldAuction.epochGoldSupply(uint256) (contracts/templegold/StableGoldAuction.sol#190-192)\n\t- StableGoldAuction.getClaimableAtEpoch(address,uint256) (contracts/templegold/StableGoldAuction.sol#251-257)\n\t- AuctionBase.getEpochInfo(uint256) (contracts/templegold/AuctionBase.sol#29-31)\n\t- StableGoldAuction.isCurrentEpochEnded() (contracts/templegold/StableGoldAuction.sol#214-216)\n\t- StableGoldAuction.onlyWhenLive() (contracts/templegold/StableGoldAuction.sol#338-341)\n\t- StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address) (contracts/templegold/StableGoldAuction.sol#309-324)\n\t- StableGoldAuction.recoverToken(address,address,uint256) (contracts/templegold/StableGoldAuction.sol#268-302)\n\t- StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig) (contracts/templegold/StableGoldAuction.sol#67-77)\n\t- StableGoldAuction.setAuctionStarter(address) (contracts/templegold/StableGoldAuction.sol#83-88)\n\t- StableGoldAuction.setBidToken(address) (contracts/templegold/StableGoldAuction.sol#94-99)\n\t- StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132)\n\t- startTime = info.startTime = uint128(block.timestamp) + config.auctionStartCooldown (contracts/templegold/StableGoldAuction.sol#128)\n\tAuctionBase.epochs (contracts/templegold/AuctionBase.sol#15) can be used in cross function reentrancies:\n\t- StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149)\n\t- StableGoldAuction.canDeposit() (contracts/templegold/StableGoldAuction.sol#222-224)\n\t- StableGoldAuction.claim(uint256) (contracts/templegold/StableGoldAuction.sol#156-171)\n\t- StableGoldAuction.epochGoldSupply(uint256) (contracts/templegold/StableGoldAuction.sol#190-192)\n\t- StableGoldAuction.getClaimableAtEpoch(address,uint256) (contracts/templegold/StableGoldAuction.sol#251-257)\n\t- AuctionBase.getEpochInfo(uint256) (contracts/templegold/AuctionBase.sol#29-31)\n\t- StableGoldAuction.isCurrentEpochEnded() (contracts/templegold/StableGoldAuction.sol#214-216)\n\t- StableGoldAuction.onlyWhenLive() (contracts/templegold/StableGoldAuction.sol#338-341)\n\t- StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address) (contracts/templegold/StableGoldAuction.sol#309-324)\n\t- StableGoldAuction.recoverToken(address,address,uint256) (contracts/templegold/StableGoldAuction.sol#268-302)\n\t- StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig) (contracts/templegold/StableGoldAuction.sol#67-77)\n\t- StableGoldAuction.setAuctionStarter(address) (contracts/templegold/StableGoldAuction.sol#83-88)\n\t- StableGoldAuction.setBidToken(address) (contracts/templegold/StableGoldAuction.sol#94-99)\n\t- StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132)\n\t- endTime = info.endTime = startTime + AUCTION_DURATION (contracts/templegold/StableGoldAuction.sol#129)\n\tAuctionBase.epochs (contracts/templegold/AuctionBase.sol#15) can be used in cross function reentrancies:\n\t- StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149)\n\t- StableGoldAuction.canDeposit() (contracts/templegold/StableGoldAuction.sol#222-224)\n\t- StableGoldAuction.claim(uint256) (contracts/templegold/StableGoldAuction.sol#156-171)\n\t- StableGoldAuction.epochGoldSupply(uint256) (contracts/templegold/StableGoldAuction.sol#190-192)\n\t- StableGoldAuction.getClaimableAtEpoch(address,uint256) (contracts/templegold/StableGoldAuction.sol#251-257)\n\t- AuctionBase.getEpochInfo(uint256) (contracts/templegold/AuctionBase.sol#29-31)\n\t- StableGoldAuction.isCurrentEpochEnded() (contracts/templegold/StableGoldAuction.sol#214-216)\n\t- StableGoldAuction.onlyWhenLive() (contracts/templegold/StableGoldAuction.sol#338-341)\n\t- StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address) (contracts/templegold/StableGoldAuction.sol#309-324)\n\t- StableGoldAuction.recoverToken(address,address,uint256) (contracts/templegold/StableGoldAuction.sol#268-302)\n\t- StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig) (contracts/templegold/StableGoldAuction.sol#67-77)\n\t- StableGoldAuction.setAuctionStarter(address) (contracts/templegold/StableGoldAuction.sol#83-88)\n\t- StableGoldAuction.setBidToken(address) (contracts/templegold/StableGoldAuction.sol#94-99)\n\t- StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132)\n", + "markdown": "Reentrancy in [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132):\n\tExternal calls:\n\t- [_distributeGold()](contracts/templegold/StableGoldAuction.sol#L119)\n\t\t- [templeGold.mint()](contracts/templegold/StableGoldAuction.sol#L335)\n\tState variables written after the call(s):\n\t- [epochId = _currentEpochId = currentEpochCache + 1](contracts/templegold/StableGoldAuction.sol#L122)\n\t[AuctionBase._currentEpochId](contracts/templegold/AuctionBase.sol#L13) can be used in cross function reentrancies:\n\t- [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149)\n\t- [StableGoldAuction.canDeposit()](contracts/templegold/StableGoldAuction.sol#L222-L224)\n\t- [StableGoldAuction.currentEpoch()](contracts/templegold/StableGoldAuction.sol#L198-L200)\n\t- [StableGoldAuction.getClaimableAtCurrentEpoch(address)](contracts/templegold/StableGoldAuction.sol#L240-L242)\n\t- [StableGoldAuction.getClaimableAtEpoch(address,uint256)](contracts/templegold/StableGoldAuction.sol#L251-L257)\n\t- [StableGoldAuction.isCurrentEpochEnded()](contracts/templegold/StableGoldAuction.sol#L214-L216)\n\t- [StableGoldAuction.nextEpoch()](contracts/templegold/StableGoldAuction.sol#L206-L208)\n\t- [StableGoldAuction.onlyWhenLive()](contracts/templegold/StableGoldAuction.sol#L338-L341)\n\t- [StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address)](contracts/templegold/StableGoldAuction.sol#L309-L324)\n\t- [StableGoldAuction.recoverToken(address,address,uint256)](contracts/templegold/StableGoldAuction.sol#L268-L302)\n\t- [StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig)](contracts/templegold/StableGoldAuction.sol#L67-L77)\n\t- [StableGoldAuction.setAuctionStarter(address)](contracts/templegold/StableGoldAuction.sol#L83-L88)\n\t- [StableGoldAuction.setBidToken(address)](contracts/templegold/StableGoldAuction.sol#L94-L99)\n\t- [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132)\n\t- [info.totalAuctionTokenAmount = totalGoldAmount](contracts/templegold/StableGoldAuction.sol#L127)\n\t[AuctionBase.epochs](contracts/templegold/AuctionBase.sol#L15) can be used in cross function reentrancies:\n\t- [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149)\n\t- [StableGoldAuction.canDeposit()](contracts/templegold/StableGoldAuction.sol#L222-L224)\n\t- [StableGoldAuction.claim(uint256)](contracts/templegold/StableGoldAuction.sol#L156-L171)\n\t- [StableGoldAuction.epochGoldSupply(uint256)](contracts/templegold/StableGoldAuction.sol#L190-L192)\n\t- [StableGoldAuction.getClaimableAtEpoch(address,uint256)](contracts/templegold/StableGoldAuction.sol#L251-L257)\n\t- [AuctionBase.getEpochInfo(uint256)](contracts/templegold/AuctionBase.sol#L29-L31)\n\t- [StableGoldAuction.isCurrentEpochEnded()](contracts/templegold/StableGoldAuction.sol#L214-L216)\n\t- [StableGoldAuction.onlyWhenLive()](contracts/templegold/StableGoldAuction.sol#L338-L341)\n\t- [StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address)](contracts/templegold/StableGoldAuction.sol#L309-L324)\n\t- [StableGoldAuction.recoverToken(address,address,uint256)](contracts/templegold/StableGoldAuction.sol#L268-L302)\n\t- [StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig)](contracts/templegold/StableGoldAuction.sol#L67-L77)\n\t- [StableGoldAuction.setAuctionStarter(address)](contracts/templegold/StableGoldAuction.sol#L83-L88)\n\t- [StableGoldAuction.setBidToken(address)](contracts/templegold/StableGoldAuction.sol#L94-L99)\n\t- [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132)\n\t- [startTime = info.startTime = uint128(block.timestamp) + config.auctionStartCooldown](contracts/templegold/StableGoldAuction.sol#L128)\n\t[AuctionBase.epochs](contracts/templegold/AuctionBase.sol#L15) can be used in cross function reentrancies:\n\t- [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149)\n\t- [StableGoldAuction.canDeposit()](contracts/templegold/StableGoldAuction.sol#L222-L224)\n\t- [StableGoldAuction.claim(uint256)](contracts/templegold/StableGoldAuction.sol#L156-L171)\n\t- [StableGoldAuction.epochGoldSupply(uint256)](contracts/templegold/StableGoldAuction.sol#L190-L192)\n\t- [StableGoldAuction.getClaimableAtEpoch(address,uint256)](contracts/templegold/StableGoldAuction.sol#L251-L257)\n\t- [AuctionBase.getEpochInfo(uint256)](contracts/templegold/AuctionBase.sol#L29-L31)\n\t- [StableGoldAuction.isCurrentEpochEnded()](contracts/templegold/StableGoldAuction.sol#L214-L216)\n\t- [StableGoldAuction.onlyWhenLive()](contracts/templegold/StableGoldAuction.sol#L338-L341)\n\t- [StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address)](contracts/templegold/StableGoldAuction.sol#L309-L324)\n\t- [StableGoldAuction.recoverToken(address,address,uint256)](contracts/templegold/StableGoldAuction.sol#L268-L302)\n\t- [StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig)](contracts/templegold/StableGoldAuction.sol#L67-L77)\n\t- [StableGoldAuction.setAuctionStarter(address)](contracts/templegold/StableGoldAuction.sol#L83-L88)\n\t- [StableGoldAuction.setBidToken(address)](contracts/templegold/StableGoldAuction.sol#L94-L99)\n\t- [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132)\n\t- [endTime = info.endTime = startTime + AUCTION_DURATION](contracts/templegold/StableGoldAuction.sol#L129)\n\t[AuctionBase.epochs](contracts/templegold/AuctionBase.sol#L15) can be used in cross function reentrancies:\n\t- [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149)\n\t- [StableGoldAuction.canDeposit()](contracts/templegold/StableGoldAuction.sol#L222-L224)\n\t- [StableGoldAuction.claim(uint256)](contracts/templegold/StableGoldAuction.sol#L156-L171)\n\t- [StableGoldAuction.epochGoldSupply(uint256)](contracts/templegold/StableGoldAuction.sol#L190-L192)\n\t- [StableGoldAuction.getClaimableAtEpoch(address,uint256)](contracts/templegold/StableGoldAuction.sol#L251-L257)\n\t- [AuctionBase.getEpochInfo(uint256)](contracts/templegold/AuctionBase.sol#L29-L31)\n\t- [StableGoldAuction.isCurrentEpochEnded()](contracts/templegold/StableGoldAuction.sol#L214-L216)\n\t- [StableGoldAuction.onlyWhenLive()](contracts/templegold/StableGoldAuction.sol#L338-L341)\n\t- [StableGoldAuction.recoverTempleGoldForZeroBidAuction(uint256,address)](contracts/templegold/StableGoldAuction.sol#L309-L324)\n\t- [StableGoldAuction.recoverToken(address,address,uint256)](contracts/templegold/StableGoldAuction.sol#L268-L302)\n\t- [StableGoldAuction.setAuctionConfig(IStableGoldAuction.AuctionConfig)](contracts/templegold/StableGoldAuction.sol#L67-L77)\n\t- [StableGoldAuction.setAuctionStarter(address)](contracts/templegold/StableGoldAuction.sol#L83-L88)\n\t- [StableGoldAuction.setBidToken(address)](contracts/templegold/StableGoldAuction.sol#L94-L99)\n\t- [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L107-L132", + "id": "f82deef320d6f6e5264604ea8104e7710d1ef032cc07fb167400991051cbd48a", + "check": "reentrancy-no-eth", "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "function", - "name": "setTlcStrategy", + "type": "variable", + "name": "shutdownParams", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 9303, + "length": 36, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [238], + "starting_column": 9, + "ending_column": 45 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TempleLineOfCredit", + "type": "function", + "name": "populateShutdownData", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 9023, + "length": 564, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "populateShutdownData(bytes)" } - }, - "signature": "setTlcStrategy(address)" + } } - }, + } + ], + "description": "RamosStrategy.populateShutdownData(bytes).shutdownParams (contracts/v2/strategies/RamosStrategy.sol#238) is a local variable never initialized\n", + "markdown": "[RamosStrategy.populateShutdownData(bytes).shutdownParams](contracts/v2/strategies/RamosStrategy.sol#L238) is a local variable never initialized\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L238", + "id": "e3b0c7352e8da48d32a58f5b6962b6132c525566519d363234f70e52d4760882", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "daiToken.approve(previousTrv,0)", + "type": "variable", + "name": "baseStrategyAvailable", "source_mapping": { - "start": 16002, - "length": 32, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 21090, + "length": 29, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [394], - "starting_column": 13, - "ending_column": 45 + "lines": [476], + "starting_column": 9, + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTlcStrategy", + "name": "totalAvailable", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 20921, + "length": 877, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489 ], "starting_column": 5, "ending_column": 6 @@ -10358,102 +10166,92 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTlcStrategy(address)" + "signature": "totalAvailable(IERC20)" } } } } ], - "description": "TempleLineOfCredit.setTlcStrategy(address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#386-409) ignores return value by daiToken.approve(previousTrv,0) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#394)\n", - "markdown": "[TempleLineOfCredit.setTlcStrategy(address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409) ignores return value by [daiToken.approve(previousTrv,0)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L394)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409", - "id": "5fa79b657e0f64d022302a3a9b887d1ab1e0a67d8ba497e49c5d707e4f4d8bb3", - "check": "unused-return", + "description": "TreasuryReservesVault.totalAvailable(IERC20).baseStrategyAvailable (contracts/v2/TreasuryReservesVault.sol#476) is a local variable never initialized\n", + "markdown": "[TreasuryReservesVault.totalAvailable(IERC20).baseStrategyAvailable](contracts/v2/TreasuryReservesVault.sol#L476) is a local variable never initialized\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L476", + "id": "5a877bceafff56259a481e94173f69b6c70a20fc470647802278ccdef5ab0fcd", + "check": "uninitialized-local", "impact": "Medium", "confidence": "Medium" }, @@ -10461,180 +10259,216 @@ "elements": [ { "type": "variable", - "name": "quoteToken", + "name": "i", "source_mapping": { - "start": 4822, - "length": 18, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 8365, + "length": 9, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [103], + "lines": [213], "starting_column": 9, - "ending_column": 27 + "ending_column": 18 }, "type_specific_fields": { "parent": { "type": "function", - "name": "maxRebalanceAmounts", + "name": "updateStrategyEnabledBorrowTokens", "source_mapping": { - "start": 4738, - "length": 140, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 8068, + "length": 898, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [101, 102, 103, 104, 105], + "lines": [ + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227 + ], "starting_column": 5, - "ending_column": 7 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "IRamos", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1408, - "length": 10519, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "maxRebalanceAmounts()" + "signature": "updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[])" } } } - }, + } + ], + "description": "TreasuryReservesVault.updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[]).i (contracts/v2/TreasuryReservesVault.sol#213) is a local variable never initialized\n", + "markdown": "[TreasuryReservesVault.updateStrategyEnabledBorrowTokens(address,IERC20[],IERC20[]).i](contracts/v2/TreasuryReservesVault.sol#L213) is a local variable never initialized\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L213", + "id": "ccb61a70ed00f67ef5318dfebba8dd5906b02a2b7022418f095ca6131f2e87a0", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { "type": "function", - "name": "quoteToken", + "name": "depositAndStake", "source_mapping": { - "start": 3767, - "length": 53, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 2875, + "length": 351, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [80], + "lines": [79, 80, 81, 82, 83, 84, 85], "starting_column": 5, - "ending_column": 58 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "IRamos", + "name": "AuraStaking", "source_mapping": { - "start": 1408, - "length": 10519, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "quoteToken()" + "signature": "depositAndStake(uint256)" } - } - ], - "description": "IRamos.maxRebalanceAmounts().quoteToken (contracts/interfaces/amo/IRamos.sol#103) shadows:\n\t- IRamos.quoteToken() (contracts/interfaces/amo/IRamos.sol#80) (function)\n", - "markdown": "[IRamos.maxRebalanceAmounts().quoteToken](contracts/interfaces/amo/IRamos.sol#L103) shadows:\n\t- [IRamos.quoteToken()](contracts/interfaces/amo/IRamos.sol#L80) (function)\n", - "first_markdown_element": "contracts/interfaces/amo/IRamos.sol#L103", - "id": "a030cfdb07ff13cdfeb8487608a714d3b198ff28886a8ef272f9e70a87a70f0a", - "check": "shadowing-local", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "protocolToken", + "type": "node", + "name": "booster.deposit(auraPoolInfo.pId,amount,true)", "source_mapping": { - "start": 4850, - "length": 21, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 3162, + "length": 47, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [104], - "starting_column": 9, - "ending_column": 30 + "lines": [83], + "starting_column": 13, + "ending_column": 60 }, "type_specific_fields": { "parent": { "type": "function", - "name": "maxRebalanceAmounts", + "name": "depositAndStake", "source_mapping": { - "start": 4738, - "length": 140, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 2875, + "length": 351, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [101, 102, 103, 104, 105], + "lines": [79, 80, 81, 82, 83, 84, 85], "starting_column": 5, - "ending_column": 7 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "IRamos", + "name": "AuraStaking", "source_mapping": { - "start": 1408, - "length": 10519, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, @@ -10644,1317 +10478,1448 @@ 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "maxRebalanceAmounts()" + "signature": "depositAndStake(uint256)" } } } - }, + } + ], + "description": "AuraStaking.depositAndStake(uint256) (contracts/amo/AuraStaking.sol#79-85) ignores return value by booster.deposit(auraPoolInfo.pId,amount,true) (contracts/amo/AuraStaking.sol#83)\n", + "markdown": "[AuraStaking.depositAndStake(uint256)](contracts/amo/AuraStaking.sol#L79-L85) ignores return value by [booster.deposit(auraPoolInfo.pId,amount,true)](contracts/amo/AuraStaking.sol#L83)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L79-L85", + "id": "df1bba2db758866958a0bd3d600869193c2a4c54635aeec3c0158683eb3c6bd1", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { "type": "function", - "name": "protocolToken", + "name": "withdrawAndUnwrap", "source_mapping": { - "start": 3567, - "length": 56, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 3287, + "length": 634, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [76], + "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100], "starting_column": 5, - "ending_column": 61 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "IRamos", + "name": "AuraStaking", "source_mapping": { - "start": 1408, - "length": 10519, - "filename_relative": "contracts/interfaces/amo/IRamos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", - "filename_short": "contracts/interfaces/amo/IRamos.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "protocolToken()" + "signature": "withdrawAndUnwrap(uint256,bool,address)" } - } - ], - "description": "IRamos.maxRebalanceAmounts().protocolToken (contracts/interfaces/amo/IRamos.sol#104) shadows:\n\t- IRamos.protocolToken() (contracts/interfaces/amo/IRamos.sol#76) (function)\n", - "markdown": "[IRamos.maxRebalanceAmounts().protocolToken](contracts/interfaces/amo/IRamos.sol#L104) shadows:\n\t- [IRamos.protocolToken()](contracts/interfaces/amo/IRamos.sol#L76) (function)\n", - "first_markdown_element": "contracts/interfaces/amo/IRamos.sol#L104", - "id": "99988e8d4356d61dc22dc1203ce47d52bd194ee6c04869d1c08b03332a4a64b3", - "check": "shadowing-local", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "baseShares", + "type": "node", + "name": "IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim)", "source_mapping": { - "start": 3468, - "length": 18, - "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", + "start": 3681, + "length": 77, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [86], - "starting_column": 9, - "ending_column": 27 + "lines": [93], + "starting_column": 13, + "ending_column": 90 }, "type_specific_fields": { "parent": { "type": "function", - "name": "debtors", + "name": "withdrawAndUnwrap", "source_mapping": { - "start": 3219, - "length": 737, - "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", + "start": 3287, + "length": 634, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [ - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97 - ], + "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100], "starting_column": 5, - "ending_column": 7 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITempleDebtToken", + "name": "AuraStaking", "source_mapping": { - "start": 325, - "length": 8309, - "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "debtors(address)" + "signature": "withdrawAndUnwrap(uint256,bool,address)" } } } - }, + } + ], + "description": "AuraStaking.withdrawAndUnwrap(uint256,bool,address) (contracts/amo/AuraStaking.sol#88-100) ignores return value by IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim) (contracts/amo/AuraStaking.sol#93)\n", + "markdown": "[AuraStaking.withdrawAndUnwrap(uint256,bool,address)](contracts/amo/AuraStaking.sol#L88-L100) ignores return value by [IAuraBaseRewardPool(auraPoolInfo.rewards).withdrawAndUnwrap(toUnstake,claim)](contracts/amo/AuraStaking.sol#L93)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L88-L100", + "id": "a3f11c21d94cc0286397b0f4acf966b2e7b4421bbb8026550ce5beae49adbf78", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { "type": "function", - "name": "baseShares", + "name": "getReward", "source_mapping": { - "start": 1667, - "length": 54, - "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", + "start": 4292, + "length": 657, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [42], + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125 + ], "starting_column": 5, - "ending_column": 59 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITempleDebtToken", + "name": "AuraStaking", "source_mapping": { - "start": 325, - "length": 8309, - "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", - "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "baseShares()" + "signature": "getReward(bool)" } - } - ], - "description": "ITempleDebtToken.debtors(address).baseShares (contracts/interfaces/v2/ITempleDebtToken.sol#86) shadows:\n\t- ITempleDebtToken.baseShares() (contracts/interfaces/v2/ITempleDebtToken.sol#42) (function)\n", - "markdown": "[ITempleDebtToken.debtors(address).baseShares](contracts/interfaces/v2/ITempleDebtToken.sol#L86) shadows:\n\t- [ITempleDebtToken.baseShares()](contracts/interfaces/v2/ITempleDebtToken.sol#L42) (function)\n", - "first_markdown_element": "contracts/interfaces/v2/ITempleDebtToken.sol#L86", - "id": "660d8ad3fe151743a4b6eac08ff790cbd92361508e6a7e1ac51d359fbd40579a", - "check": "shadowing-local", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "borrow", + "type": "node", + "name": "IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras)", "source_mapping": { - "start": 11494, - "length": 11, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 4357, + "length": 79, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [291], - "starting_column": 30, - "ending_column": 41 + "lines": [111], + "starting_column": 9, + "ending_column": 88 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setGlobalPaused", + "name": "getReward", "source_mapping": { - "start": 11469, - "length": 60, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 4292, + "length": 657, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [291], + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125 + ], "starting_column": 5, - "ending_column": 65 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITreasuryReservesVault", + "name": "AuraStaking", "source_mapping": { - "start": 1896, - "length": 12436, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setGlobalPaused(bool,bool)" + "signature": "getReward(bool)" } } } - }, + } + ], + "description": "AuraStaking.getReward(bool) (contracts/amo/AuraStaking.sol#110-125) ignores return value by IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras) (contracts/amo/AuraStaking.sol#111)\n", + "markdown": "[AuraStaking.getReward(bool)](contracts/amo/AuraStaking.sol#L110-L125) ignores return value by [IAuraBaseRewardPool(auraPoolInfo.rewards).getReward(address(this),claimExtras)](contracts/amo/AuraStaking.sol#L111)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L110-L125", + "id": "334cc08346f4acb06b750e6d7ca0bbba6ed0f1443127882a8bce2dba76eedff5", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { "type": "function", - "name": "borrow", + "name": "setTokenVault", "source_mapping": { - "start": 13392, - "length": 80, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 7961, + "length": 628, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [336], + "lines": [ + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207 + ], "starting_column": 5, - "ending_column": 85 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITreasuryReservesVault", + "name": "Ramos", "source_mapping": { - "start": 1896, - "length": 12436, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrow(IERC20,uint256,address)" + "signature": "setTokenVault(address)" } - } - ], - "description": "ITreasuryReservesVault.setGlobalPaused(bool,bool).borrow (contracts/interfaces/v2/ITreasuryReservesVault.sol#291) shadows:\n\t- ITreasuryReservesVault.borrow(IERC20,uint256,address) (contracts/interfaces/v2/ITreasuryReservesVault.sol#336) (function)\n", - "markdown": "[ITreasuryReservesVault.setGlobalPaused(bool,bool).borrow](contracts/interfaces/v2/ITreasuryReservesVault.sol#L291) shadows:\n\t- [ITreasuryReservesVault.borrow(IERC20,uint256,address)](contracts/interfaces/v2/ITreasuryReservesVault.sol#L336) (function)\n", - "first_markdown_element": "contracts/interfaces/v2/ITreasuryReservesVault.sol#L291", - "id": "ee178bdb812ac154f4b12235ea96012285731106c401b64ca146c3171f9f2b58", - "check": "shadowing-local", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "borrow", + "type": "node", + "name": "protocolToken.approve(previousVault,0)", "source_mapping": { - "start": 11679, - "length": 11, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 8229, + "length": 39, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [296], - "starting_column": 50, - "ending_column": 61 + "lines": [195], + "starting_column": 13, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setStrategyPaused", + "name": "setTokenVault", "source_mapping": { - "start": 11634, - "length": 80, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 7961, + "length": 628, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [296], + "lines": [ + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207 + ], "starting_column": 5, - "ending_column": 85 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITreasuryReservesVault", + "name": "Ramos", "source_mapping": { - "start": 1896, - "length": 12436, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setStrategyPaused(address,bool,bool)" + "signature": "setTokenVault(address)" } } } - }, + } + ], + "description": "Ramos.setTokenVault(address) (contracts/amo/Ramos.sol#189-207) ignores return value by protocolToken.approve(previousVault,0) (contracts/amo/Ramos.sol#195)\n", + "markdown": "[Ramos.setTokenVault(address)](contracts/amo/Ramos.sol#L189-L207) ignores return value by [protocolToken.approve(previousVault,0)](contracts/amo/Ramos.sol#L195)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L189-L207", + "id": "f3361a65ee76c42e014ac2084189cb808a536ace3a08c0927237056d9aee806c", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ { "type": "function", - "name": "borrow", + "name": "setTokenVault", "source_mapping": { - "start": 13392, - "length": 80, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 7961, + "length": 628, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [336], + "lines": [ + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207 + ], "starting_column": 5, - "ending_column": 85 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ITreasuryReservesVault", + "name": "Ramos", "source_mapping": { - "start": 1896, - "length": 12436, - "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", - "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrow(IERC20,uint256,address)" + "signature": "setTokenVault(address)" } - } - ], - "description": "ITreasuryReservesVault.setStrategyPaused(address,bool,bool).borrow (contracts/interfaces/v2/ITreasuryReservesVault.sol#296) shadows:\n\t- ITreasuryReservesVault.borrow(IERC20,uint256,address) (contracts/interfaces/v2/ITreasuryReservesVault.sol#336) (function)\n", - "markdown": "[ITreasuryReservesVault.setStrategyPaused(address,bool,bool).borrow](contracts/interfaces/v2/ITreasuryReservesVault.sol#L296) shadows:\n\t- [ITreasuryReservesVault.borrow(IERC20,uint256,address)](contracts/interfaces/v2/ITreasuryReservesVault.sol#L336) (function)\n", - "first_markdown_element": "contracts/interfaces/v2/ITreasuryReservesVault.sol#L296", - "id": "1f2b144fa0b8083ee1a1ca697a2403bf2d85ddb7223aae096e89a677da991192", - "check": "shadowing-local", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "_owner", + "type": "node", + "name": "quoteToken.approve(previousVault,0)", "source_mapping": { - "start": 2665, - "length": 14, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 8282, + "length": 36, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [67], - "starting_column": 17, - "ending_column": 31 + "lines": [196], + "starting_column": 13, + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "setTokenVault", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 7961, + "length": 628, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Ramos", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address)" + "signature": "setTokenVault(address)" } } } + } + ], + "description": "Ramos.setTokenVault(address) (contracts/amo/Ramos.sol#189-207) ignores return value by quoteToken.approve(previousVault,0) (contracts/amo/Ramos.sol#196)\n", + "markdown": "[Ramos.setTokenVault(address)](contracts/amo/Ramos.sol#L189-L207) ignores return value by [quoteToken.approve(previousVault,0)](contracts/amo/Ramos.sol#L196)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L189-L207", + "id": "aface72eecf0b7ba93b6bf44cc1f3e5761d97abf8c0de3daa4bfebcc0d8b3ccf", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "addLiquidity", + "source_mapping": { + "start": 19878, + "length": 2088, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + } }, { "type": "node", - "name": "owner = _owner", + "name": "quoteToken.approve(address(balancerVault),0)", "source_mapping": { - "start": 2732, - "length": 14, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 21131, + "length": 45, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [68], - "starting_column": 9, - "ending_column": 23 + "lines": [489], + "starting_column": 17, + "ending_column": 62 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "addLiquidity", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 19878, + "length": 2088, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Ramos", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(address,address,address)" - } - } - } - } - ], - "description": "TempleUniswapV2Pair.constructor(address,address,address)._owner (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- owner = _owner (contracts/amm/TempleUniswapV2Pair.sol#68)\n", - "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._owner](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [owner = _owner](contracts/amm/TempleUniswapV2Pair.sol#L68)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", - "id": "957fa8fd60f70987f3ddecb1cc94bcc42a04d5732b7d1fd612e14be458618171", - "check": "missing-zero-check", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "variable", - "name": "_token0", + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + } + } + } + } + ], + "description": "Ramos.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/amo/Ramos.sol#462-511) ignores return value by quoteToken.approve(address(balancerVault),0) (contracts/amo/Ramos.sol#489)\n", + "markdown": "[Ramos.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/amo/Ramos.sol#L462-L511) ignores return value by [quoteToken.approve(address(balancerVault),0)](contracts/amo/Ramos.sol#L489)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L462-L511", + "id": "1acb56caae7ee9b6838e5f5408e687213e838f292c79c37223b9cb790b0a5f6c", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "getBalances", "source_mapping": { - "start": 2681, - "length": 15, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2079, + "length": 154, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67], - "starting_column": 33, - "ending_column": 48 + "lines": [55, 56, 57], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleUniswapV2Pair", - "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(address,address,address)" + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "getBalances()" } }, { "type": "node", - "name": "token0 = _token0", + "name": "(None,balances,None) = balancerVault.getPoolTokens(balancerPoolId)", "source_mapping": { - "start": 2756, - "length": 16, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2167, + "length": 59, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [69], - "starting_column": 9, - "ending_column": 25 + "lines": [56], + "starting_column": 7, + "ending_column": 66 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "getBalances", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2079, + "length": 154, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [55, 56, 57], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address)" + "signature": "getBalances()" } } } } ], - "description": "TempleUniswapV2Pair.constructor(address,address,address)._token0 (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- token0 = _token0 (contracts/amm/TempleUniswapV2Pair.sol#69)\n", - "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._token0](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [token0 = _token0](contracts/amm/TempleUniswapV2Pair.sol#L69)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", - "id": "89b68064543393a53cb614749cb260c4fb872797867021adbebf53b5a0362b2f", - "check": "missing-zero-check", - "impact": "Low", + "description": "BalancerPoolHelper.getBalances() (contracts/amo/helpers/BalancerPoolHelper.sol#55-57) ignores return value by (None,balances,None) = balancerVault.getPoolTokens(balancerPoolId) (contracts/amo/helpers/BalancerPoolHelper.sol#56)\n", + "markdown": "[BalancerPoolHelper.getBalances()](contracts/amo/helpers/BalancerPoolHelper.sol#L55-L57) ignores return value by [(None,balances,None) = balancerVault.getPoolTokens(balancerPoolId)](contracts/amo/helpers/BalancerPoolHelper.sol#L56)\n", + "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L55-L57", + "id": "97630a6a935fd6fa31a1e214fdb8582cf37cbb5ba228037742cc7ccc77486019", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_token1", + "type": "function", + "name": "proportionalAddLiquidityQuote", "source_mapping": { - "start": 2698, - "length": 15, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 15567, + "length": 1930, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67], - "starting_column": 50, - "ending_column": 65 + "lines": [ + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleUniswapV2Pair", - "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(address,address,address)" + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "proportionalAddLiquidityQuote(uint256,uint256)" } }, { "type": "node", - "name": "token1 = _token1", + "name": "(expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData)", "source_mapping": { - "start": 2782, - "length": 16, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 17103, + "length": 88, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [70], + "lines": [374], "starting_column": 9, - "ending_column": 25 + "ending_column": 97 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "proportionalAddLiquidityQuote", "source_mapping": { - "start": 2653, - "length": 152, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 15567, + "length": 1930, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address)" + "signature": "proportionalAddLiquidityQuote(uint256,uint256)" } } } } ], - "description": "TempleUniswapV2Pair.constructor(address,address,address)._token1 (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- token1 = _token1 (contracts/amm/TempleUniswapV2Pair.sol#70)\n", - "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._token1](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [token1 = _token1](contracts/amm/TempleUniswapV2Pair.sol#L70)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", - "id": "690db18543951330bfe14086929ed1a80aa7c5c43d413a52b921411451479889", - "check": "missing-zero-check", - "impact": "Low", + "description": "BalancerPoolHelper.proportionalAddLiquidityQuote(uint256,uint256) (contracts/amo/helpers/BalancerPoolHelper.sol#348-380) ignores return value by (expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData) (contracts/amo/helpers/BalancerPoolHelper.sol#374)\n", + "markdown": "[BalancerPoolHelper.proportionalAddLiquidityQuote(uint256,uint256)](contracts/amo/helpers/BalancerPoolHelper.sol#L348-L380) ignores return value by [(expectedBptAmount,None) = balancerHelpers.queryJoin(balancerPoolId,amo,amo,requestData)](contracts/amo/helpers/BalancerPoolHelper.sol#L374)\n", + "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L348-L380", + "id": "44982b3b03e18740f01aed72e03f5657be31a18422cec5c4f5a8d53b084f8256", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_router", + "type": "function", + "name": "proportionalRemoveLiquidityQuote", "source_mapping": { - "start": 2904, - "length": 15, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 17648, + "length": 1775, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [74], - "starting_column": 24, - "ending_column": 39 + "lines": [ + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "setRouter", + "type": "contract", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 2885, - "length": 140, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [74, 75, 76, 77], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleUniswapV2Pair", - "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setRouter(address)" + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" } }, { "type": "node", - "name": "router = _router", + "name": "(None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData)", "source_mapping": { - "start": 3002, - "length": 16, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 18569, + "length": 96, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [76], + "lines": [405], "starting_column": 9, - "ending_column": 25 + "ending_column": 105 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setRouter", + "name": "proportionalRemoveLiquidityQuote", "source_mapping": { - "start": 2885, - "length": 140, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 17648, + "length": 1775, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [74, 75, 76, 77], + "lines": [ + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setRouter(address)" - } - } - } - } - ], - "description": "TempleUniswapV2Pair.setRouter(address)._router (contracts/amm/TempleUniswapV2Pair.sol#74) lacks a zero-check on :\n\t\t- router = _router (contracts/amm/TempleUniswapV2Pair.sol#76)\n", - "markdown": "[TempleUniswapV2Pair.setRouter(address)._router](contracts/amm/TempleUniswapV2Pair.sol#L74) lacks a zero-check on :\n\t\t- [router = _router](contracts/amm/TempleUniswapV2Pair.sol#L76)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L74", - "id": "65b7f26867d221829e7395a702a30581f77ebb909c900aa9dc269f7dd15923d0", - "check": "missing-zero-check", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "variable", - "name": "_implementation", - "source_mapping": { - "start": 1224, - "length": 23, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [40], - "starting_column": 17, - "ending_column": 40 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "constructor", - "source_mapping": { - "start": 1212, - "length": 230, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [40, 41, 42, 43, 44], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "constructor(address,uint16)" - } - } - } - }, - { - "type": "node", - "name": "templeTeamPaymentsImplementation = _implementation", - "source_mapping": { - "start": 1302, - "length": 50, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [41], - "starting_column": 9, - "ending_column": 59 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "constructor", - "source_mapping": { - "start": 1212, - "length": 230, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [40, 41, 42, 43, 44], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "constructor(address,uint16)" + "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" } } } } ], - "description": "TempleTeamPaymentsFactory.constructor(address,uint16)._implementation (contracts/admin/TempleTeamPaymentsFactory.sol#40) lacks a zero-check on :\n\t\t- templeTeamPaymentsImplementation = _implementation (contracts/admin/TempleTeamPaymentsFactory.sol#41)\n", - "markdown": "[TempleTeamPaymentsFactory.constructor(address,uint16)._implementation](contracts/admin/TempleTeamPaymentsFactory.sol#L40) lacks a zero-check on :\n\t\t- [templeTeamPaymentsImplementation = _implementation](contracts/admin/TempleTeamPaymentsFactory.sol#L41)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L40", - "id": "da87c5c8c1b8544472d505a239a86c8fd5eef6af865588f2c95eaae614f5b72a", - "check": "missing-zero-check", - "impact": "Low", + "description": "BalancerPoolHelper.proportionalRemoveLiquidityQuote(uint256,uint256) (contracts/amo/helpers/BalancerPoolHelper.sol#384-416) ignores return value by (None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData) (contracts/amo/helpers/BalancerPoolHelper.sol#405)\n", + "markdown": "[BalancerPoolHelper.proportionalRemoveLiquidityQuote(uint256,uint256)](contracts/amo/helpers/BalancerPoolHelper.sol#L384-L416) ignores return value by [(None,requestData.minAmountsOut) = balancerHelpers.queryExit(balancerPoolId,amo,amo,requestData)](contracts/amo/helpers/BalancerPoolHelper.sol#L405)\n", + "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L384-L416", + "id": "08b9be6d43268a91c87113facf1f93ba28159d15047c9ef6e2a5e42a2a791c97", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_defendStable", + "type": "function", + "name": "removeOtcMarket", "source_mapping": { - "start": 1200, - "length": 22, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 4308, + "length": 464, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [40], - "starting_column": 13, - "ending_column": 35 + "lines": [81, 82, 83, 84, 85, 86, 87, 88, 89], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "MultiOtcOffer", "source_mapping": { - "start": 1091, - "length": 291, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 1161, + "length": 13535, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [37, 38, 39, 40, 41, 42, 43, 44, 45, 46], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleStableAMMRouter", - "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", - "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(TempleERC20Token,ITreasuryIV,address)" + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "removeOtcMarket(address,address)" } }, { "type": "node", - "name": "defendStable = _defendStable", + "name": "_otcMarketIds.remove(_marketId)", "source_mapping": { - "start": 1346, - "length": 29, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 4577, + "length": 31, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [45], + "lines": [84], "starting_column": 9, - "ending_column": 38 + "ending_column": 40 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "removeOtcMarket", "source_mapping": { - "start": 1091, - "length": 291, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 4308, + "length": 464, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, - "lines": [37, 38, 39, 40, 41, 42, 43, 44, 45, 46], + "lines": [81, 82, 83, 84, 85, 86, 87, 88, 89], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "MultiOtcOffer", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 1161, + "length": 13535, + "filename_relative": "contracts/core/MultiOtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/MultiOtcOffer.sol", + "filename_short": "contracts/core/MultiOtcOffer.sol", "is_dependency": false, "lines": [ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, @@ -11973,909 +11938,1148 @@ 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(TempleERC20Token,ITreasuryIV,address)" + "signature": "removeOtcMarket(address,address)" } } } } ], - "description": "TempleStableAMMRouter.constructor(TempleERC20Token,ITreasuryIV,address)._defendStable (contracts/amm/TempleStableAMMRouter.sol#40) lacks a zero-check on :\n\t\t- defendStable = _defendStable (contracts/amm/TempleStableAMMRouter.sol#45)\n", - "markdown": "[TempleStableAMMRouter.constructor(TempleERC20Token,ITreasuryIV,address)._defendStable](contracts/amm/TempleStableAMMRouter.sol#L40) lacks a zero-check on :\n\t\t- [defendStable = _defendStable](contracts/amm/TempleStableAMMRouter.sol#L45)\n", - "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L40", - "id": "8e8b46a3e001386612a0920cae43f3178af46f175ae977aa5f36adc5662d1cda", - "check": "missing-zero-check", - "impact": "Low", + "description": "MultiOtcOffer.removeOtcMarket(address,address) (contracts/core/MultiOtcOffer.sol#81-89) ignores return value by _otcMarketIds.remove(_marketId) (contracts/core/MultiOtcOffer.sol#84)\n", + "markdown": "[MultiOtcOffer.removeOtcMarket(address,address)](contracts/core/MultiOtcOffer.sol#L81-L89) ignores return value by [_otcMarketIds.remove(_marketId)](contracts/core/MultiOtcOffer.sol#L84)\n", + "first_markdown_element": "contracts/core/MultiOtcOffer.sol#L81-L89", + "id": "79c4d4701a934e7e79200185323bb45688ce5b0c8b33dda709234bad490f1472", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_defendStable", + "type": "function", + "name": "setBorrowToken", "source_mapping": { - "start": 1652, - "length": 21, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 4146, + "length": 1025, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [56], - "starting_column": 30, - "ending_column": 51 + "lines": [ + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "setDefendStable", + "type": "contract", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1627, - "length": 112, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [56, 57, 58], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleStableAMMRouter", - "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", - "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setDefendStable(address)" + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "setBorrowToken(IERC20,address,uint256,uint256,address)" } }, { "type": "node", - "name": "defendStable = _defendStable", + "name": "_borrowTokenSet.add(address(token))", "source_mapping": { - "start": 1704, - "length": 28, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 5129, + "length": 35, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [57], + "lines": [126], "starting_column": 9, - "ending_column": 37 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setDefendStable", + "name": "setBorrowToken", "source_mapping": { - "start": 1627, - "length": 112, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 4146, + "length": 1025, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [56, 57, 58], + "lines": [ + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleStableAMMRouter", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 640, - "length": 8255, - "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", - "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setDefendStable(address)" + "signature": "setBorrowToken(IERC20,address,uint256,uint256,address)" } } } } ], - "description": "TempleStableAMMRouter.setDefendStable(address)._defendStable (contracts/amm/TempleStableAMMRouter.sol#56) lacks a zero-check on :\n\t\t- defendStable = _defendStable (contracts/amm/TempleStableAMMRouter.sol#57)\n", - "markdown": "[TempleStableAMMRouter.setDefendStable(address)._defendStable](contracts/amm/TempleStableAMMRouter.sol#L56) lacks a zero-check on :\n\t\t- [defendStable = _defendStable](contracts/amm/TempleStableAMMRouter.sol#L57)\n", - "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L56", - "id": "de02254c0f567ff1a6e8223d4826abf485c07990091f962338f7c0fa067431d5", - "check": "missing-zero-check", - "impact": "Low", + "description": "TreasuryReservesVault.setBorrowToken(IERC20,address,uint256,uint256,address) (contracts/v2/TreasuryReservesVault.sol#108-127) ignores return value by _borrowTokenSet.add(address(token)) (contracts/v2/TreasuryReservesVault.sol#126)\n", + "markdown": "[TreasuryReservesVault.setBorrowToken(IERC20,address,uint256,uint256,address)](contracts/v2/TreasuryReservesVault.sol#L108-L127) ignores return value by [_borrowTokenSet.add(address(token))](contracts/v2/TreasuryReservesVault.sol#L126)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L108-L127", + "id": "5cf78f34e420dc046a400c32810667b772002358e964fa3e56b9b0a68b28a33f", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_vaultedTempleAccount", + "type": "function", + "name": "removeBorrowToken", "source_mapping": { - "start": 2726, - "length": 29, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 5248, + "length": 319, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [65], - "starting_column": 9, - "ending_column": 38 + "lines": [132, 133, 134, 135, 136, 137, 138, 139], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 2577, - "length": 838, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Vault", - "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "removeBorrowToken(IERC20)" } }, { "type": "node", - "name": "vaultedTempleAccount = _vaultedTempleAccount", + "name": "_borrowTokenSet.remove(address(token))", "source_mapping": { - "start": 3116, - "length": 44, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 5522, + "length": 38, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [74], + "lines": [138], "starting_column": 9, - "ending_column": 53 + "ending_column": 47 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "removeBorrowToken", "source_mapping": { - "start": 2577, - "length": 838, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 5248, + "length": 319, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [ - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81 - ], + "lines": [132, 133, 134, 135, 136, 137, 138, 139], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)" - } - } - } - } - ], - "description": "Vault.constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)._vaultedTempleAccount (contracts/core/Vault.sol#65) lacks a zero-check on :\n\t\t- vaultedTempleAccount = _vaultedTempleAccount (contracts/core/Vault.sol#74)\n", - "markdown": "[Vault.constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)._vaultedTempleAccount](contracts/core/Vault.sol#L65) lacks a zero-check on :\n\t\t- [vaultedTempleAccount = _vaultedTempleAccount](contracts/core/Vault.sol#L74)\n", - "first_markdown_element": "contracts/core/Vault.sol#L65", - "id": "ec8f5d8d5e84e67e63f7cfdbd240113b25d7e450ff6b895abf8718c03e3b752b", - "check": "missing-zero-check", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "variable", - "name": "_templeExposure", - "source_mapping": { - "start": 1380, - "length": 23, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", - "is_dependency": false, - "lines": [39], - "starting_column": 38, - "ending_column": 61 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "constructor", - "source_mapping": { - "start": 1347, - "length": 163, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", - "is_dependency": false, - "lines": [39, 40, 41, 42], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "VaultedTemple", - "source_mapping": { - "start": 1207, - "length": 1025, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", - "is_dependency": false, - "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(IERC20,address)" + "signature": "removeBorrowToken(IERC20)" } } } + } + ], + "description": "TreasuryReservesVault.removeBorrowToken(IERC20) (contracts/v2/TreasuryReservesVault.sol#132-139) ignores return value by _borrowTokenSet.remove(address(token)) (contracts/v2/TreasuryReservesVault.sol#138)\n", + "markdown": "[TreasuryReservesVault.removeBorrowToken(IERC20)](contracts/v2/TreasuryReservesVault.sol#L132-L139) ignores return value by [_borrowTokenSet.remove(address(token))](contracts/v2/TreasuryReservesVault.sol#L138)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L132-L139", + "id": "5474dfbc0dfd2144f1d3592aebc4e72de5fca48cbeb8ec28a4e82aa1c1ea096c", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "shutdown", + "source_mapping": { + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "shutdown(address)" + } }, { "type": "node", - "name": "templeExposure = _templeExposure", + "name": "_strategySet.remove(strategy)", "source_mapping": { - "start": 1471, - "length": 32, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", + "start": 13419, + "length": 29, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [41], + "lines": [318], "starting_column": 9, - "ending_column": 41 + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "shutdown", "source_mapping": { - "start": 1347, - "length": 163, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [39, 40, 41, 42], + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultedTemple", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1207, - "length": 1025, - "filename_relative": "contracts/core/VaultedTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", - "filename_short": "contracts/core/VaultedTemple.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(IERC20,address)" + "signature": "shutdown(address)" } } } } ], - "description": "VaultedTemple.constructor(IERC20,address)._templeExposure (contracts/core/VaultedTemple.sol#39) lacks a zero-check on :\n\t\t- templeExposure = _templeExposure (contracts/core/VaultedTemple.sol#41)\n", - "markdown": "[VaultedTemple.constructor(IERC20,address)._templeExposure](contracts/core/VaultedTemple.sol#L39) lacks a zero-check on :\n\t\t- [templeExposure = _templeExposure](contracts/core/VaultedTemple.sol#L41)\n", - "first_markdown_element": "contracts/core/VaultedTemple.sol#L39", - "id": "2fcc44b40158b30b8b0d1614ffa673ffe544de75b922fdda079eea29dca64415", - "check": "missing-zero-check", - "impact": "Low", + "description": "TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319) ignores return value by _strategySet.remove(strategy) (contracts/v2/TreasuryReservesVault.sol#318)\n", + "markdown": "[TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319) ignores return value by [_strategySet.remove(strategy)](contracts/v2/TreasuryReservesVault.sol#L318)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", + "id": "14b0ae4775bb656e93254a9232479092aea49d94c14762546af7a2b568164211", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_recipient", + "type": "function", + "name": "setIdentifierForCaller", "source_mapping": { - "start": 1683, - "length": 18, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 1968, + "length": 555, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", "is_dependency": false, - "lines": [48], - "starting_column": 34, - "ending_column": 52 + "lines": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "setRewardsRecipient", + "type": "contract", + "name": "TempleCircuitBreakerProxy", "source_mapping": { - "start": 1654, - "length": 179, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 809, + "length": 3156, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", "is_dependency": false, - "lines": [48, 49, 50, 51, 52], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuraStaking", - "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", - "is_dependency": false, - "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setRewardsRecipient(address)" + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "setIdentifierForCaller(address,string)" } }, { "type": "node", - "name": "rewardsRecipient = _recipient", + "name": "_identifiers.add(_identifier)", "source_mapping": { - "start": 1750, + "start": 2410, "length": 29, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", "is_dependency": false, - "lines": [49], + "lines": [56], "starting_column": 9, "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setRewardsRecipient", + "name": "setIdentifierForCaller", "source_mapping": { - "start": 1654, - "length": 179, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 1968, + "length": 555, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", "is_dependency": false, - "lines": [48, 49, 50, 51, 52], + "lines": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TempleCircuitBreakerProxy", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 809, + "length": 3156, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setRewardsRecipient(address)" + "signature": "setIdentifierForCaller(address,string)" } } } } ], - "description": "AuraStaking.setRewardsRecipient(address)._recipient (contracts/amo/AuraStaking.sol#48) lacks a zero-check on :\n\t\t- rewardsRecipient = _recipient (contracts/amo/AuraStaking.sol#49)\n", - "markdown": "[AuraStaking.setRewardsRecipient(address)._recipient](contracts/amo/AuraStaking.sol#L48) lacks a zero-check on :\n\t\t- [rewardsRecipient = _recipient](contracts/amo/AuraStaking.sol#L49)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L48", - "id": "5563fec2719988c18a09b1c9b98748a0700c5a09c84dd2f6ec51e7b0796b0c80", - "check": "missing-zero-check", - "impact": "Low", + "description": "TempleCircuitBreakerProxy.setIdentifierForCaller(address,string) (contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#47-59) ignores return value by _identifiers.add(_identifier) (contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#56)\n", + "markdown": "[TempleCircuitBreakerProxy.setIdentifierForCaller(address,string)](contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L47-L59) ignores return value by [_identifiers.add(_identifier)](contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L56)\n", + "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerProxy.sol#L47-L59", + "id": "e72127f3ec266630bd01282f5d373e9eadb2fa635a529f17decfa267707680e0", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_feeCollector", + "type": "function", + "name": "latestAssetBalances", "source_mapping": { - "start": 4828, - "length": 21, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5828, + "length": 565, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [113], + "lines": [ + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "latestAssetBalances()" + } + }, + { + "type": "node", + "name": "(templeTokenBalance,quoteTokenBalance) = ramos.positions()", + "source_mapping": { + "start": 5993, + "length": 77, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [148], "starting_column": 9, - "ending_column": 30 + "ending_column": 86 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "latestAssetBalances", "source_mapping": { - "start": 4516, - "length": 995, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5828, + "length": 565, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129 - ], + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "RamosStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)" + "signature": "latestAssetBalances()" } } } + } + ], + "description": "RamosStrategy.latestAssetBalances() (contracts/v2/strategies/RamosStrategy.sol#144-159) ignores return value by (templeTokenBalance,quoteTokenBalance) = ramos.positions() (contracts/v2/strategies/RamosStrategy.sol#148)\n", + "markdown": "[RamosStrategy.latestAssetBalances()](contracts/v2/strategies/RamosStrategy.sol#L144-L159) ignores return value by [(templeTokenBalance,quoteTokenBalance) = ramos.positions()](contracts/v2/strategies/RamosStrategy.sol#L148)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L144-L159", + "id": "420dcd2cbb24da1b9ab2dafe842594bf844fae670bc85fc21d1d3835c68dd336", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "proportionalAddLiquidityQuote", + "source_mapping": { + "start": 6570, + "length": 393, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "proportionalAddLiquidityQuote(uint256,uint256)" + } }, { "type": "node", - "name": "feeCollector = _feeCollector", + "name": "ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps)", "source_mapping": { - "start": 5309, - "length": 28, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 6868, + "length": 88, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [123], + "lines": [174], "starting_column": 9, - "ending_column": 37 + "ending_column": 97 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "proportionalAddLiquidityQuote", "source_mapping": { - "start": 4516, - "length": 995, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 6570, + "length": 393, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [ - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129 - ], + "lines": [165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "RamosStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)" + "signature": "proportionalAddLiquidityQuote(uint256,uint256)" } } } } ], - "description": "Ramos.constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)._feeCollector (contracts/amo/Ramos.sol#113) lacks a zero-check on :\n\t\t- feeCollector = _feeCollector (contracts/amo/Ramos.sol#123)\n", - "markdown": "[Ramos.constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)._feeCollector](contracts/amo/Ramos.sol#L113) lacks a zero-check on :\n\t\t- [feeCollector = _feeCollector](contracts/amo/Ramos.sol#L123)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L113", - "id": "d859e385f8bd8eca35f31a74169347836938cb1a82d4c8321f358ad5363d6ed4", - "check": "missing-zero-check", - "impact": "Low", + "description": "RamosStrategy.proportionalAddLiquidityQuote(uint256,uint256) (contracts/v2/strategies/RamosStrategy.sol#165-175) ignores return value by ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps) (contracts/v2/strategies/RamosStrategy.sol#174)\n", + "markdown": "[RamosStrategy.proportionalAddLiquidityQuote(uint256,uint256)](contracts/v2/strategies/RamosStrategy.sol#L165-L175) ignores return value by [ramos.poolHelper().proportionalAddLiquidityQuote(_quoteTokenAmount,_slippageBps)](contracts/v2/strategies/RamosStrategy.sol#L174)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L165-L175", + "id": "b56d2f4548e025710d998bc242ac7f3032f0e8ea504c62f800fead5160f65786", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_amo", + "type": "function", + "name": "proportionalRemoveLiquidityQuote", "source_mapping": { - "start": 1614, - "length": 12, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 7588, + "length": 438, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [41], - "starting_column": 7, - "ending_column": 19 + "lines": [192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "RamosStrategy", "source_mapping": { - "start": 1451, - "length": 622, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "BalancerPoolHelper", - "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(address,address,address,address,address,address,uint64,bytes32)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" } }, { "type": "node", - "name": "amo = _amo", + "name": "ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps)", "source_mapping": { - "start": 1988, - "length": 10, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 7935, + "length": 84, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [51], - "starting_column": 7, - "ending_column": 17 + "lines": [202], + "starting_column": 9, + "ending_column": 93 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "proportionalRemoveLiquidityQuote", "source_mapping": { - "start": 1451, - "length": 622, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 7588, + "length": 438, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53 + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203 ], "starting_column": 5, "ending_column": 6 @@ -12883,163 +13087,135 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "BalancerPoolHelper", + "name": "RamosStrategy", "source_mapping": { - "start": 739, - "length": 19014, - "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", - "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,address,address,address,address,uint64,bytes32)" + "signature": "proportionalRemoveLiquidityQuote(uint256,uint256)" } } } } ], - "description": "BalancerPoolHelper.constructor(address,address,address,address,address,address,uint64,bytes32)._amo (contracts/amo/helpers/BalancerPoolHelper.sol#41) lacks a zero-check on :\n\t\t- amo = _amo (contracts/amo/helpers/BalancerPoolHelper.sol#51)\n", - "markdown": "[BalancerPoolHelper.constructor(address,address,address,address,address,address,uint64,bytes32)._amo](contracts/amo/helpers/BalancerPoolHelper.sol#L41) lacks a zero-check on :\n\t\t- [amo = _amo](contracts/amo/helpers/BalancerPoolHelper.sol#L51)\n", - "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L41", - "id": "1a4d31b221d02b3c425c477d2b7e4c6dc1e41557697509c8e152170c2f1f7986", - "check": "missing-zero-check", - "impact": "Low", + "description": "RamosStrategy.proportionalRemoveLiquidityQuote(uint256,uint256) (contracts/v2/strategies/RamosStrategy.sol#192-203) ignores return value by ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps) (contracts/v2/strategies/RamosStrategy.sol#202)\n", + "markdown": "[RamosStrategy.proportionalRemoveLiquidityQuote(uint256,uint256)](contracts/v2/strategies/RamosStrategy.sol#L192-L203) ignores return value by [ramos.poolHelper().proportionalRemoveLiquidityQuote(_bptAmount,_slippageBps)](contracts/v2/strategies/RamosStrategy.sol#L202)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L192-L203", + "id": "ed71e6585e1914cd70e3ed747dea0a932bd4ba9629191c626628ce16c695c11d", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_fundsOwner", + "type": "function", + "name": "populateShutdownData", "source_mapping": { - "start": 3146, - "length": 19, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 9023, + "length": 564, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [72], - "starting_column": 9, - "ending_column": 28 + "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "RamosStrategy", "source_mapping": { - "start": 3062, - "length": 1137, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OtcOffer", - "source_mapping": { - "start": 844, - "length": 6488, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", - "is_dependency": false, - "lines": [ - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "populateShutdownData(bytes)" } }, { "type": "node", - "name": "fundsOwner = _fundsOwner", + "name": "(shutdownParams.bptAmount,None,None) = ramos.positions()", "source_mapping": { - "start": 3461, - "length": 24, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 9350, + "length": 48, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [80], + "lines": [240], "starting_column": 9, - "ending_column": 33 + "ending_column": 57 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "populateShutdownData", "source_mapping": { - "start": 3062, - "length": 1137, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 9023, + "length": 564, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243 ], "starting_column": 5, "ending_column": 6 @@ -13047,503 +13223,578 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OtcOffer", + "name": "RamosStrategy", "source_mapping": { - "start": 844, - "length": 6488, - "filename_relative": "contracts/core/OtcOffer.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", - "filename_short": "contracts/core/OtcOffer.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)" + "signature": "populateShutdownData(bytes)" } } } } ], - "description": "OtcOffer.constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)._fundsOwner (contracts/core/OtcOffer.sol#72) lacks a zero-check on :\n\t\t- fundsOwner = _fundsOwner (contracts/core/OtcOffer.sol#80)\n", - "markdown": "[OtcOffer.constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)._fundsOwner](contracts/core/OtcOffer.sol#L72) lacks a zero-check on :\n\t\t- [fundsOwner = _fundsOwner](contracts/core/OtcOffer.sol#L80)\n", - "first_markdown_element": "contracts/core/OtcOffer.sol#L72", - "id": "318c72045beea63d39db91e2c64959d93dbfe0e966ec4e74e6cbf32f20a24e68", - "check": "missing-zero-check", - "impact": "Low", + "description": "RamosStrategy.populateShutdownData(bytes) (contracts/v2/strategies/RamosStrategy.sol#232-243) ignores return value by (shutdownParams.bptAmount,None,None) = ramos.positions() (contracts/v2/strategies/RamosStrategy.sol#240)\n", + "markdown": "[RamosStrategy.populateShutdownData(bytes)](contracts/v2/strategies/RamosStrategy.sol#L232-L243) ignores return value by [(shutdownParams.bptAmount,None,None) = ramos.positions()](contracts/v2/strategies/RamosStrategy.sol#L240)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L232-L243", + "id": "e68b668794a623b6a5a283b3672d9ddf56508b69062c77c9f4af7f0faf1aa51e", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "variable", - "name": "_gnosisSafeWallet", + "type": "function", + "name": "_doShutdown", "source_mapping": { - "start": 1642, - "length": 25, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 9819, + "length": 631, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [41], - "starting_column": 9, - "ending_column": 34 + "lines": [ + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "constructor", + "type": "contract", + "name": "RamosStrategy", "source_mapping": { - "start": 1477, - "length": 459, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "GnosisStrategy", - "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "constructor(address,address,string,address,address,address)" + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "_doShutdown(bytes)" } }, { "type": "node", - "name": "gnosisSafeWallet = _gnosisSafeWallet", + "name": "ramos.removeLiquidity(params.requestData,params.bptAmount)", "source_mapping": { - "start": 1813, - "length": 36, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 9990, + "length": 59, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [44], + "lines": [252], "starting_column": 9, - "ending_column": 45 + "ending_column": 68 }, "type_specific_fields": { "parent": { "type": "function", - "name": "constructor", + "name": "_doShutdown", "source_mapping": { - "start": 1477, - "length": 459, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 9819, + "length": 631, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], + "lines": [ + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "RamosStrategy", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "constructor(address,address,string,address,address,address)" + "signature": "_doShutdown(bytes)" } } } } ], - "description": "GnosisStrategy.constructor(address,address,string,address,address,address)._gnosisSafeWallet (contracts/v2/strategies/GnosisStrategy.sol#41) lacks a zero-check on :\n\t\t- gnosisSafeWallet = _gnosisSafeWallet (contracts/v2/strategies/GnosisStrategy.sol#44)\n", - "markdown": "[GnosisStrategy.constructor(address,address,string,address,address,address)._gnosisSafeWallet](contracts/v2/strategies/GnosisStrategy.sol#L41) lacks a zero-check on :\n\t\t- [gnosisSafeWallet = _gnosisSafeWallet](contracts/v2/strategies/GnosisStrategy.sol#L44)\n", - "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L41", - "id": "35341096e7cc1cb2d71fe6962d37434197ec4866db8dda0c2c8cd05c17585e33", - "check": "missing-zero-check", - "impact": "Low", + "description": "RamosStrategy._doShutdown(bytes) (contracts/v2/strategies/RamosStrategy.sol#250-263) ignores return value by ramos.removeLiquidity(params.requestData,params.bptAmount) (contracts/v2/strategies/RamosStrategy.sol#252)\n", + "markdown": "[RamosStrategy._doShutdown(bytes)](contracts/v2/strategies/RamosStrategy.sol#L250-L263) ignores return value by [ramos.removeLiquidity(params.requestData,params.bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L252)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L250-L263", + "id": "cab4a6d607fc52a73a76b47684750061e88667af7fd3a9cc5e85e235479031b6", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "addRevenue", + "name": "_daiDeposit", "source_mapping": { - "start": 3635, - "length": 351, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [110, 111, 112, 113, 114, 115, 116], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "addRevenue(IERC20[],uint256[])" + "signature": "_daiDeposit(uint256)" } }, { "type": "node", - "name": "pools[exposureTokens[i]].addRevenue(amounts[i])", + "name": "usdsVaultToken.deposit(daiAmount,address(this))", "source_mapping": { - "start": 3922, - "length": 47, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7561, + "length": 48, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [114], - "starting_column": 13, - "ending_column": 60 + "lines": [179], + "starting_column": 9, + "ending_column": 57 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addRevenue", + "name": "_daiDeposit", "source_mapping": { - "start": 3635, - "length": 351, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [110, 111, 112, 113, 114, 115, 116], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "addRevenue(IERC20[],uint256[])" + "signature": "_daiDeposit(uint256)" } } } } ], - "description": "OpsManager.addRevenue(IERC20[],uint256[]) (contracts/core/OpsManager.sol#110-116) has external calls inside a loop: pools[exposureTokens[i]].addRevenue(amounts[i]) (contracts/core/OpsManager.sol#114)\n", - "markdown": "[OpsManager.addRevenue(IERC20[],uint256[])](contracts/core/OpsManager.sol#L110-L116) has external calls inside a loop: [pools[exposureTokens[i]].addRevenue(amounts[i])](contracts/core/OpsManager.sol#L114)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L110-L116", - "id": "5665a1327173172c99a94790114d41a7287eb453518635edd48056ecba261fa4", - "check": "calls-loop", - "impact": "Low", + "description": "SkyFarmBaseStrategy._daiDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#174-181) ignores return value by usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n", + "markdown": "[SkyFarmBaseStrategy._daiDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181) ignores return value by [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181", + "id": "ea9126415afb92b6102d0261a6660453a9520881293e71bebe5637779b0ae002", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "increaseVaultTemple", + "name": "_daiWithdrawal", "source_mapping": { - "start": 4415, - "length": 447, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [130, 131, 132, 133, 134, 135, 136, 137], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 - ], - "starting_column": 1, - "ending_column": 2 - } + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } }, - "signature": "increaseVaultTemple(Vault[],uint256[])" + "signature": "_daiWithdrawal(uint256)" } }, { "type": "node", - "name": "templeExposure.mint(address(vaults[i]),amountsTemple[i])", + "name": "usdsVaultToken.withdraw(daiAmount,address(this),address(this))", "source_mapping": { - "start": 4788, - "length": 57, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7770, + "length": 64, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [135], - "starting_column": 13, - "ending_column": 70 + "lines": [185], + "starting_column": 9, + "ending_column": 73 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseVaultTemple", + "name": "_daiWithdrawal", "source_mapping": { - "start": 4415, - "length": 447, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [130, 131, 132, 133, 134, 135, 136, 137], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "increaseVaultTemple(Vault[],uint256[])" + "signature": "_daiWithdrawal(uint256)" } } } } ], - "description": "OpsManager.increaseVaultTemple(Vault[],uint256[]) (contracts/core/OpsManager.sol#130-137) has external calls inside a loop: templeExposure.mint(address(vaults[i]),amountsTemple[i]) (contracts/core/OpsManager.sol#135)\n", - "markdown": "[OpsManager.increaseVaultTemple(Vault[],uint256[])](contracts/core/OpsManager.sol#L130-L137) has external calls inside a loop: [templeExposure.mint(address(vaults[i]),amountsTemple[i])](contracts/core/OpsManager.sol#L135)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L130-L137", - "id": "73ad477fce052d6df52f4050312b09c115d39ab6a4163386fdb2d902cdf8d2a5", - "check": "calls-loop", - "impact": "Low", + "description": "SkyFarmBaseStrategy._daiWithdrawal(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#183-190) ignores return value by usdsVaultToken.withdraw(daiAmount,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#185)\n", + "markdown": "[SkyFarmBaseStrategy._daiWithdrawal(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190) ignores return value by [usdsVaultToken.withdraw(daiAmount,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L185)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190", + "id": "2de15280b0ab705cd46bf60f4b904143d6ecd4c5990bda6a4c2118aeceaec88e", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "liquidateExposures", + "name": "setTlcStrategy", "source_mapping": { - "start": 5058, - "length": 531, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155], + "lines": [ + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "liquidateExposures(Vault[],IERC20[])" + "signature": "setTlcStrategy(address)" } }, { "type": "node", - "name": "exposures[i] = pools[exposureTokens[i]].exposure()", + "name": "daiToken.approve(previousTrv,0)", "source_mapping": { - "start": 5314, - "length": 50, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 16064, + "length": 32, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [148], + "lines": [394], "starting_column": 13, - "ending_column": 63 + "ending_column": 45 }, "type_specific_fields": { "parent": { "type": "function", - "name": "liquidateExposures", + "name": "setTlcStrategy", "source_mapping": { - "start": 5058, - "length": 531, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155 + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 ], "starting_column": 5, "ending_column": 6 @@ -13551,122 +13802,187 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "liquidateExposures(Vault[],IERC20[])" + "signature": "setTlcStrategy(address)" } } } } ], - "description": "OpsManager.liquidateExposures(Vault[],IERC20[]) (contracts/core/OpsManager.sol#144-155) has external calls inside a loop: exposures[i] = pools[exposureTokens[i]].exposure() (contracts/core/OpsManager.sol#148)\n", - "markdown": "[OpsManager.liquidateExposures(Vault[],IERC20[])](contracts/core/OpsManager.sol#L144-L155) has external calls inside a loop: [exposures[i] = pools[exposureTokens[i]].exposure()](contracts/core/OpsManager.sol#L148)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L144-L155", - "id": "ead7d436da8a29569022b48ffddbfceb808c4dd315ce7ca9d743dc5226a168dc", - "check": "calls-loop", - "impact": "Low", + "description": "TempleLineOfCredit.setTlcStrategy(address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#386-409) ignores return value by daiToken.approve(previousTrv,0) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#394)\n", + "markdown": "[TempleLineOfCredit.setTlcStrategy(address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409) ignores return value by [daiToken.approve(previousTrv,0)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L394)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409", + "id": "5fa79b657e0f64d022302a3a9b887d1ab1e0a67d8ba497e49c5d707e4f4d8bb3", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "liquidateExposures", + "name": "_addLiquidity", "source_mapping": { - "start": 5058, - "length": 531, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1776, + "length": 1076, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155], + "lines": [ + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "liquidateExposures(Vault[],IERC20[])" + "signature": "_addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)" } }, { "type": "node", - "name": "vaults[i_scope_0].redeemExposures(exposures)", + "name": "(reserveA,reserveB) = pair.getReserves()", "source_mapping": { - "start": 5536, - "length": 36, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 2006, + "length": 52, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [153], - "starting_column": 13, - "ending_column": 49 + "lines": [68], + "starting_column": 9, + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "liquidateExposures", + "name": "_addLiquidity", "source_mapping": { - "start": 5058, - "length": 531, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1776, + "length": 1076, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155 + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83 ], "starting_column": 5, "ending_column": 6 @@ -13674,177 +13990,195 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "liquidateExposures(Vault[],IERC20[])" + "signature": "_addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)" } } } } ], - "description": "OpsManager.liquidateExposures(Vault[],IERC20[]) (contracts/core/OpsManager.sol#144-155) has external calls inside a loop: vaults[i_scope_0].redeemExposures(exposures) (contracts/core/OpsManager.sol#153)\n", - "markdown": "[OpsManager.liquidateExposures(Vault[],IERC20[])](contracts/core/OpsManager.sol#L144-L155) has external calls inside a loop: [vaults[i_scope_0].redeemExposures(exposures)](contracts/core/OpsManager.sol#L153)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L144-L155", - "id": "03a21ffca7a3586cab7fab91c4d3c7df01b444412ef9a937d63e8d95d7ef5075", - "check": "calls-loop", - "impact": "Low", + "description": "TempleStableAMMRouter._addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair) (contracts/amm/TempleStableAMMRouter.sol#61-83) ignores return value by (reserveA,reserveB) = pair.getReserves() (contracts/amm/TempleStableAMMRouter.sol#68)\n", + "markdown": "[TempleStableAMMRouter._addLiquidity(uint256,uint256,uint256,uint256,IUniswapV2Pair)](contracts/amm/TempleStableAMMRouter.sol#L61-L83) ignores return value by [(reserveA,reserveB) = pair.getReserves()](contracts/amm/TempleStableAMMRouter.sol#L68)\n", + "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L61-L83", + "id": "f24551aba47520a07ab79471d9ec9cfe2fe87cd09c197da35e42997dcded68a8", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "requiresRebalance", + "name": "swapExactStableForTempleQuote", "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 - ], + "start": 7571, + "length": 271, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", + "is_dependency": false, + "lines": [202, 203, 204, 205], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + "signature": "swapExactStableForTempleQuote(address,uint256)" } }, { "type": "node", - "name": "(inWindow) = vaults[i].inEnterExitWindow()", + "name": "(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()", "source_mapping": { - "start": 3101, - "length": 49, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 7687, + "length": 76, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [86], - "starting_column": 13, - "ending_column": 62 + "lines": [203], + "starting_column": 9, + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "requiresRebalance", + "name": "swapExactStableForTempleQuote", "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 7571, + "length": 271, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95 - ], + "lines": [202, 203, 204, 205], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + "signature": "swapExactStableForTempleQuote(address,uint256)" } } } } ], - "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) has external calls inside a loop: (inWindow) = vaults[i].inEnterExitWindow() (contracts/core/OpsManagerLib.sol#86)\n", - "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) has external calls inside a loop: [(inWindow) = vaults[i].inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L86)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", - "id": "33abe3219d901465ec0025ed3b5cee25a23e8e043748dac853f60e352579796c", - "check": "calls-loop", - "impact": "Low", + "description": "TempleStableAMMRouter.swapExactStableForTempleQuote(address,uint256) (contracts/amm/TempleStableAMMRouter.sol#202-205) ignores return value by (reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves() (contracts/amm/TempleStableAMMRouter.sol#203)\n", + "markdown": "[TempleStableAMMRouter.swapExactStableForTempleQuote(address,uint256)](contracts/amm/TempleStableAMMRouter.sol#L202-L205) ignores return value by [(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()](contracts/amm/TempleStableAMMRouter.sol#L203)\n", + "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L202-L205", + "id": "bcaddbd83baa19b08f21d46eaa6d5040ec3da28323505b65de50fbfbd874521c", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "requiresRebalance", + "name": "swapExactTempleForStableQuote", "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 7848, + "length": 639, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221 ], "starting_column": 5, "ending_column": 6 @@ -13852,58 +14186,67 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + "signature": "swapExactTempleForStableQuote(address,uint256)" } }, { "type": "node", - "name": "requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare()", + "name": "(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()", "source_mapping": { - "start": 3233, - "length": 92, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 7982, + "length": 76, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [91], - "starting_column": 13, - "ending_column": 105 + "lines": [208], + "starting_column": 9, + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "requiresRebalance", + "name": "swapExactTempleForStableQuote", "source_mapping": { - "start": 2821, - "length": 553, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 7848, + "length": 639, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95 + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221 ], "starting_column": 5, "ending_column": 6 @@ -13911,56 +14254,66 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + "signature": "swapExactTempleForStableQuote(address,uint256)" } } } } ], - "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) has external calls inside a loop: requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare() (contracts/core/OpsManagerLib.sol#91)\n", - "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) has external calls inside a loop: [requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare()](contracts/core/OpsManagerLib.sol#L91)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", - "id": "291eba1d32cb690e10f4480f7b32b2bae6d005ffbf40558ffd08cf8b0ce6ee4d", - "check": "calls-loop", - "impact": "Low", + "description": "TempleStableAMMRouter.swapExactTempleForStableQuote(address,uint256) (contracts/amm/TempleStableAMMRouter.sol#207-221) ignores return value by (reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves() (contracts/amm/TempleStableAMMRouter.sol#208)\n", + "markdown": "[TempleStableAMMRouter.swapExactTempleForStableQuote(address,uint256)](contracts/amm/TempleStableAMMRouter.sol#L207-L221) ignores return value by [(reserveTemple,reserveFrax) = IUniswapV2Pair(pair).getReserves()](contracts/amm/TempleStableAMMRouter.sol#L208)\n", + "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L207-L221", + "id": "43ba957c0d22f3540a298f9bbbe3e7ef022879a661282996ee551c7d780c6394", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "updateExposureReval", + "name": "rebalance", "source_mapping": { - "start": 3380, - "length": 681, + "start": 1808, + "length": 798, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72 ], "starting_column": 5, "ending_column": 6 @@ -13989,36 +14342,37 @@ "ending_column": 0 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "rebalance(Vault,TreasuryFarmingRevenue)" } }, { "type": "node", - "name": "exposure = pools[exposureTokens[i]].exposure()", + "name": "(inWindow) = vault.inEnterExitWindow()", "source_mapping": { - "start": 3725, - "length": 55, + "start": 1916, + "length": 45, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [101], - "starting_column": 13, - "ending_column": 68 + "lines": [59], + "starting_column": 9, + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "updateExposureReval", + "name": "rebalance", "source_mapping": { - "start": 3380, - "length": 681, + "start": 1808, + "length": 798, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72 ], "starting_column": 5, "ending_column": 6 @@ -14048,34 +14402,34 @@ "ending_column": 0 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "rebalance(Vault,TreasuryFarmingRevenue)" } } } } ], - "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure = pools[exposureTokens[i]].exposure() (contracts/core/OpsManagerLib.sol#101)\n", - "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure = pools[exposureTokens[i]].exposure()](contracts/core/OpsManagerLib.sol#L101)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", - "id": "29cef7ed2793cf3d146be2fdec55418a2cdf263801d54510013749346bac88f3", - "check": "calls-loop", - "impact": "Low", + "description": "OpsManagerLib.rebalance(Vault,TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#55-72) ignores return value by (inWindow) = vault.inEnterExitWindow() (contracts/core/OpsManagerLib.sol#59)\n", + "markdown": "[OpsManagerLib.rebalance(Vault,TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L55-L72) ignores return value by [(inWindow) = vault.inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L59)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L55-L72", + "id": "7e51402c4c3f903960137b695ab80a5a95e96c56eb93a4b7d980470911d0bde6", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "updateExposureReval", + "name": "requiresRebalance", "source_mapping": { - "start": 3380, - "length": 681, + "start": 2821, + "length": 553, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 ], "starting_column": 5, "ending_column": 6 @@ -14104,36 +14458,37 @@ "ending_column": 0 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" } }, { "type": "node", - "name": "currentReval = exposure.reval()", + "name": "(inWindow) = vaults[i].inEnterExitWindow()", "source_mapping": { - "start": 3794, - "length": 39, + "start": 3101, + "length": 49, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [102], + "lines": [86], "starting_column": 13, - "ending_column": 52 + "ending_column": 62 }, "type_specific_fields": { "parent": { "type": "function", - "name": "updateExposureReval", + "name": "requiresRebalance", "source_mapping": { - "start": 3380, - "length": 681, + "start": 2821, + "length": 553, "filename_relative": "contracts/core/OpsManagerLib.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95 ], "starting_column": 5, "ending_column": 6 @@ -14163,34 +14518,35 @@ "ending_column": 0 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" } } } } ], - "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: currentReval = exposure.reval() (contracts/core/OpsManagerLib.sol#102)\n", - "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [currentReval = exposure.reval()](contracts/core/OpsManagerLib.sol#L102)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", - "id": "4b9ed20c5dffb0bb937e8e35bc5da6f0e0de33bda4b92ca4b5f843554466cbbc", - "check": "calls-loop", - "impact": "Low", + "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) ignores return value by (inWindow) = vaults[i].inEnterExitWindow() (contracts/core/OpsManagerLib.sol#86)\n", + "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) ignores return value by [(inWindow) = vaults[i].inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L86)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", + "id": "0d939f6443be831bd662e4b85b8b26b8ca9716b8fd984c5961f3bbf84c6a1301", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "updateExposureReval", + "name": "relayedSetEndorsementsFor", "source_mapping": { - "start": 3380, - "length": 681, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 3547, + "length": 759, + "filename_relative": "contracts/governance/ElderElection.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", + "filename_short": "contracts/governance/ElderElection.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129 ], "starting_column": 5, "ending_column": 6 @@ -14198,57 +14554,62 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "ElderElection", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 906, + "length": 4629, + "filename_relative": "contracts/governance/ElderElection.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", + "filename_short": "contracts/governance/ElderElection.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)" } }, { "type": "node", - "name": "exposure.decreaseReval(currentReval - revals[i])", + "name": "(signer,err) = ECDSA.tryRecover(digest,signature)", "source_mapping": { - "start": 3895, - "length": 48, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 3799, + "length": 79, + "filename_relative": "contracts/governance/ElderElection.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", + "filename_short": "contracts/governance/ElderElection.sol", "is_dependency": false, - "lines": [104], - "starting_column": 17, - "ending_column": 65 + "lines": [120], + "starting_column": 9, + "ending_column": 88 }, "type_specific_fields": { "parent": { "type": "function", - "name": "updateExposureReval", + "name": "relayedSetEndorsementsFor", "source_mapping": { - "start": 3380, - "length": 681, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 3547, + "length": 759, + "filename_relative": "contracts/governance/ElderElection.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", + "filename_short": "contracts/governance/ElderElection.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129 ], "starting_column": 5, "ending_column": 6 @@ -14256,56 +14617,62 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "ElderElection", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 906, + "length": 4629, + "filename_relative": "contracts/governance/ElderElection.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/governance/ElderElection.sol", + "filename_short": "contracts/governance/ElderElection.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)" } } } } ], - "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure.decreaseReval(currentReval - revals[i]) (contracts/core/OpsManagerLib.sol#104)\n", - "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure.decreaseReval(currentReval - revals[i])](contracts/core/OpsManagerLib.sol#L104)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", - "id": "2a8d232e2a9bf6e56bf39af5ffd6e5e36613e5a9aa77a6691551c45c0092abf8", - "check": "calls-loop", - "impact": "Low", + "description": "ElderElection.relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes) (contracts/governance/ElderElection.sol#112-129) ignores return value by (signer,err) = ECDSA.tryRecover(digest,signature) (contracts/governance/ElderElection.sol#120)\n", + "markdown": "[ElderElection.relayedSetEndorsementsFor(ElderElection.EndorsementReq,bytes)](contracts/governance/ElderElection.sol#L112-L129) ignores return value by [(signer,err) = ECDSA.tryRecover(digest,signature)](contracts/governance/ElderElection.sol#L120)\n", + "first_markdown_element": "contracts/governance/ElderElection.sol#L112-L129", + "id": "9b64f931f815683d4712a17416d4cf6183b989dbcbcf6cf13a099a9bb82f7fbd", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "updateExposureReval", + "name": "_burnAndNotify", "source_mapping": { - "start": 3380, - "length": 681, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -14313,57 +14680,88 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "SpiceAuction", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" - } - }, - { - "type": "node", - "name": "exposure.increaseReval(revals[i] - currentReval)", - "source_mapping": { - "start": 3982, - "length": 48, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_burnAndNotify(uint256,address,bool)" + } + }, + { + "type": "node", + "name": "ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this)))", + "source_mapping": { + "start": 22546, + "length": 92, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [106], - "starting_column": 17, - "ending_column": 65 + "lines": [477], + "starting_column": 13, + "ending_column": 105 }, "type_specific_fields": { "parent": { "type": "function", - "name": "updateExposureReval", + "name": "_burnAndNotify", "source_mapping": { - "start": 3380, - "length": 681, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 ], "starting_column": 5, "ending_column": 6 @@ -14371,68 +14769,103 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManagerLib", + "name": "SpiceAuction", "source_mapping": { - "start": 158, - "length": 3905, - "filename_relative": "contracts/core/OpsManagerLib.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", - "filename_short": "contracts/core/OpsManagerLib.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + "signature": "_burnAndNotify(uint256,address,bool)" } } } } ], - "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure.increaseReval(revals[i] - currentReval) (contracts/core/OpsManagerLib.sol#106)\n", - "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure.increaseReval(revals[i] - currentReval)](contracts/core/OpsManagerLib.sol#L106)\n", - "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", - "id": "02b2b95f67586f3365a9cc8e6b95fd4d48a424694b15f84a5b362f195ca5b007", - "check": "calls-loop", - "impact": "Low", + "description": "SpiceAuction._burnAndNotify(uint256,address,bool) (contracts/templegold/SpiceAuction.sol#451-486) ignores return value by ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this))) (contracts/templegold/SpiceAuction.sol#477)\n", + "markdown": "[SpiceAuction._burnAndNotify(uint256,address,bool)](contracts/templegold/SpiceAuction.sol#L451-L486) ignores return value by [ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(address(this)))](contracts/templegold/SpiceAuction.sol#L477)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L451-L486", + "id": "cfdba6b0952d4214b0ecb15b6d1accfe1283c067df6e82e7cd2d6aff19350777", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "redeemExposures", + "name": "_burnAndNotify", "source_mapping": { - "start": 4673, - "length": 251, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [113, 114, 115, 116, 117, 118, 119], + "lines": [ + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "SpiceAuction", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, @@ -14448,54 +14881,80 @@ 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "redeemExposures(Exposure[])" + "signature": "_burnAndNotify(uint256,address,bool)" } }, { "type": "node", - "name": "exposures[i].redeem()", + "name": "ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender))", "source_mapping": { - "start": 4817, - "length": 21, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 22669, + "length": 89, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [115], + "lines": [479], "starting_column": 13, - "ending_column": 34 + "ending_column": 102 }, "type_specific_fields": { "parent": { "type": "function", - "name": "redeemExposures", + "name": "_burnAndNotify", "source_mapping": { - "start": 4673, - "length": 251, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [113, 114, 115, 116, 117, 118, 119], + "lines": [ + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "SpiceAuction", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, @@ -14512,120 +14971,93 @@ 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "redeemExposures(Exposure[])" + "signature": "_burnAndNotify(uint256,address,bool)" } } } } ], - "description": "Vault.redeemExposures(Exposure[]) (contracts/core/Vault.sol#113-119) has external calls inside a loop: exposures[i].redeem() (contracts/core/Vault.sol#115)\n", - "markdown": "[Vault.redeemExposures(Exposure[])](contracts/core/Vault.sol#L113-L119) has external calls inside a loop: [exposures[i].redeem()](contracts/core/Vault.sol#L115)\n", - "first_markdown_element": "contracts/core/Vault.sol#L113-L119", - "id": "01aa5d049bc48e72ff906b543385ff9caecb8e5566910551f607713f18675e33", - "check": "calls-loop", - "impact": "Low", + "description": "SpiceAuction._burnAndNotify(uint256,address,bool) (contracts/templegold/SpiceAuction.sol#451-486) ignores return value by ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender)) (contracts/templegold/SpiceAuction.sol#479)\n", + "markdown": "[SpiceAuction._burnAndNotify(uint256,address,bool)](contracts/templegold/SpiceAuction.sol#L451-L486) ignores return value by [ITempleGold(templeGold).send{value: fee.nativeFee}(sendParam,fee,address(msg.sender))](contracts/templegold/SpiceAuction.sol#L479)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L451-L486", + "id": "600ab327a68f46526e2cec4f8b04c9576375f10b10d819bf0572893f89232b20", + "check": "unused-return", + "impact": "Medium", "confidence": "Medium" }, { "elements": [ { - "type": "function", - "name": "getReward", - "source_mapping": { - "start": 4291, - "length": 657, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", - "is_dependency": false, - "lines": [ - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuraStaking", - "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", - "is_dependency": false, - "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "getReward(bool)" - } - }, - { - "type": "node", - "name": "balance = rewardToken.balanceOf(address(this))", + "type": "variable", + "name": "quoteToken", "source_mapping": { - "start": 4735, - "length": 54, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 4822, + "length": 18, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [118], - "starting_column": 17, - "ending_column": 71 + "lines": [103], + "starting_column": 9, + "ending_column": 27 }, "type_specific_fields": { "parent": { "type": "function", - "name": "getReward", + "name": "maxRebalanceAmounts", "source_mapping": { - "start": 4291, - "length": 657, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 4738, + "length": 140, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [ - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125 - ], + "lines": [101, 102, 103, 104, 105], "starting_column": 5, - "ending_column": 6 + "ending_column": 7 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "IRamos", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 1408, + "length": 10519, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, @@ -14635,568 +15067,401 @@ 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "getReward(bool)" + "signature": "maxRebalanceAmounts()" } } } - } - ], - "description": "AuraStaking.getReward(bool) (contracts/amo/AuraStaking.sol#110-125) has external calls inside a loop: balance = rewardToken.balanceOf(address(this)) (contracts/amo/AuraStaking.sol#118)\n", - "markdown": "[AuraStaking.getReward(bool)](contracts/amo/AuraStaking.sol#L110-L125) has external calls inside a loop: [balance = rewardToken.balanceOf(address(this))](contracts/amo/AuraStaking.sol#L118)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L110-L125", - "id": "dab641382da7356da589d9f335e183a99e5e9d0e41793c5d48158d07f1c57272", - "check": "calls-loop", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + }, { "type": "function", - "name": "shutdown", + "name": "quoteToken", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 3767, + "length": 53, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [80], "starting_column": 5, - "ending_column": 6 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "IRamos", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1408, + "length": 10519, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "shutdown(address)" + "signature": "quoteToken()" } - }, + } + ], + "description": "IRamos.maxRebalanceAmounts().quoteToken (contracts/interfaces/amo/IRamos.sol#103) shadows:\n\t- IRamos.quoteToken() (contracts/interfaces/amo/IRamos.sol#80) (function)\n", + "markdown": "[IRamos.maxRebalanceAmounts().quoteToken](contracts/interfaces/amo/IRamos.sol#L103) shadows:\n\t- [IRamos.quoteToken()](contracts/interfaces/amo/IRamos.sol#L80) (function)\n", + "first_markdown_element": "contracts/interfaces/amo/IRamos.sol#L103", + "id": "a030cfdb07ff13cdfeb8487608a714d3b198ff28886a8ef272f9e70a87a70f0a", + "check": "shadowing-local", + "impact": "Low", + "confidence": "High" + }, + { + "elements": [ { - "type": "node", - "name": "_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)", + "type": "variable", + "name": "protocolToken", "source_mapping": { - "start": 12499, - "length": 64, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 4850, + "length": 21, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [296], - "starting_column": 13, - "ending_column": 77 + "lines": [104], + "starting_column": 9, + "ending_column": 30 }, "type_specific_fields": { "parent": { "type": "function", - "name": "shutdown", + "name": "maxRebalanceAmounts", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 4738, + "length": 140, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [101, 102, 103, 104, 105], "starting_column": 5, - "ending_column": 6 + "ending_column": 7 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "IRamos", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1408, + "length": 10519, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "shutdown(address)" + "signature": "maxRebalanceAmounts()" } } } - } - ], - "description": "TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319) has external calls inside a loop: _outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy) (contracts/v2/TreasuryReservesVault.sol#296)\n", - "markdown": "[TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319) has external calls inside a loop: [_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)](contracts/v2/TreasuryReservesVault.sol#L296)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", - "id": "319ffc2aa8a4b776f15de07870a0d4d5abe0125bc3d87d10222a70895adf8bba", - "check": "calls-loop", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + }, { "type": "function", - "name": "strategyBalanceSheet", + "name": "protocolToken", "source_mapping": { - "start": 19539, - "length": 1196, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 3567, + "length": 56, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, - "lines": [ - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467 - ], + "lines": [76], "starting_column": 5, - "ending_column": 6 + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "IRamos", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1408, + "length": 10519, + "filename_relative": "contracts/interfaces/amo/IRamos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/amo/IRamos.sol", + "filename_short": "contracts/interfaces/amo/IRamos.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "strategyBalanceSheet(address)" + "signature": "protocolToken()" } - }, + } + ], + "description": "IRamos.maxRebalanceAmounts().protocolToken (contracts/interfaces/amo/IRamos.sol#104) shadows:\n\t- IRamos.protocolToken() (contracts/interfaces/amo/IRamos.sol#76) (function)\n", + "markdown": "[IRamos.maxRebalanceAmounts().protocolToken](contracts/interfaces/amo/IRamos.sol#L104) shadows:\n\t- [IRamos.protocolToken()](contracts/interfaces/amo/IRamos.sol#L76) (function)\n", + "first_markdown_element": "contracts/interfaces/amo/IRamos.sol#L104", + "id": "99988e8d4356d61dc22dc1203ce47d52bd194ee6c04869d1c08b03332a4a64b3", + "check": "shadowing-local", + "impact": "Low", + "confidence": "High" + }, + { + "elements": [ { - "type": "node", - "name": "dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy))", + "type": "variable", + "name": "baseShares", "source_mapping": { - "start": 20490, - "length": 113, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 3468, + "length": 18, + "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", "is_dependency": false, - "lines": [464], - "starting_column": 13, - "ending_column": 126 + "lines": [86], + "starting_column": 9, + "ending_column": 27 }, "type_specific_fields": { "parent": { "type": "function", - "name": "strategyBalanceSheet", + "name": "debtors", "source_mapping": { - "start": 19539, - "length": 1196, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 3219, + "length": 737, + "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", "is_dependency": false, "lines": [ - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467 + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97 ], "starting_column": 5, - "ending_column": 6 + "ending_column": 7 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "ITempleDebtToken", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 325, + "length": 8309, + "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "strategyBalanceSheet(address)" + "signature": "debtors(address)" } } } - } - ], - "description": "TreasuryReservesVault.strategyBalanceSheet(address) (contracts/v2/TreasuryReservesVault.sol#447-467) has external calls inside a loop: dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy)) (contracts/v2/TreasuryReservesVault.sol#464)\n", - "markdown": "[TreasuryReservesVault.strategyBalanceSheet(address)](contracts/v2/TreasuryReservesVault.sol#L447-L467) has external calls inside a loop: [dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy))](contracts/v2/TreasuryReservesVault.sol#L464)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L447-L467", - "id": "20bcad4f9996938c51c34e640ba88b7c6f2e553a9bfd34b0e170bf1b1904292b", - "check": "calls-loop", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + }, { "type": "function", - "name": "latestAssetBalances", + "name": "baseShares", "source_mapping": { - "start": 6069, - "length": 754, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1667, + "length": 54, + "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", "is_dependency": false, - "lines": [ - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177 - ], + "lines": [42], "starting_column": 5, - "ending_column": 6 + "ending_column": 59 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "ITempleDebtToken", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 325, + "length": 8309, + "filename_relative": "contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITempleDebtToken.sol", + "filename_short": "contracts/interfaces/v2/ITempleDebtToken.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "latestAssetBalances()" + "signature": "baseShares()" } - }, + } + ], + "description": "ITempleDebtToken.debtors(address).baseShares (contracts/interfaces/v2/ITempleDebtToken.sol#86) shadows:\n\t- ITempleDebtToken.baseShares() (contracts/interfaces/v2/ITempleDebtToken.sol#42) (function)\n", + "markdown": "[ITempleDebtToken.debtors(address).baseShares](contracts/interfaces/v2/ITempleDebtToken.sol#L86) shadows:\n\t- [ITempleDebtToken.baseShares()](contracts/interfaces/v2/ITempleDebtToken.sol#L42) (function)\n", + "first_markdown_element": "contracts/interfaces/v2/ITempleDebtToken.sol#L86", + "id": "660d8ad3fe151743a4b6eac08ff790cbd92361508e6a7e1ac51d359fbd40579a", + "check": "shadowing-local", + "impact": "Low", + "confidence": "High" + }, + { + "elements": [ { - "type": "node", - "name": "_gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this)))", + "type": "variable", + "name": "borrow", "source_mapping": { - "start": 6422, - "length": 250, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 11494, + "length": 11, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, - "lines": [165, 166, 167, 168, 169, 170], - "starting_column": 13, - "ending_column": 18 + "lines": [291], + "starting_column": 30, + "ending_column": 41 }, "type_specific_fields": { "parent": { "type": "function", - "name": "latestAssetBalances", + "name": "setGlobalPaused", "source_mapping": { - "start": 6069, - "length": 754, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 11469, + "length": 60, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, - "lines": [ - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177 - ], + "lines": [291], "starting_column": 5, - "ending_column": 6 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "ITreasuryReservesVault", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1896, + "length": 12436, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, @@ -15204,128 +15469,145 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "latestAssetBalances()" + "signature": "setGlobalPaused(bool,bool)" } } } - } - ], - "description": "GnosisStrategy.latestAssetBalances() (contracts/v2/strategies/GnosisStrategy.sol#155-177) has external calls inside a loop: _gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this))) (contracts/v2/strategies/GnosisStrategy.sol#165-170)\n", - "markdown": "[GnosisStrategy.latestAssetBalances()](contracts/v2/strategies/GnosisStrategy.sol#L155-L177) has external calls inside a loop: [_gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this)))](contracts/v2/strategies/GnosisStrategy.sol#L165-L170)\n", - "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L155-L177", - "id": "303fe06184eefb239bc471a22808ec3f7ce192673117af8e628268271f896623", - "check": "calls-loop", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + }, { "type": "function", - "name": "burn", + "name": "borrow", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 13392, + "length": 80, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [336], "starting_column": 5, - "ending_column": 6 + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "ITreasuryReservesVault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1896, + "length": 12436, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "borrow(IERC20,uint256,address)" } - }, + } + ], + "description": "ITreasuryReservesVault.setGlobalPaused(bool,bool).borrow (contracts/interfaces/v2/ITreasuryReservesVault.sol#291) shadows:\n\t- ITreasuryReservesVault.borrow(IERC20,uint256,address) (contracts/interfaces/v2/ITreasuryReservesVault.sol#336) (function)\n", + "markdown": "[ITreasuryReservesVault.setGlobalPaused(bool,bool).borrow](contracts/interfaces/v2/ITreasuryReservesVault.sol#L291) shadows:\n\t- [ITreasuryReservesVault.borrow(IERC20,uint256,address)](contracts/interfaces/v2/ITreasuryReservesVault.sol#L336) (function)\n", + "first_markdown_element": "contracts/interfaces/v2/ITreasuryReservesVault.sol#L291", + "id": "ee178bdb812ac154f4b12235ea96012285731106c401b64ca146c3171f9f2b58", + "check": "shadowing-local", + "impact": "Low", + "confidence": "High" + }, + { + "elements": [ { - "type": "node", - "name": "_safeTransfer(_token0,to,amount0)", + "type": "variable", + "name": "borrow", "source_mapping": { - "start": 6213, - "length": 35, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 11679, + "length": 11, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, - "lines": [131], - "starting_column": 9, - "ending_column": 44 + "lines": [296], + "starting_column": 50, + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "setStrategyPaused", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 11634, + "length": 80, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [296], "starting_column": 5, - "ending_column": 6 + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "ITreasuryReservesVault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1896, + "length": 12436, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, @@ -15333,44 +15615,126 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "setStrategyPaused(address,bool,bool)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } + } }, { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "function", + "name": "borrow", "source_mapping": { - "start": 1972, - "length": 91, + "start": 13392, + "length": 80, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "is_dependency": false, + "lines": [336], + "starting_column": 5, + "ending_column": 85 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ITreasuryReservesVault", + "source_mapping": { + "start": 1896, + "length": 12436, + "filename_relative": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/v2/ITreasuryReservesVault.sol", + "filename_short": "contracts/interfaces/v2/ITreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrow(IERC20,uint256,address)" + } + } + ], + "description": "ITreasuryReservesVault.setStrategyPaused(address,bool,bool).borrow (contracts/interfaces/v2/ITreasuryReservesVault.sol#296) shadows:\n\t- ITreasuryReservesVault.borrow(IERC20,uint256,address) (contracts/interfaces/v2/ITreasuryReservesVault.sol#336) (function)\n", + "markdown": "[ITreasuryReservesVault.setStrategyPaused(address,bool,bool).borrow](contracts/interfaces/v2/ITreasuryReservesVault.sol#L296) shadows:\n\t- [ITreasuryReservesVault.borrow(IERC20,uint256,address)](contracts/interfaces/v2/ITreasuryReservesVault.sol#L336) (function)\n", + "first_markdown_element": "contracts/interfaces/v2/ITreasuryReservesVault.sol#L296", + "id": "1f2b144fa0b8083ee1a1ca697a2403bf2d85ddb7223aae096e89a677da991192", + "check": "shadowing-local", + "impact": "Low", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "_owner", + "source_mapping": { + "start": 2665, + "length": 14, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [67], + "starting_column": 17, + "ending_column": 31 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15405,41 +15769,37 @@ "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1)", + "name": "owner = _owner", "source_mapping": { - "start": 6258, - "length": 35, + "start": 2732, + "length": 14, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [132], + "lines": [68], "starting_column": 9, - "ending_column": 44 + "ending_column": 23 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "constructor", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15474,38 +15834,48 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "TempleUniswapV2Pair.constructor(address,address,address)._owner (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- owner = _owner (contracts/amm/TempleUniswapV2Pair.sol#68)\n", + "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._owner](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [owner = _owner](contracts/amm/TempleUniswapV2Pair.sol#L68)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", + "id": "957fa8fd60f70987f3ddecb1cc94bcc42a04d5732b7d1fd612e14be458618171", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "variable", + "name": "_token0", "source_mapping": { - "start": 1972, - "length": 91, + "start": 2681, + "length": 15, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [67], + "starting_column": 33, + "ending_column": 48 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15540,41 +15910,37 @@ "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0)", + "name": "token0 = _token0", "source_mapping": { - "start": 6213, - "length": 35, + "start": 2756, + "length": 16, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [131], + "lines": [69], "starting_column": 9, - "ending_column": 44 + "ending_column": 25 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "constructor", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15609,38 +15975,48 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TempleUniswapV2Pair.constructor(address,address,address)._token0 (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- token0 = _token0 (contracts/amm/TempleUniswapV2Pair.sol#69)\n", + "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._token0](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [token0 = _token0](contracts/amm/TempleUniswapV2Pair.sol#L69)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", + "id": "89b68064543393a53cb614749cb260c4fb872797867021adbebf53b5a0362b2f", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "variable", + "name": "_token1", "source_mapping": { - "start": 1972, - "length": 91, + "start": 2698, + "length": 15, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [67], + "starting_column": 50, + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15675,41 +16051,37 @@ "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1)", + "name": "token1 = _token1", "source_mapping": { - "start": 6258, - "length": 35, + "start": 2782, + "length": 16, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [132], + "lines": [70], "starting_column": 9, - "ending_column": 44 + "ending_column": 25 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "constructor", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 2653, + "length": 152, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [67, 68, 69, 70, 71], "starting_column": 5, "ending_column": 6 }, @@ -15744,38 +16116,48 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "constructor(address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TempleUniswapV2Pair.constructor(address,address,address)._token1 (contracts/amm/TempleUniswapV2Pair.sol#67) lacks a zero-check on :\n\t\t- token1 = _token1 (contracts/amm/TempleUniswapV2Pair.sol#70)\n", + "markdown": "[TempleUniswapV2Pair.constructor(address,address,address)._token1](contracts/amm/TempleUniswapV2Pair.sol#L67) lacks a zero-check on :\n\t\t- [token1 = _token1](contracts/amm/TempleUniswapV2Pair.sol#L70)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L67", + "id": "690db18543951330bfe14086929ed1a80aa7c5c43d413a52b921411451479889", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "variable", + "name": "_router", "source_mapping": { - "start": 1972, - "length": 91, + "start": 2904, + "length": 15, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [74], + "starting_column": 24, + "ending_column": 39 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "setRouter", "source_mapping": { - "start": 1892, - "length": 284, + "start": 2885, + "length": 140, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, @@ -15810,41 +16192,37 @@ "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "setRouter(address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "router = _router", "source_mapping": { - "start": 6426, - "length": 49, + "start": 3002, + "length": 16, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [136], + "lines": [76], "starting_column": 9, - "ending_column": 58 + "ending_column": 25 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "setRouter", "source_mapping": { - "start": 5241, - "length": 1294, + "start": 2885, + "length": 140, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, @@ -15879,316 +16257,289 @@ "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "setRouter(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price0CumulativeLast" } - }, + } + ], + "description": "TempleUniswapV2Pair.setRouter(address)._router (contracts/amm/TempleUniswapV2Pair.sol#74) lacks a zero-check on :\n\t\t- router = _router (contracts/amm/TempleUniswapV2Pair.sol#76)\n", + "markdown": "[TempleUniswapV2Pair.setRouter(address)._router](contracts/amm/TempleUniswapV2Pair.sol#L74) lacks a zero-check on :\n\t\t- [router = _router](contracts/amm/TempleUniswapV2Pair.sol#L76)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L74", + "id": "65b7f26867d221829e7395a702a30581f77ebb909c900aa9dc269f7dd15923d0", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed", + "type": "variable", + "name": "_recipient", "source_mapping": { - "start": 3587, - "length": 88, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1684, + "length": 18, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [86], - "starting_column": 13, - "ending_column": 101 + "lines": [48], + "starting_column": 34, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "setRewardsRecipient", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1655, + "length": 179, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [48, 49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "AuraStaking", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "setRewardsRecipient(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price0CumulativeLast" } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "rewardsRecipient = _recipient", "source_mapping": { - "start": 6426, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1751, + "length": 29, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [136], + "lines": [49], "starting_column": 9, - "ending_column": 58 + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "setRewardsRecipient", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1655, + "length": 179, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [48, 49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "AuraStaking", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "setRewardsRecipient(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price1CumulativeLast" } - }, + } + ], + "description": "AuraStaking.setRewardsRecipient(address)._recipient (contracts/amo/AuraStaking.sol#48) lacks a zero-check on :\n\t\t- rewardsRecipient = _recipient (contracts/amo/AuraStaking.sol#49)\n", + "markdown": "[AuraStaking.setRewardsRecipient(address)._recipient](contracts/amo/AuraStaking.sol#L48) lacks a zero-check on :\n\t\t- [rewardsRecipient = _recipient](contracts/amo/AuraStaking.sol#L49)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L48", + "id": "5563fec2719988c18a09b1c9b98748a0700c5a09c84dd2f6ec51e7b0796b0c80", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed", + "type": "variable", + "name": "_feeCollector", "source_mapping": { - "start": 3689, - "length": 88, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4829, + "length": 21, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [87], - "starting_column": 13, - "ending_column": 101 + "lines": [113], + "starting_column": 9, + "ending_column": 30 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "constructor", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4517, + "length": 995, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Ramos", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price1CumulativeLast" - } - } - ], - "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#86)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#87)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L86)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L87)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", - "id": "d6f7e9923264688e14af684f9180e869a190d782f4a8ab55d1efa22ac6b2ec72", - "check": "reentrancy-benign", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "swap", - "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleUniswapV2Pair", - "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "swap(uint256,uint256,address,bytes)" } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0Out)", + "name": "feeCollector = _feeCollector", "source_mapping": { - "start": 7388, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5310, + "length": 28, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [153], - "starting_column": 29, - "ending_column": 67 + "lines": [123], + "starting_column": 9, + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4517, + "length": 995, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129 ], "starting_column": 5, "ending_column": 6 @@ -16196,135 +16547,200 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Ramos", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "Ramos.constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)._feeCollector (contracts/amo/Ramos.sol#113) lacks a zero-check on :\n\t\t- feeCollector = _feeCollector (contracts/amo/Ramos.sol#123)\n", + "markdown": "[Ramos.constructor(address,address,address,address,address,address,address,uint64,bytes32,address,uint256)._feeCollector](contracts/amo/Ramos.sol#L113) lacks a zero-check on :\n\t\t- [feeCollector = _feeCollector](contracts/amo/Ramos.sol#L123)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L113", + "id": "d859e385f8bd8eca35f31a74169347836938cb1a82d4c8321f358ad5363d6ed4", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "variable", + "name": "_amo", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1614, + "length": 12, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [41], + "starting_column": 7, + "ending_column": 19 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1451, + "length": 622, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_safeTransfer(address,address,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "constructor(address,address,address,address,address,address,uint64,bytes32)" + } + } + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1Out)", + "name": "amo = _amo", "source_mapping": { - "start": 7490, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1988, + "length": 10, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, - "lines": [154], - "starting_column": 29, - "ending_column": 67 + "lines": [51], + "starting_column": 7, + "ending_column": 17 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1451, + "length": 622, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53 ], "starting_column": 5, "ending_column": 6 @@ -16332,79 +16748,109 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "BalancerPoolHelper", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 739, + "length": 19014, + "filename_relative": "contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/helpers/BalancerPoolHelper.sol", + "filename_short": "contracts/amo/helpers/BalancerPoolHelper.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "constructor(address,address,address,address,address,address,uint64,bytes32)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "BalancerPoolHelper.constructor(address,address,address,address,address,address,uint64,bytes32)._amo (contracts/amo/helpers/BalancerPoolHelper.sol#41) lacks a zero-check on :\n\t\t- amo = _amo (contracts/amo/helpers/BalancerPoolHelper.sol#51)\n", + "markdown": "[BalancerPoolHelper.constructor(address,address,address,address,address,address,uint64,bytes32)._amo](contracts/amo/helpers/BalancerPoolHelper.sol#L41) lacks a zero-check on :\n\t\t- [amo = _amo](contracts/amo/helpers/BalancerPoolHelper.sol#L51)\n", + "first_markdown_element": "contracts/amo/helpers/BalancerPoolHelper.sol#L41", + "id": "1a4d31b221d02b3c425c477d2b7e4c6dc1e41557697509c8e152170c2f1f7986", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "type": "variable", + "name": "_gnosisSafeWallet", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1643, + "length": 25, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [50], + "lines": [41], "starting_column": 9, - "ending_column": 100 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1478, + "length": 459, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "GnosisStrategy", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, @@ -16420,61 +16866,56 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(address,address,string,address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", + "name": "gnosisSafeWallet = _gnosisSafeWallet", "source_mapping": { - "start": 7593, - "length": 76, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1814, + "length": 36, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [155], - "starting_column": 30, - "ending_column": 106 + "lines": [44], + "starting_column": 9, + "ending_column": 45 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1478, + "length": 459, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "GnosisStrategy", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, @@ -16490,531 +16931,548 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "constructor(address,address,string,address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "GnosisStrategy.constructor(address,address,string,address,address,address)._gnosisSafeWallet (contracts/v2/strategies/GnosisStrategy.sol#41) lacks a zero-check on :\n\t\t- gnosisSafeWallet = _gnosisSafeWallet (contracts/v2/strategies/GnosisStrategy.sol#44)\n", + "markdown": "[GnosisStrategy.constructor(address,address,string,address,address,address)._gnosisSafeWallet](contracts/v2/strategies/GnosisStrategy.sol#L41) lacks a zero-check on :\n\t\t- [gnosisSafeWallet = _gnosisSafeWallet](contracts/v2/strategies/GnosisStrategy.sol#L44)\n", + "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L41", + "id": "35341096e7cc1cb2d71fe6962d37434197ec4866db8dda0c2c8cd05c17585e33", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "_safeTransfer(_token0,to,amount0Out)", + "type": "variable", + "name": "_implementation", "source_mapping": { - "start": 7388, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1224, + "length": 23, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [153], - "starting_column": 29, - "ending_column": 67 + "lines": [40], + "starting_column": 17, + "ending_column": 40 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1212, + "length": 230, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [40, 41, 42, 43, 44], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "constructor(address,uint16)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "templeTeamPaymentsImplementation = _implementation", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1302, + "length": 50, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [50], + "lines": [41], "starting_column": 9, - "ending_column": 100 + "ending_column": 59 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1212, + "length": 230, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [40, 41, 42, 43, 44], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(address,uint16)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TempleTeamPaymentsFactory.constructor(address,uint16)._implementation (contracts/admin/TempleTeamPaymentsFactory.sol#40) lacks a zero-check on :\n\t\t- templeTeamPaymentsImplementation = _implementation (contracts/admin/TempleTeamPaymentsFactory.sol#41)\n", + "markdown": "[TempleTeamPaymentsFactory.constructor(address,uint16)._implementation](contracts/admin/TempleTeamPaymentsFactory.sol#L40) lacks a zero-check on :\n\t\t- [templeTeamPaymentsImplementation = _implementation](contracts/admin/TempleTeamPaymentsFactory.sol#L41)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L40", + "id": "da87c5c8c1b8544472d505a239a86c8fd5eef6af865588f2c95eaae614f5b72a", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "_safeTransfer(_token1,to,amount1Out)", + "type": "variable", + "name": "_defendStable", "source_mapping": { - "start": 7490, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1200, + "length": 22, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [154], - "starting_column": 29, - "ending_column": 67 + "lines": [40], + "starting_column": 13, + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1091, + "length": 291, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "swap(uint256,uint256,address,bytes)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "constructor(TempleERC20Token,ITreasuryIV,address)" + } + } + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "defendStable = _defendStable", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1346, + "length": 29, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [50], + "lines": [45], "starting_column": 9, - "ending_column": 100 + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "constructor", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1091, + "length": 291, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "constructor(TempleERC20Token,ITreasuryIV,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TempleStableAMMRouter.constructor(TempleERC20Token,ITreasuryIV,address)._defendStable (contracts/amm/TempleStableAMMRouter.sol#40) lacks a zero-check on :\n\t\t- defendStable = _defendStable (contracts/amm/TempleStableAMMRouter.sol#45)\n", + "markdown": "[TempleStableAMMRouter.constructor(TempleERC20Token,ITreasuryIV,address)._defendStable](contracts/amm/TempleStableAMMRouter.sol#L40) lacks a zero-check on :\n\t\t- [defendStable = _defendStable](contracts/amm/TempleStableAMMRouter.sol#L45)\n", + "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L40", + "id": "8e8b46a3e001386612a0920cae43f3178af46f175ae977aa5f36adc5662d1cda", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", + "type": "variable", + "name": "_defendStable", "source_mapping": { - "start": 7593, - "length": 76, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1652, + "length": 21, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [155], + "lines": [56], "starting_column": 30, - "ending_column": 106 + "ending_column": 51 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "setDefendStable", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1627, + "length": 112, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [56, 57, 58], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "setDefendStable(address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "defendStable = _defendStable", "source_mapping": { - "start": 8457, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1704, + "length": 28, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [168], + "lines": [57], "starting_column": 9, - "ending_column": 58 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "setDefendStable", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1627, + "length": 112, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [56, 57, 58], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleStableAMMRouter", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 640, + "length": 8255, + "filename_relative": "contracts/amm/TempleStableAMMRouter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleStableAMMRouter.sol", + "filename_short": "contracts/amm/TempleStableAMMRouter.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "setDefendStable(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price0CumulativeLast" } - }, + } + ], + "description": "TempleStableAMMRouter.setDefendStable(address)._defendStable (contracts/amm/TempleStableAMMRouter.sol#56) lacks a zero-check on :\n\t\t- defendStable = _defendStable (contracts/amm/TempleStableAMMRouter.sol#57)\n", + "markdown": "[TempleStableAMMRouter.setDefendStable(address)._defendStable](contracts/amm/TempleStableAMMRouter.sol#L56) lacks a zero-check on :\n\t\t- [defendStable = _defendStable](contracts/amm/TempleStableAMMRouter.sol#L57)\n", + "first_markdown_element": "contracts/amm/TempleStableAMMRouter.sol#L56", + "id": "de02254c0f567ff1a6e8223d4826abf485c07990091f962338f7c0fa067431d5", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed", + "type": "variable", + "name": "_fundsOwner", "source_mapping": { - "start": 3587, - "length": 88, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3147, + "length": 19, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [86], - "starting_column": 13, - "ending_column": 101 + "lines": [72], + "starting_column": 9, + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "constructor", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3063, + "length": 1137, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 845, + "length": 6488, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price0CumulativeLast" } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "fundsOwner = _fundsOwner", "source_mapping": { - "start": 8457, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3462, + "length": 24, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, - "lines": [168], + "lines": [80], "starting_column": 9, - "ending_column": 58 + "ending_column": 33 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "constructor", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3063, + "length": 1137, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 ], "starting_column": 5, "ending_column": 6 @@ -17022,799 +17480,735 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OtcOffer", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 845, + "length": 6488, + "filename_relative": "contracts/core/OtcOffer.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OtcOffer.sol", + "filename_short": "contracts/core/OtcOffer.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price1CumulativeLast" } - }, + } + ], + "description": "OtcOffer.constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)._fundsOwner (contracts/core/OtcOffer.sol#72) lacks a zero-check on :\n\t\t- fundsOwner = _fundsOwner (contracts/core/OtcOffer.sol#80)\n", + "markdown": "[OtcOffer.constructor(address,address,address,uint256,OtcOffer.OfferPricingToken,uint128,uint128)._fundsOwner](contracts/core/OtcOffer.sol#L72) lacks a zero-check on :\n\t\t- [fundsOwner = _fundsOwner](contracts/core/OtcOffer.sol#L80)\n", + "first_markdown_element": "contracts/core/OtcOffer.sol#L72", + "id": "318c72045beea63d39db91e2c64959d93dbfe0e966ec4e74e6cbf32f20a24e68", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed", + "type": "variable", + "name": "_vaultedTempleAccount", "source_mapping": { - "start": 3689, - "length": 88, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2726, + "length": 29, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [87], - "starting_column": 13, - "ending_column": 101 + "lines": [65], + "starting_column": 9, + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "constructor", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2577, + "length": 838, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "Vault", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "price1CumulativeLast" - } - } - ], - "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#86)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#87)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L86)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L87)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", - "id": "4009158fb72c6a7f799d45778765abe734e526aff7ec82c4bb4384d474895f3f", - "check": "reentrancy-benign", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "createExposure", - "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", - "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OpsManager", - "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "createExposure(string,string,IERC20)" } }, { "type": "node", - "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", + "name": "vaultedTempleAccount = _vaultedTempleAccount", "source_mapping": { - "start": 1546, - "length": 81, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 3116, + "length": 44, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [51], + "lines": [74], "starting_column": 9, - "ending_column": 90 + "ending_column": 53 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createExposure", + "name": "constructor", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 2577, + "length": 838, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "lines": [ + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "Vault", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "createExposure(string,string,IERC20)" + "signature": "constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "Vault.constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)._vaultedTempleAccount (contracts/core/Vault.sol#65) lacks a zero-check on :\n\t\t- vaultedTempleAccount = _vaultedTempleAccount (contracts/core/Vault.sol#74)\n", + "markdown": "[Vault.constructor(string,string,IERC20,Exposure,address,uint256,uint256,Rational,JoiningFee,uint256)._vaultedTempleAccount](contracts/core/Vault.sol#L65) lacks a zero-check on :\n\t\t- [vaultedTempleAccount = _vaultedTempleAccount](contracts/core/Vault.sol#L74)\n", + "first_markdown_element": "contracts/core/Vault.sol#L65", + "id": "ec8f5d8d5e84e67e63f7cfdbd240113b25d7e450ff6b895abf8718c03e3b752b", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", + "type": "variable", + "name": "_templeExposure", "source_mapping": { - "start": 1546, - "length": 81, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1380, + "length": 23, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, - "lines": [51], - "starting_column": 9, - "ending_column": 90 + "lines": [39], + "starting_column": 38, + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createExposure", + "name": "constructor", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1347, + "length": 163, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "lines": [39, 40, 41, 42], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "VaultedTemple", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1207, + "length": 1025, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createExposure(string,string,IERC20)" + "signature": "constructor(IERC20,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "revalTokens.push(address(revalToken))", + "name": "templeExposure = _templeExposure", "source_mapping": { - "start": 1637, - "length": 37, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1471, + "length": 32, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, - "lines": [52], + "lines": [41], "starting_column": 9, - "ending_column": 46 + "ending_column": 41 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createExposure", + "name": "constructor", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1347, + "length": 163, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "lines": [39, 40, 41, 42], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "VaultedTemple", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1207, + "length": 1025, + "filename_relative": "contracts/core/VaultedTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultedTemple.sol", + "filename_short": "contracts/core/VaultedTemple.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createExposure(string,string,IERC20)" + "signature": "constructor(IERC20,address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "revalTokens" } } ], - "description": "Reentrancy in OpsManager.createExposure(string,string,IERC20) (contracts/core/OpsManager.sol#45-54):\n\tExternal calls:\n\t- exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools) (contracts/core/OpsManager.sol#51)\n\tState variables written after the call(s):\n\t- revalTokens.push(address(revalToken)) (contracts/core/OpsManager.sol#52)\n", - "markdown": "Reentrancy in [OpsManager.createExposure(string,string,IERC20)](contracts/core/OpsManager.sol#L45-L54):\n\tExternal calls:\n\t- [exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)](contracts/core/OpsManager.sol#L51)\n\tState variables written after the call(s):\n\t- [revalTokens.push(address(revalToken))](contracts/core/OpsManager.sol#L52)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L45-L54", - "id": "51556a077db66dfc3240e846360a26235f1360662907e56d0702b662359b5526", - "check": "reentrancy-benign", + "description": "VaultedTemple.constructor(IERC20,address)._templeExposure (contracts/core/VaultedTemple.sol#39) lacks a zero-check on :\n\t\t- templeExposure = _templeExposure (contracts/core/VaultedTemple.sol#41)\n", + "markdown": "[VaultedTemple.constructor(IERC20,address)._templeExposure](contracts/core/VaultedTemple.sol#L39) lacks a zero-check on :\n\t\t- [templeExposure = _templeExposure](contracts/core/VaultedTemple.sol#L41)\n", + "first_markdown_element": "contracts/core/VaultedTemple.sol#L39", + "id": "2fcc44b40158b30b8b0d1614ffa673ffe544de75b922fdda079eea29dca64415", + "check": "missing-zero-check", "impact": "Low", "confidence": "Medium" }, { "elements": [ { - "type": "function", - "name": "decreaseShares", - "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "decreaseShares(address,uint256)" - } - }, - { - "type": "node", - "name": "claimFor(account)", + "type": "variable", + "name": "_spiceToken", "source_mapping": { - "start": 2461, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3979, + "length": 19, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [70], + "lines": [74], "starting_column": 9, - "ending_column": 26 + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "constructor", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "SpiceAuction", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } + } }, { "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "name": "spiceToken = _spiceToken", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4154, + "length": 24, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [91], + "lines": [81], "starting_column": 9, - "ending_column": 65 + "ending_column": 33 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "constructor", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "SpiceAuction", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "claimFor(address)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { - "type": "node", - "name": "claimFor(account)", - "source_mapping": { - "start": 2461, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [70], - "starting_column": 9, - "ending_column": 26 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "decreaseShares", - "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._spiceToken (contracts/templegold/SpiceAuction.sol#74) lacks a zero-check on :\n\t\t- spiceToken = _spiceToken (contracts/templegold/SpiceAuction.sol#81)\n", + "markdown": "[SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._spiceToken](contracts/templegold/SpiceAuction.sol#L74) lacks a zero-check on :\n\t\t- [spiceToken = _spiceToken](contracts/templegold/SpiceAuction.sol#L81)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L74", + "id": "25f742f08a3fbbc63786e9ea586e2c0f82f43684e79a4ddccfadb89ff32df09f", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "type": "variable", + "name": "_daoExecutor", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4008, + "length": 20, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [91], + "lines": [75], "starting_column": 9, - "ending_column": 65 + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "constructor", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "SpiceAuction", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "totalShares -= amount", + "name": "daoExecutor = _daoExecutor", "source_mapping": { - "start": 2524, - "length": 21, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4188, + "length": 26, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [73], + "lines": [82], "starting_column": 9, - "ending_column": 30 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "constructor", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "SpiceAuction", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "totalShares" } } ], - "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- totalShares -= amount (contracts/core/TreasuryFarmingRevenue.sol#73)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [totalShares -= amount](contracts/core/TreasuryFarmingRevenue.sol#L73)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", - "id": "0b0602eac2622c580688b404d63d57f1596371f95c0951d2b30d3754c6a94161", - "check": "reentrancy-benign", + "description": "SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._daoExecutor (contracts/templegold/SpiceAuction.sol#75) lacks a zero-check on :\n\t\t- daoExecutor = _daoExecutor (contracts/templegold/SpiceAuction.sol#82)\n", + "markdown": "[SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._daoExecutor](contracts/templegold/SpiceAuction.sol#L75) lacks a zero-check on :\n\t\t- [daoExecutor = _daoExecutor](contracts/templegold/SpiceAuction.sol#L82)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L75", + "id": "dd54c681511569544cf8d40ea78980325bb23af22f903dc0f42bbbbcf9faaf8c", + "check": "missing-zero-check", "impact": "Low", "confidence": "Medium" }, { "elements": [ { - "type": "function", - "name": "deployPayouts", - "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" - } - }, - { - "type": "node", - "name": "paymentContract.initialize(_token)", + "type": "variable", + "name": "_operator", "source_mapping": { - "start": 3294, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 4038, + "length": 17, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [89], + "lines": [76], "starting_column": 9, - "ending_column": 43 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 ], "starting_column": 5, "ending_column": 6 @@ -17822,65 +18216,92 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } + } }, { "type": "node", - "name": "paymentContract.setAllocations(_dests,_allocations)", + "name": "operator = _operator", "source_mapping": { - "start": 3338, - "length": 52, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 4224, + "length": 20, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [90], + "lines": [83], "starting_column": 9, - "ending_column": 61 + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 ], "starting_column": 5, "ending_column": 6 @@ -17888,65 +18309,103 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._operator (contracts/templegold/SpiceAuction.sol#76) lacks a zero-check on :\n\t\t- operator = _operator (contracts/templegold/SpiceAuction.sol#83)\n", + "markdown": "[SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._operator](contracts/templegold/SpiceAuction.sol#L76) lacks a zero-check on :\n\t\t- [operator = _operator](contracts/templegold/SpiceAuction.sol#L83)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L76", + "id": "8fbcfb810a88386e8c0041657a42f527c9405b43ae3ce510df24d0f30e689ee9", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "paymentContract.transferOwnership(msg.sender)", + "type": "variable", + "name": "_templeGold", "source_mapping": { - "start": 3401, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3950, + "length": 19, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [92], + "lines": [73], "starting_column": 9, - "ending_column": 54 + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 ], "starting_column": 5, "ending_column": 6 @@ -17954,65 +18413,92 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "constructor(address,address,address,address,uint32,uint32,string)" + } + } + } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", + "name": "templeGold = _templeGold", "source_mapping": { - "start": 3493, - "length": 165, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 4254, + "length": 24, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [95, 96, 97, 98, 99, 100], - "starting_column": 13, - "ending_column": 14 + "lines": [84], + "starting_column": 9, + "ending_column": 33 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3929, + "length": 535, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90 ], "starting_column": 5, "ending_column": 6 @@ -18020,65 +18506,102 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,uint32,uint32,string)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._templeGold (contracts/templegold/SpiceAuction.sol#73) lacks a zero-check on :\n\t\t- templeGold = _templeGold (contracts/templegold/SpiceAuction.sol#84)\n", + "markdown": "[SpiceAuction.constructor(address,address,address,address,uint32,uint32,string)._templeGold](contracts/templegold/SpiceAuction.sol#L73) lacks a zero-check on :\n\t\t- [templeGold = _templeGold](contracts/templegold/SpiceAuction.sol#L84)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L73", + "id": "085da17bb26a4f7420820ecfc832891c67ed6506646c3fa442b896ed998be2ac", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "paymentContract.initialize(_token)", + "type": "variable", + "name": "_daoExecutor", "source_mapping": { - "start": 3294, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1266, + "length": 20, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [89], + "lines": [33], "starting_column": 9, - "ending_column": 43 + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ], "starting_column": 5, "ending_column": 6 @@ -18086,65 +18609,58 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "paymentContract.setAllocations(_dests,_allocations)", + "name": "daoExecutor = _daoExecutor", "source_mapping": { - "start": 3338, - "length": 52, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1456, + "length": 26, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [90], + "lines": [39], "starting_column": 9, - "ending_column": 61 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ], "starting_column": 5, "ending_column": 6 @@ -18152,65 +18668,69 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._daoExecutor (contracts/templegold/SpiceAuctionFactory.sol#33) lacks a zero-check on :\n\t\t- daoExecutor = _daoExecutor (contracts/templegold/SpiceAuctionFactory.sol#39)\n", + "markdown": "[SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._daoExecutor](contracts/templegold/SpiceAuctionFactory.sol#L33) lacks a zero-check on :\n\t\t- [daoExecutor = _daoExecutor](contracts/templegold/SpiceAuctionFactory.sol#L39)\n", + "first_markdown_element": "contracts/templegold/SpiceAuctionFactory.sol#L33", + "id": "d2154e0fe59e5d21116db9a80efb0cff4f3455d7ba1d930add1d727bcc26870e", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "paymentContract.transferOwnership(msg.sender)", + "type": "variable", + "name": "_operator", "source_mapping": { - "start": 3401, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1296, + "length": 17, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [92], + "lines": [34], "starting_column": 9, - "ending_column": 54 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ], "starting_column": 5, "ending_column": 6 @@ -18218,65 +18738,58 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", + "name": "operator = _operator", "source_mapping": { - "start": 3493, - "length": 165, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1492, + "length": 20, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [95, 96, 97, 98, 99, 100], - "starting_column": 13, - "ending_column": 14 + "lines": [40], + "starting_column": 9, + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ], "starting_column": 5, "ending_column": 6 @@ -18284,65 +18797,69 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._operator (contracts/templegold/SpiceAuctionFactory.sol#34) lacks a zero-check on :\n\t\t- operator = _operator (contracts/templegold/SpiceAuctionFactory.sol#40)\n", + "markdown": "[SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._operator](contracts/templegold/SpiceAuctionFactory.sol#L34) lacks a zero-check on :\n\t\t- [operator = _operator](contracts/templegold/SpiceAuctionFactory.sol#L40)\n", + "first_markdown_element": "contracts/templegold/SpiceAuctionFactory.sol#L34", + "id": "617305e716f7c415da9006a73f9ca472b4d354e9c68f7d1f4ce033c955e19909", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "incrementEpoch(address(paymentContract),_totalFunding)", + "type": "variable", + "name": "_templeGold", "source_mapping": { - "start": 3669, - "length": 55, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1323, + "length": 19, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [102], + "lines": [35], "starting_column": 9, - "ending_column": 64 + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "constructor", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ], "starting_column": 5, "ending_column": 6 @@ -18350,207 +18867,142 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "epochsFunded" } }, { "type": "node", - "name": "epochsFunded[lastPaidEpoch] = data", + "name": "templeGold = _templeGold", "source_mapping": { - "start": 1754, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1522, + "length": 24, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [55], + "lines": [41], "starting_column": 9, - "ending_column": 43 + "ending_column": 33 }, "type_specific_fields": { "parent": { "type": "function", - "name": "incrementEpoch", + "name": "constructor", "source_mapping": { - "start": 1448, - "length": 347, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1192, + "length": 434, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, - "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], + "lines": [ + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "SpiceAuctionFactory", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 568, + "length": 2931, + "filename_relative": "contracts/templegold/SpiceAuctionFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuctionFactory.sol", + "filename_short": "contracts/templegold/SpiceAuctionFactory.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "incrementEpoch(address,uint256)" + "signature": "constructor(address,address,address,address,address,uint32,uint32)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "epochsFunded" } } ], - "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#102)\n\t\t- epochsFunded[lastPaidEpoch] = data (contracts/admin/TempleTeamPaymentsFactory.sol#55)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L102)\n\t\t- [epochsFunded[lastPaidEpoch] = data](contracts/admin/TempleTeamPaymentsFactory.sol#L55)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", - "id": "38547e1ee698a66798b081a9551aa0d534f4641810a5486cd31cdbdd25f55313", - "check": "reentrancy-benign", + "description": "SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._templeGold (contracts/templegold/SpiceAuctionFactory.sol#35) lacks a zero-check on :\n\t\t- templeGold = _templeGold (contracts/templegold/SpiceAuctionFactory.sol#41)\n", + "markdown": "[SpiceAuctionFactory.constructor(address,address,address,address,address,uint32,uint32)._templeGold](contracts/templegold/SpiceAuctionFactory.sol#L35) lacks a zero-check on :\n\t\t- [templeGold = _templeGold](contracts/templegold/SpiceAuctionFactory.sol#L41)\n", + "first_markdown_element": "contracts/templegold/SpiceAuctionFactory.sol#L35", + "id": "b85d780fcbba61c10f902076b72311093004f7d843e907ab1ce08878f66824c6", + "check": "missing-zero-check", "impact": "Low", "confidence": "Medium" }, { "elements": [ { - "type": "function", - "name": "directPayouts", + "type": "variable", + "name": "_treasury", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2465, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [51], + "starting_column": 9, + "ending_column": 26 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", + "type": "function", + "name": "constructor", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2388, + "length": 442, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "directPayouts(IERC20,address[],uint256[])" - } - }, - { - "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", - "source_mapping": { - "start": 4662, - "length": 59, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [133], - "starting_column": 13, - "ending_column": 72 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "directPayouts", - "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], + "lines": [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18559,63 +19011,75 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "constructor(address,address,address,address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } + } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", + "name": "treasury = _treasury", "source_mapping": { - "start": 4662, - "length": 59, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2712, + "length": 20, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [133], - "starting_column": 13, - "ending_column": 72 + "lines": [58], + "starting_column": 9, + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "directPayouts", + "name": "constructor", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2388, + "length": 442, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], + "lines": [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18624,63 +19088,86 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "constructor(address,address,address,address,address,address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "StableGoldAuction.constructor(address,address,address,address,address,address)._treasury (contracts/templegold/StableGoldAuction.sol#51) lacks a zero-check on :\n\t\t- treasury = _treasury (contracts/templegold/StableGoldAuction.sol#58)\n", + "markdown": "[StableGoldAuction.constructor(address,address,address,address,address,address)._treasury](contracts/templegold/StableGoldAuction.sol#L51) lacks a zero-check on :\n\t\t- [treasury = _treasury](contracts/templegold/StableGoldAuction.sol#L58)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L51", + "id": "c0840cb8dc9d2ea7ad23624d7c70da57b70da2ff2f79b5ff0e75ce41b26c5dfb", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "incrementEpoch(address(this),totalFunding)", + "type": "variable", + "name": "_auctionStarter", "source_mapping": { - "start": 4836, - "length": 43, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2545, + "length": 23, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [140], + "lines": [54], "starting_column": 9, - "ending_column": 52 + "ending_column": 32 }, "type_specific_fields": { "parent": { "type": "function", - "name": "directPayouts", + "name": "constructor", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2388, + "length": 442, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], + "lines": [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18689,63 +19176,75 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "constructor(address,address,address,address,address,address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "epochsFunded" } }, { "type": "node", - "name": "epochsFunded[lastPaidEpoch] = data", + "name": "auctionStarter = _auctionStarter", "source_mapping": { - "start": 1754, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2742, + "length": 32, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [55], + "lines": [59], "starting_column": 9, - "ending_column": 43 + "ending_column": 41 }, "type_specific_fields": { "parent": { "type": "function", - "name": "incrementEpoch", + "name": "constructor", "source_mapping": { - "start": 1448, - "length": 347, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 2388, + "length": 442, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], + "lines": [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18754,66 +19253,86 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "incrementEpoch(address,uint256)" + "signature": "constructor(address,address,address,address,address,address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "epochsFunded" } - }, + } + ], + "description": "StableGoldAuction.constructor(address,address,address,address,address,address)._auctionStarter (contracts/templegold/StableGoldAuction.sol#54) lacks a zero-check on :\n\t\t- auctionStarter = _auctionStarter (contracts/templegold/StableGoldAuction.sol#59)\n", + "markdown": "[StableGoldAuction.constructor(address,address,address,address,address,address)._auctionStarter](contracts/templegold/StableGoldAuction.sol#L54) lacks a zero-check on :\n\t\t- [auctionStarter = _auctionStarter](contracts/templegold/StableGoldAuction.sol#L59)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L54", + "id": "ca9f83de1607efb83bb8e64169b325d3d51ca68844fc4d673205a00bad0a43a7", + "check": "missing-zero-check", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "incrementEpoch(address(this),totalFunding)", + "type": "variable", + "name": "_starter", "source_mapping": { - "start": 4836, - "length": 43, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3653, + "length": 16, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [140], - "starting_column": 9, - "ending_column": 52 + "lines": [83], + "starting_column": 32, + "ending_column": 48 }, "type_specific_fields": { "parent": { "type": "function", - "name": "directPayouts", + "name": "setAuctionStarter", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3626, + "length": 320, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], + "lines": [83, 84, 85, 86, 87, 88], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18822,63 +19341,75 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "setAuctionStarter(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "lastPaidEpoch" } }, { "type": "node", - "name": "data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})", + "name": "auctionStarter = _starter", "source_mapping": { - "start": 1562, - "length": 182, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3792, + "length": 25, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [50, 51, 52, 53, 54], + "lines": [85], "starting_column": 9, - "ending_column": 11 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "incrementEpoch", + "name": "setAuctionStarter", "source_mapping": { - "start": 1448, - "length": 347, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3626, + "length": 320, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], + "lines": [83, 84, 85, 86, 87, 88], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "StableGoldAuction", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, @@ -18887,27 +19418,40 @@ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "incrementEpoch(address,uint256)" + "signature": "setAuctionStarter(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "lastPaidEpoch" } } ], - "description": "Reentrancy in TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,dest,value) (contracts/admin/TempleTeamPaymentsFactory.sol#133)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(this),totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#140)\n\t\t- epochsFunded[lastPaidEpoch] = data (contracts/admin/TempleTeamPaymentsFactory.sol#55)\n\t- incrementEpoch(address(this),totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#140)\n\t\t- data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++}) (contracts/admin/TempleTeamPaymentsFactory.sol#50-54)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)](contracts/admin/TempleTeamPaymentsFactory.sol#L133)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(this),totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L140)\n\t\t- [epochsFunded[lastPaidEpoch] = data](contracts/admin/TempleTeamPaymentsFactory.sol#L55)\n\t- [incrementEpoch(address(this),totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L140)\n\t\t- [data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})](contracts/admin/TempleTeamPaymentsFactory.sol#L50-L54)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143", - "id": "e7d7cc7383e1682a576694bbc276f3a8cb1f5f6783434f8f5336ea3b0d9bf554", - "check": "reentrancy-benign", + "description": "StableGoldAuction.setAuctionStarter(address)._starter (contracts/templegold/StableGoldAuction.sol#83) lacks a zero-check on :\n\t\t- auctionStarter = _starter (contracts/templegold/StableGoldAuction.sol#85)\n", + "markdown": "[StableGoldAuction.setAuctionStarter(address)._starter](contracts/templegold/StableGoldAuction.sol#L83) lacks a zero-check on :\n\t\t- [auctionStarter = _starter](contracts/templegold/StableGoldAuction.sol#L85)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L83", + "id": "5b942f789f302b63e37a3b9973e6d6c4405dc1bbde87ed88e62d90de0212416a", + "check": "missing-zero-check", "impact": "Low", "confidence": "Medium" }, @@ -18915,343 +19459,562 @@ "elements": [ { "type": "function", - "name": "increaseShares", + "name": "getReward", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4292, + "length": 657, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "AuraStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "getReward(bool)" } }, { "type": "node", - "name": "claimFor(account)", + "name": "balance = rewardToken.balanceOf(address(this))", "source_mapping": { - "start": 2093, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4736, + "length": 54, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [57], - "starting_column": 9, - "ending_column": 26 + "lines": [118], + "starting_column": 17, + "ending_column": 71 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "getReward", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 4292, + "length": 657, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "AuraStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "getReward(bool)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "AuraStaking.getReward(bool) (contracts/amo/AuraStaking.sol#110-125) has external calls inside a loop: balance = rewardToken.balanceOf(address(this)) (contracts/amo/AuraStaking.sol#118)\n", + "markdown": "[AuraStaking.getReward(bool)](contracts/amo/AuraStaking.sol#L110-L125) has external calls inside a loop: [balance = rewardToken.balanceOf(address(this))](contracts/amo/AuraStaking.sol#L118)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L110-L125", + "id": "dab641382da7356da589d9f335e183a99e5e9d0e41793c5d48158d07f1c57272", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "type": "function", + "name": "shutdown", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [91], - "starting_column": 9, - "ending_column": 65 + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "claimFor", + "type": "contract", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "claimFor(address)" + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + "signature": "shutdown(address)" + } }, { "type": "node", - "name": "claimFor(account)", + "name": "_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)", "source_mapping": { - "start": 2093, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 12500, + "length": 64, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [57], - "starting_column": 9, - "ending_column": 26 + "lines": [296], + "starting_column": 13, + "ending_column": 77 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "shutdown", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "shutdown(address)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319) has external calls inside a loop: _outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy) (contracts/v2/TreasuryReservesVault.sol#296)\n", + "markdown": "[TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319) has external calls inside a loop: [_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)](contracts/v2/TreasuryReservesVault.sol#L296)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", + "id": "319ffc2aa8a4b776f15de07870a0d4d5abe0125bc3d87d10222a70895adf8bba", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "type": "function", + "name": "strategyBalanceSheet", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 19540, + "length": 1196, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [91], - "starting_column": 9, - "ending_column": 65 + "lines": [ + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "claimFor", + "type": "contract", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "claimFor(address)" + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + "signature": "strategyBalanceSheet(address)" + } }, { "type": "node", - "name": "totalShares += amount", + "name": "dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy))", "source_mapping": { - "start": 2156, - "length": 21, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 20491, + "length": 113, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [60], - "starting_column": 9, - "ending_column": 30 + "lines": [464], + "starting_column": 13, + "ending_column": 126 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "strategyBalanceSheet", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 19540, + "length": 1196, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [ + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "strategyBalanceSheet(address)" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "totalShares" } } ], - "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- totalShares += amount (contracts/core/TreasuryFarmingRevenue.sol#60)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [totalShares += amount](contracts/core/TreasuryFarmingRevenue.sol#L60)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", - "id": "842e91df89a71525a6459c0d1291885967545da62e3f06975364172343f78737", - "check": "reentrancy-benign", + "description": "TreasuryReservesVault.strategyBalanceSheet(address) (contracts/v2/TreasuryReservesVault.sol#447-467) has external calls inside a loop: dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy)) (contracts/v2/TreasuryReservesVault.sol#464)\n", + "markdown": "[TreasuryReservesVault.strategyBalanceSheet(address)](contracts/v2/TreasuryReservesVault.sol#L447-L467) has external calls inside a loop: [dTokenBalances[i] = ITempleStrategy.AssetBalance(_token,borrowTokens[IERC20(_token)].dToken.balanceOf(strategy))](contracts/v2/TreasuryReservesVault.sol#L464)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L447-L467", + "id": "20bcad4f9996938c51c34e640ba88b7c6f2e553a9bfd34b0e170bf1b1904292b", + "check": "calls-loop", "impact": "Low", "confidence": "Medium" }, @@ -19259,17 +20022,17 @@ "elements": [ { "type": "function", - "name": "removeCollateral", + "name": "latestAssetBalances", "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 6070, + "length": 754, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177 ], "starting_column": 5, "ending_column": 6 @@ -19277,116 +20040,64 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "GnosisStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "removeCollateral(uint128,address)" + "signature": "latestAssetBalances()" } }, { "type": "node", - "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", + "name": "_gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this)))", "source_mapping": { - "start": 7012, - "length": 118, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 6423, + "length": 250, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [173, 174, 175, 176, 177], - "starting_column": 9, - "ending_column": 10 + "lines": [165, 166, 167, 168, 169, 170], + "starting_column": 13, + "ending_column": 18 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeCollateral", + "name": "latestAssetBalances", "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 6070, + "length": 754, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177 ], "starting_column": 5, "ending_column": 6 @@ -19394,358 +20105,166 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "GnosisStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "removeCollateral(uint128,address)" + "signature": "latestAssetBalances()" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "GnosisStrategy.latestAssetBalances() (contracts/v2/strategies/GnosisStrategy.sol#155-177) has external calls inside a loop: _gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this))) (contracts/v2/strategies/GnosisStrategy.sol#165-170)\n", + "markdown": "[GnosisStrategy.latestAssetBalances()](contracts/v2/strategies/GnosisStrategy.sol#L155-L177) has external calls inside a loop: [_gnosisBalance = (IERC20(_asset).balanceOf(gnosisSafeWallet) + IERC20(_asset).balanceOf(address(this)))](contracts/v2/strategies/GnosisStrategy.sol#L165-L170)\n", + "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L155-L177", + "id": "303fe06184eefb239bc471a22808ec3f7ce192673117af8e628268271f896623", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", + "type": "function", + "name": "addRevenue", "source_mapping": { - "start": 7012, - "length": 118, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3635, + "length": 351, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [173, 174, 175, 176, 177], - "starting_column": 9, - "ending_column": 10 + "lines": [110, 111, 112, 113, 114, 115, 116], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "removeCollateral", + "type": "contract", + "name": "OpsManager", "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleLineOfCredit", - "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "removeCollateral(uint128,address)" + "starting_column": 1, + "ending_column": 2 } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + "signature": "addRevenue(IERC20[],uint256[])" + } }, { "type": "node", - "name": "totalCollateral -= amount", + "name": "pools[exposureTokens[i]].addRevenue(amounts[i])", "source_mapping": { - "start": 7285, - "length": 25, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3922, + "length": 47, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [181], - "starting_column": 9, - "ending_column": 34 + "lines": [114], + "starting_column": 13, + "ending_column": 60 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeCollateral", + "name": "addRevenue", "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3635, + "length": 351, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 - ], + "lines": [110, 111, 112, 113, 114, 115, 116], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "OpsManager", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "removeCollateral(uint128,address)" + "signature": "addRevenue(IERC20[],uint256[])" } } - }, - "additional_fields": { - "underlying_type": "variables_written", - "variable_name": "totalCollateral" } } ], - "description": "Reentrancy in TempleLineOfCredit.removeCollateral(uint128,address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#166-190):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#173-177)\n\tState variables written after the call(s):\n\t- totalCollateral -= amount (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#181)\n", - "markdown": "Reentrancy in [TempleLineOfCredit.removeCollateral(uint128,address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L173-L177)\n\tState variables written after the call(s):\n\t- [totalCollateral -= amount](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L181)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190", - "id": "7e54b77ff600dbf6c2607432f645013fef59227e4ff7c91d2c9c62ef8ddf1980", - "check": "reentrancy-benign", + "description": "OpsManager.addRevenue(IERC20[],uint256[]) (contracts/core/OpsManager.sol#110-116) has external calls inside a loop: pools[exposureTokens[i]].addRevenue(amounts[i]) (contracts/core/OpsManager.sol#114)\n", + "markdown": "[OpsManager.addRevenue(IERC20[],uint256[])](contracts/core/OpsManager.sol#L110-L116) has external calls inside a loop: [pools[exposureTokens[i]].addRevenue(amounts[i])](contracts/core/OpsManager.sol#L114)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L110-L116", + "id": "5665a1327173172c99a94790114d41a7287eb453518635edd48056ecba261fa4", + "check": "calls-loop", "impact": "Low", "confidence": "Medium" }, @@ -19753,217 +20272,321 @@ "elements": [ { "type": "function", - "name": "burn", + "name": "increaseVaultTemple", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4415, + "length": 447, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [130, 131, 132, 133, 134, 135, 136, 137], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManager", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "burn(address)" + "signature": "increaseVaultTemple(Vault[],uint256[])" } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0)", + "name": "templeExposure.mint(address(vaults[i]),amountsTemple[i])", "source_mapping": { - "start": 6213, - "length": 35, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4788, + "length": 57, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [131], - "starting_column": 9, - "ending_column": 44 + "lines": [135], + "starting_column": 13, + "ending_column": 70 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "increaseVaultTemple", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 4415, + "length": 447, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 - ], + "lines": [130, 131, 132, 133, 134, 135, 136, 137], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManager", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "burn(address)" + "signature": "increaseVaultTemple(Vault[],uint256[])" } } + } + } + ], + "description": "OpsManager.increaseVaultTemple(Vault[],uint256[]) (contracts/core/OpsManager.sol#130-137) has external calls inside a loop: templeExposure.mint(address(vaults[i]),amountsTemple[i]) (contracts/core/OpsManager.sol#135)\n", + "markdown": "[OpsManager.increaseVaultTemple(Vault[],uint256[])](contracts/core/OpsManager.sol#L130-L137) has external calls inside a loop: [templeExposure.mint(address(vaults[i]),amountsTemple[i])](contracts/core/OpsManager.sol#L135)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L130-L137", + "id": "73ad477fce052d6df52f4050312b09c115d39ab6a4163386fdb2d902cdf8d2a5", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "liquidateExposures", + "source_mapping": { + "start": 5058, + "length": 531, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "liquidateExposures(Vault[],IERC20[])" + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "exposures[i] = pools[exposureTokens[i]].exposure()", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5314, + "length": 50, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [148], + "starting_column": 13, + "ending_column": 63 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "liquidateExposures", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5058, + "length": 531, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManager", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "liquidateExposures(Vault[],IERC20[])" } } + } + } + ], + "description": "OpsManager.liquidateExposures(Vault[],IERC20[]) (contracts/core/OpsManager.sol#144-155) has external calls inside a loop: exposures[i] = pools[exposureTokens[i]].exposure() (contracts/core/OpsManager.sol#148)\n", + "markdown": "[OpsManager.liquidateExposures(Vault[],IERC20[])](contracts/core/OpsManager.sol#L144-L155) has external calls inside a loop: [exposures[i] = pools[exposureTokens[i]].exposure()](contracts/core/OpsManager.sol#L148)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L144-L155", + "id": "ead7d436da8a29569022b48ffddbfceb808c4dd315ce7ca9d743dc5226a168dc", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "liquidateExposures", + "source_mapping": { + "start": 5058, + "length": 531, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "liquidateExposures(Vault[],IERC20[])" + } }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1)", + "name": "vaults[i_scope_0].redeemExposures(exposures)", "source_mapping": { - "start": 6258, - "length": 35, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5536, + "length": 36, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [132], - "starting_column": 9, - "ending_column": 44 + "lines": [153], + "starting_column": 13, + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "liquidateExposures", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 5058, + "length": 531, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155 ], "starting_column": 5, "ending_column": 6 @@ -19971,134 +20594,236 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManager", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "burn(address)" + "signature": "liquidateExposures(Vault[],IERC20[])" } } + } + } + ], + "description": "OpsManager.liquidateExposures(Vault[],IERC20[]) (contracts/core/OpsManager.sol#144-155) has external calls inside a loop: vaults[i_scope_0].redeemExposures(exposures) (contracts/core/OpsManager.sol#153)\n", + "markdown": "[OpsManager.liquidateExposures(Vault[],IERC20[])](contracts/core/OpsManager.sol#L144-L155) has external calls inside a loop: [vaults[i_scope_0].redeemExposures(exposures)](contracts/core/OpsManager.sol#L153)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L144-L155", + "id": "03a21ffca7a3586cab7fab91c4d3c7df01b444412ef9a937d63e8d95d7ef5075", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "requiresRebalance", + "source_mapping": { + "start": 2821, + "length": 553, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + } }, { "type": "node", - "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", + "name": "(inWindow) = vaults[i].inEnterExitWindow()", "source_mapping": { - "start": 1972, - "length": 91, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3101, + "length": 49, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [50], - "starting_column": 9, - "ending_column": 100 + "lines": [86], + "starting_column": 13, + "ending_column": 62 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_safeTransfer", + "name": "requiresRebalance", "source_mapping": { - "start": 1892, - "length": 284, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2821, + "length": 553, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [49, 50, 51, 52], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_safeTransfer(address,address,uint256)" + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { + } + } + ], + "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) has external calls inside a loop: (inWindow) = vaults[i].inEnterExitWindow() (contracts/core/OpsManagerLib.sol#86)\n", + "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) has external calls inside a loop: [(inWindow) = vaults[i].inEnterExitWindow()](contracts/core/OpsManagerLib.sol#L86)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", + "id": "33abe3219d901465ec0025ed3b5cee25a23e8e043748dac853f60e352579796c", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "requiresRebalance", + "source_mapping": { + "start": 2821, + "length": 553, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" + } + }, + { "type": "node", - "name": "Burn(msg.sender,amount0,amount1,to)", + "name": "requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare()", "source_mapping": { - "start": 6485, - "length": 43, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3233, + "length": 92, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [137], - "starting_column": 9, - "ending_column": 52 + "lines": [91], + "starting_column": 13, + "ending_column": 105 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "requiresRebalance", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 2821, + "length": 553, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95 ], "starting_column": 5, "ending_column": 6 @@ -20106,134 +20831,229 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "requiresRebalance(Vault[],TreasuryFarmingRevenue)" } } + } + } + ], + "description": "OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue) (contracts/core/OpsManagerLib.sol#79-95) has external calls inside a loop: requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare() (contracts/core/OpsManagerLib.sol#91)\n", + "markdown": "[OpsManagerLib.requiresRebalance(Vault[],TreasuryFarmingRevenue)](contracts/core/OpsManagerLib.sol#L79-L95) has external calls inside a loop: [requiresUpdate[i] = farmingPool.shares(address(vaults[i])) != vaults[i].targetRevenueShare()](contracts/core/OpsManagerLib.sol#L91)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L79-L95", + "id": "291eba1d32cb690e10f4480f7b32b2bae6d005ffbf40558ffd08cf8b0ce6ee4d", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "updateExposureReval", + "source_mapping": { + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "event" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + } }, { "type": "node", - "name": "Sync(reserve0,reserve1)", + "name": "exposure = pools[exposureTokens[i]].exposure()", "source_mapping": { - "start": 3918, - "length": 29, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3725, + "length": 55, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [92], - "starting_column": 9, - "ending_column": 38 + "lines": [101], + "starting_column": 13, + "ending_column": 68 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "updateExposureReval", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" } } + } + } + ], + "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure = pools[exposureTokens[i]].exposure() (contracts/core/OpsManagerLib.sol#101)\n", + "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure = pools[exposureTokens[i]].exposure()](contracts/core/OpsManagerLib.sol#L101)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", + "id": "29cef7ed2793cf3d146be2fdec55418a2cdf263801d54510013749346bac88f3", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "updateExposureReval", + "source_mapping": { + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "event" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "currentReval = exposure.reval()", "source_mapping": { - "start": 6426, - "length": 49, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3794, + "length": 39, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [136], - "starting_column": 9, - "ending_column": 58 + "lines": [102], + "starting_column": 13, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "burn", + "name": "updateExposureReval", "source_mapping": { - "start": 5241, - "length": 1294, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138 + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ], "starting_column": 5, "ending_column": 6 @@ -20241,46 +21061,39 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "burn(address)" + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" } } - }, - "additional_fields": { "underlying_type": "event" } + } } ], - "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tEvent emitted after the call(s):\n\t- Burn(msg.sender,amount0,amount1,to) (contracts/amm/TempleUniswapV2Pair.sol#137)\n\t- Sync(reserve0,reserve1) (contracts/amm/TempleUniswapV2Pair.sol#92)\n\t\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tEvent emitted after the call(s):\n\t- [Burn(msg.sender,amount0,amount1,to)](contracts/amm/TempleUniswapV2Pair.sol#L137)\n\t- [Sync(reserve0,reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L92)\n\t\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", - "id": "127a57c69604f2ba16f4cd02c712486dff1968238a1c69ead2035920584207c2", - "check": "reentrancy-events", + "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: currentReval = exposure.reval() (contracts/core/OpsManagerLib.sol#102)\n", + "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [currentReval = exposure.reval()](contracts/core/OpsManagerLib.sol#L102)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", + "id": "4b9ed20c5dffb0bb937e8e35bc5da6f0e0de33bda4b92ca4b5f843554466cbbc", + "check": "calls-loop", "impact": "Low", "confidence": "Medium" }, @@ -20288,18 +21101,16 @@ "elements": [ { "type": "function", - "name": "swap", + "name": "updateExposureReval", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ], "starting_column": 5, "ending_column": 6 @@ -20307,65 +21118,57 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" } }, { "type": "node", - "name": "_safeTransfer(_token0,to,amount0Out)", + "name": "exposure.decreaseReval(currentReval - revals[i])", "source_mapping": { - "start": 7388, - "length": 38, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3895, + "length": 48, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, - "lines": [153], - "starting_column": 29, - "ending_column": 67 + "lines": [104], + "starting_column": 17, + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "updateExposureReval", "source_mapping": { - "start": 6644, - "length": 1950, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 ], "starting_column": 5, "ending_column": 6 @@ -20373,40 +21176,403 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "OpsManagerLib", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure.decreaseReval(currentReval - revals[i]) (contracts/core/OpsManagerLib.sol#104)\n", + "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure.decreaseReval(currentReval - revals[i])](contracts/core/OpsManagerLib.sol#L104)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", + "id": "2a8d232e2a9bf6e56bf39af5ffd6e5e36613e5a9aa77a6691551c45c0092abf8", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "updateExposureReval", + "source_mapping": { + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + } + }, + { + "type": "node", + "name": "exposure.increaseReval(revals[i] - currentReval)", + "source_mapping": { + "start": 3982, + "length": 48, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [106], + "starting_column": 17, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "updateExposureReval", + "source_mapping": { + "start": 3380, + "length": 681, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManagerLib", + "source_mapping": { + "start": 158, + "length": 3905, + "filename_relative": "contracts/core/OpsManagerLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManagerLib.sol", + "filename_short": "contracts/core/OpsManagerLib.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))" + } + } + } + } + ], + "description": "OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue)) (contracts/core/OpsManagerLib.sol#97-109) has external calls inside a loop: exposure.increaseReval(revals[i] - currentReval) (contracts/core/OpsManagerLib.sol#106)\n", + "markdown": "[OpsManagerLib.updateExposureReval(IERC20[],uint256[],mapping(IERC20 => TreasuryFarmingRevenue))](contracts/core/OpsManagerLib.sol#L97-L109) has external calls inside a loop: [exposure.increaseReval(revals[i] - currentReval)](contracts/core/OpsManagerLib.sol#L106)\n", + "first_markdown_element": "contracts/core/OpsManagerLib.sol#L97-L109", + "id": "02b2b95f67586f3365a9cc8e6b95fd4d48a424694b15f84a5b362f195ca5b007", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "redeemExposures", + "source_mapping": { + "start": 4673, + "length": 251, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [113, 114, 115, 116, 117, 118, 119], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "redeemExposures(Exposure[])" + } + }, + { + "type": "node", + "name": "exposures[i].redeem()", + "source_mapping": { + "start": 4817, + "length": 21, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [115], + "starting_column": 13, + "ending_column": 34 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "redeemExposures", + "source_mapping": { + "start": 4673, + "length": 251, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [113, 114, 115, 116, 117, 118, 119], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "redeemExposures(Exposure[])" + } + } + } + } + ], + "description": "Vault.redeemExposures(Exposure[]) (contracts/core/Vault.sol#113-119) has external calls inside a loop: exposures[i].redeem() (contracts/core/Vault.sol#115)\n", + "markdown": "[Vault.redeemExposures(Exposure[])](contracts/core/Vault.sol#L113-L119) has external calls inside a loop: [exposures[i].redeem()](contracts/core/Vault.sol#L115)\n", + "first_markdown_element": "contracts/core/Vault.sol#L113-L119", + "id": "01aa5d049bc48e72ff906b543385ff9caecb8e5566910551f607713f18675e33", + "check": "calls-loop", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "burn", + "source_mapping": { + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "burn(address)" + } + }, + { + "type": "node", + "name": "_safeTransfer(_token0,to,amount0)", + "source_mapping": { + "start": 6213, + "length": 35, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [131], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "burn", + "source_mapping": { + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "burn(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, { "type": "node", "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", @@ -20475,33 +21641,32 @@ }, { "type": "node", - "name": "_safeTransfer(_token1,to,amount1Out)", + "name": "_safeTransfer(_token1,to,amount1)", "source_mapping": { - "start": 7490, - "length": 38, + "start": 6258, + "length": 35, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [154], - "starting_column": 29, - "ending_column": 67 + "lines": [132], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -20537,7 +21702,7 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, @@ -20611,33 +21776,32 @@ }, { "type": "node", - "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", + "name": "_safeTransfer(_token0,to,amount0)", "source_mapping": { - "start": 7593, - "length": 76, + "start": 6213, + "length": 35, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [155], - "starting_column": 30, - "ending_column": 106 + "lines": [131], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "burn", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 ], "starting_column": 5, "ending_column": 6 @@ -20673,42 +21837,38 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 8516, - "length": 71, + "start": 1972, + "length": 91, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [169], + "lines": [50], "starting_column": 9, - "ending_column": 80 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "_safeTransfer", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 1892, + "length": 284, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, @@ -20743,38 +21903,41 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "Sync(reserve0,reserve1)", + "name": "_safeTransfer(_token1,to,amount1)", "source_mapping": { - "start": 3918, - "length": 29, + "start": 6258, + "length": 35, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [92], + "lines": [132], "starting_column": 9, - "ending_column": 38 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "burn", "source_mapping": { - "start": 3107, - "length": 847, + "start": 5241, + "length": 1294, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, @@ -20809,42 +21972,38 @@ "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "_update(balance0,balance1,_reserve0,_reserve1)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 8457, - "length": 49, + "start": 1972, + "length": 91, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [168], + "lines": [50], "starting_column": 9, - "ending_column": 58 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "swap", + "name": "_safeTransfer", "source_mapping": { - "start": 6644, - "length": 1950, + "start": 1892, + "length": 284, "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170 - ], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, @@ -20879,352 +22038,300 @@ "ending_column": 0 } }, - "signature": "swap(uint256,uint256,address,bytes)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tEvent emitted after the call(s):\n\t- Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to) (contracts/amm/TempleUniswapV2Pair.sol#169)\n\t- Sync(reserve0,reserve1) (contracts/amm/TempleUniswapV2Pair.sol#92)\n\t\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n", - "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tEvent emitted after the call(s):\n\t- [Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)](contracts/amm/TempleUniswapV2Pair.sol#L169)\n\t- [Sync(reserve0,reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L92)\n\t\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", - "id": "702607b50ee9e5b85f6e9be980d2529af09be332237e0acb690cb814df52cb87", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "adhocPayment", - "source_mapping": { - "start": 2861, - "length": 284, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", - "is_dependency": false, - "lines": [83, 84, 85, 86, 87, 88], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPayments", - "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", - "is_dependency": false, - "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "adhocPayment(address,uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(TEMPLE,_to,_amount)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3058, - "length": 44, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 6426, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [86], + "lines": [136], "starting_column": 9, - "ending_column": 53 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "adhocPayment", + "name": "burn", "source_mapping": { - "start": 2861, - "length": 284, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [83, 84, 85, 86, 87, 88], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPayments", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "adhocPayment(address,uint256)" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price0CumulativeLast" + } }, { "type": "node", - "name": "Claimed(_to,_amount)", + "name": "price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed", "source_mapping": { - "start": 3112, - "length": 26, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 3587, + "length": 88, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [87], - "starting_column": 9, - "ending_column": 35 + "lines": [86], + "starting_column": 13, + "ending_column": 101 }, "type_specific_fields": { "parent": { "type": "function", - "name": "adhocPayment", + "name": "_update", "source_mapping": { - "start": 2861, - "length": 284, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [83, 84, 85, 86, 87, 88], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPayments", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "adhocPayment(address,uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleTeamPayments.adhocPayment(address,uint256) (contracts/admin/TempleTeamPayments.sol#83-88):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(TEMPLE,_to,_amount) (contracts/admin/TempleTeamPayments.sol#86)\n\tEvent emitted after the call(s):\n\t- Claimed(_to,_amount) (contracts/admin/TempleTeamPayments.sol#87)\n", - "markdown": "Reentrancy in [TempleTeamPayments.adhocPayment(address,uint256)](contracts/admin/TempleTeamPayments.sol#L83-L88):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(TEMPLE,_to,_amount)](contracts/admin/TempleTeamPayments.sol#L86)\n\tEvent emitted after the call(s):\n\t- [Claimed(_to,_amount)](contracts/admin/TempleTeamPayments.sol#L87)\n", - "first_markdown_element": "contracts/admin/TempleTeamPayments.sol#L83-L88", - "id": "081d1dfdebd16cea0856cb988c13c62e2d2d6e5c3fbd25c36620643fb11a0000", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "claim", - "source_mapping": { - "start": 2500, - "length": 355, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", - "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPayments", - "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", - "is_dependency": false, - "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "claim()" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price0CumulativeLast" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 2750, - "length": 53, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 6426, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [79], + "lines": [136], "starting_column": 9, - "ending_column": 62 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claim", + "name": "burn", "source_mapping": { - "start": 2500, - "length": 355, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPayments", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "claim()" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price1CumulativeLast" + } }, { "type": "node", - "name": "Claimed(msg.sender,claimable)", + "name": "price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed", "source_mapping": { - "start": 2813, - "length": 35, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 3689, + "length": 88, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80], - "starting_column": 9, - "ending_column": 44 + "lines": [87], + "starting_column": 13, + "ending_column": 101 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claim", + "name": "_update", "source_mapping": { - "start": 2500, - "length": 355, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPayments", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 247, - "length": 3150, - "filename_relative": "contracts/admin/TempleTeamPayments.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", - "filename_short": "contracts/admin/TempleTeamPayments.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "claim()" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price1CumulativeLast" + } } ], - "description": "Reentrancy in TempleTeamPayments.claim() (contracts/admin/TempleTeamPayments.sol#74-81):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable) (contracts/admin/TempleTeamPayments.sol#79)\n\tEvent emitted after the call(s):\n\t- Claimed(msg.sender,claimable) (contracts/admin/TempleTeamPayments.sol#80)\n", - "markdown": "Reentrancy in [TempleTeamPayments.claim()](contracts/admin/TempleTeamPayments.sol#L74-L81):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable)](contracts/admin/TempleTeamPayments.sol#L79)\n\tEvent emitted after the call(s):\n\t- [Claimed(msg.sender,claimable)](contracts/admin/TempleTeamPayments.sol#L80)\n", - "first_markdown_element": "contracts/admin/TempleTeamPayments.sol#L74-L81", - "id": "5122a045d2e21480d0560d2c58820df1a98500cfc6453d3088b53c090e7d16e3", - "check": "reentrancy-events", + "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#86)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n\t\t- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#87)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L86)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n\t\t- [price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L87)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", + "id": "d6f7e9923264688e14af684f9180e869a190d782f4a8ab55d1efa22ac6b2ec72", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -21232,263 +22339,256 @@ "elements": [ { "type": "function", - "name": "claim", + "name": "swap", "source_mapping": { - "start": 2491, - "length": 452, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsV2", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "claim(uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(temple,msg.sender,_claimAmount)", + "name": "_safeTransfer(_token0,to,amount0Out)", "source_mapping": { - "start": 2832, - "length": 56, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 7388, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [83], - "starting_column": 9, - "ending_column": 65 + "lines": [153], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claim", + "name": "swap", "source_mapping": { - "start": 2491, - "length": 452, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsV2", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "claim(uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "Claimed(msg.sender,_claimAmount)", + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "swap(uint256,uint256,address,bytes)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 2898, - "length": 38, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [84], + "lines": [50], "starting_column": 9, - "ending_column": 47 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claim", + "name": "_safeTransfer", "source_mapping": { - "start": 2491, - "length": 452, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsV2", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "claim(uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleTeamPaymentsV2.claim(uint256) (contracts/admin/TempleTeamPaymentsV2.sol#74-85):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(temple,msg.sender,_claimAmount) (contracts/admin/TempleTeamPaymentsV2.sol#83)\n\tEvent emitted after the call(s):\n\t- Claimed(msg.sender,_claimAmount) (contracts/admin/TempleTeamPaymentsV2.sol#84)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsV2.claim(uint256)](contracts/admin/TempleTeamPaymentsV2.sol#L74-L85):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(temple,msg.sender,_claimAmount)](contracts/admin/TempleTeamPaymentsV2.sol#L83)\n\tEvent emitted after the call(s):\n\t- [Claimed(msg.sender,_claimAmount)](contracts/admin/TempleTeamPaymentsV2.sol#L84)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsV2.sol#L74-L85", - "id": "e805076f6ba37558b2d1e1e33a36ca2141157b088d4472056b82f8af89078bb2", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "claimFor", - "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "claimFor(address)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "name": "_safeTransfer(_token1,to,amount1Out)", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 7490, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91], - "starting_column": 9, - "ending_column": 65 + "lines": [154], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "swap", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, @@ -21496,337 +22596,305 @@ }, { "type": "node", - "name": "RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 3280, - "length": 62, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [92], + "lines": [50], "starting_column": 9, - "ending_column": 71 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "_safeTransfer", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93):\n\tExternal calls:\n\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#92)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93):\n\tExternal calls:\n\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L92)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L80-L93", - "id": "d8563f03511a537e7bffa702571db6c52a8f76800b24690b23270dd982c4ccc2", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "createExposure", + "type": "node", + "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7593, + "length": 76, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], - "starting_column": 5, - "ending_column": 6 + "lines": [155], + "starting_column": 30, + "ending_column": 106 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "OpsManager", + "type": "function", + "name": "swap", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "swap(uint256,uint256,address,bytes)" } - }, - "signature": "createExposure(string,string,IERC20)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", + "name": "_safeTransfer(_token0,to,amount0Out)", "source_mapping": { - "start": 1546, - "length": 81, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7388, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [51], - "starting_column": 9, - "ending_column": 90 + "lines": [153], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createExposure", + "name": "swap", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createExposure(string,string,IERC20)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "CreateExposure(address(exposure),address(pools[revalToken]))", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 1684, - "length": 66, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [53], + "lines": [50], "starting_column": 9, - "ending_column": 75 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createExposure", + "name": "_safeTransfer", "source_mapping": { - "start": 1342, - "length": 415, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createExposure(string,string,IERC20)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in OpsManager.createExposure(string,string,IERC20) (contracts/core/OpsManager.sol#45-54):\n\tExternal calls:\n\t- exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools) (contracts/core/OpsManager.sol#51)\n\tEvent emitted after the call(s):\n\t- CreateExposure(address(exposure),address(pools[revalToken])) (contracts/core/OpsManager.sol#53)\n", - "markdown": "Reentrancy in [OpsManager.createExposure(string,string,IERC20)](contracts/core/OpsManager.sol#L45-L54):\n\tExternal calls:\n\t- [exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)](contracts/core/OpsManager.sol#L51)\n\tEvent emitted after the call(s):\n\t- [CreateExposure(address(exposure),address(pools[revalToken]))](contracts/core/OpsManager.sol#L53)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L45-L54", - "id": "4c0848edc4ba02c1e3d1ebe7d87498d178e87ad8a446b774ebd37d6847435833", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "createVaultInstance", - "source_mapping": { - "start": 1980, - "length": 804, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", - "is_dependency": false, - "lines": [ - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "OpsManager", - "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "templeExposure.setMinterState(address(vault),true)", + "name": "_safeTransfer(_token1,to,amount1Out)", "source_mapping": { - "start": 2676, - "length": 51, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 7490, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [87], - "starting_column": 9, - "ending_column": 60 + "lines": [154], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createVaultInstance", + "name": "swap", "source_mapping": { - "start": 1980, - "length": 804, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], "starting_column": 5, "ending_column": 6 @@ -21834,420 +22902,347 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "CreateVaultInstance(address(vault))", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 2737, - "length": 40, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [88], + "lines": [50], "starting_column": 9, - "ending_column": 49 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "createVaultInstance", + "name": "_safeTransfer", "source_mapping": { - "start": 1980, - "length": 804, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 - ], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "OpsManager", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 388, - "length": 6455, - "filename_relative": "contracts/core/OpsManager.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", - "filename_short": "contracts/core/OpsManager.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in OpsManager.createVaultInstance(string,string,uint256,uint256,Rational,uint256) (contracts/core/OpsManager.sol#63-89):\n\tExternal calls:\n\t- templeExposure.setMinterState(address(vault),true) (contracts/core/OpsManager.sol#87)\n\tEvent emitted after the call(s):\n\t- CreateVaultInstance(address(vault)) (contracts/core/OpsManager.sol#88)\n", - "markdown": "Reentrancy in [OpsManager.createVaultInstance(string,string,uint256,uint256,Rational,uint256)](contracts/core/OpsManager.sol#L63-L89):\n\tExternal calls:\n\t- [templeExposure.setMinterState(address(vault),true)](contracts/core/OpsManager.sol#L87)\n\tEvent emitted after the call(s):\n\t- [CreateVaultInstance(address(vault))](contracts/core/OpsManager.sol#L88)\n", - "first_markdown_element": "contracts/core/OpsManager.sol#L63-L89", - "id": "df955297def3da87ad4df693d7ae4b7e7f50baa97a7182d7ae0ddc97fdb09441", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "decreaseShares", - "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryFarmingRevenue", - "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", - "is_dependency": false, - "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "decreaseShares(address,uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "claimFor(account)", + "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", "source_mapping": { - "start": 2461, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 7593, + "length": 76, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [70], - "starting_column": 9, - "ending_column": 26 + "lines": [155], + "starting_column": 30, + "ending_column": 106 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "swap", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91], + "lines": [168], "starting_column": 9, - "ending_column": 65 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "swap", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price0CumulativeLast" + } }, { "type": "node", - "name": "DecreaseShares(account,amount)", + "name": "price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed", "source_mapping": { - "start": 2634, - "length": 36, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3587, + "length": 88, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [76], - "starting_column": 9, - "ending_column": 45 + "lines": [86], + "starting_column": 13, + "ending_column": 101 }, "type_specific_fields": { "parent": { "type": "function", - "name": "decreaseShares", + "name": "_update", "source_mapping": { - "start": 2375, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "decreaseShares(address,uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- DecreaseShares(account,amount) (contracts/core/TreasuryFarmingRevenue.sol#76)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [DecreaseShares(account,amount)](contracts/core/TreasuryFarmingRevenue.sol#L76)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", - "id": "10f84609b6b87bcc768aa396dd6ac6045289ca78c3cb64ee97e4437cfb7c006a", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "deployPayouts", - "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price0CumulativeLast" } }, { "type": "node", - "name": "paymentContract.initialize(_token)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3294, - "length": 34, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [89], + "lines": [168], "starting_column": 9, - "ending_column": 43 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "swap", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], "starting_column": 5, "ending_column": 6 @@ -22255,131 +23250,252 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price1CumulativeLast" + } }, { "type": "node", - "name": "paymentContract.setAllocations(_dests,_allocations)", + "name": "price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed", "source_mapping": { - "start": 3338, - "length": 52, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3689, + "length": 88, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [90], - "starting_column": 9, - "ending_column": 61 + "lines": [87], + "starting_column": 13, + "ending_column": 101 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "_update", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 - ], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "price1CumulativeLast" + } + } + ], + "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tState variables written after the call(s):\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#86)\n\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n\t\t- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (contracts/amm/TempleUniswapV2Pair.sol#87)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tState variables written after the call(s):\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L86)\n\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n\t\t- [price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed](contracts/amm/TempleUniswapV2Pair.sol#L87)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", + "id": "4009158fb72c6a7f799d45778765abe734e526aff7ec82c4bb4384d474895f3f", + "check": "reentrancy-benign", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "removeCollateral", + "source_mapping": { + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeCollateral(uint128,address)" + } }, { "type": "node", - "name": "paymentContract.transferOwnership(msg.sender)", + "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", "source_mapping": { - "start": 3401, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 7074, + "length": 118, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [92], + "lines": [173, 174, 175, 176, 177], "starting_column": 9, - "ending_column": 54 + "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "removeCollateral", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 ], "starting_column": 5, "ending_column": 6 @@ -22387,31 +23503,91 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "removeCollateral(uint128,address)" } } }, @@ -22419,33 +23595,32 @@ }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", + "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", "source_mapping": { - "start": 3493, - "length": 165, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 7074, + "length": 118, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [95, 96, 97, 98, 99, 100], - "starting_column": 13, - "ending_column": 14 + "lines": [173, 174, 175, 176, 177], + "starting_column": 9, + "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "removeCollateral", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 ], "starting_column": 5, "ending_column": 6 @@ -22453,65 +23628,124 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeCollateral(uint128,address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract))", + "name": "totalCollateral -= amount", "source_mapping": { - "start": 3735, - "length": 141, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 7347, + "length": 25, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [104, 105, 106, 107, 108, 109], + "lines": [181], "starting_column": 9, - "ending_column": 10 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "deployPayouts", + "name": "removeCollateral", "source_mapping": { - "start": 2838, - "length": 1078, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112 + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 ], "starting_column": 5, "ending_column": 6 @@ -22519,42 +23753,105 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + "signature": "removeCollateral(uint128,address)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalCollateral" + } } ], - "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tEvent emitted after the call(s):\n\t- FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract)) (contracts/admin/TempleTeamPaymentsFactory.sol#104-109)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tEvent emitted after the call(s):\n\t- [FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract))](contracts/admin/TempleTeamPaymentsFactory.sol#L104-L109)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", - "id": "e09076945359fed962d2ff6dfd37bfd369cd1b53e0192377da32895ae9a9f829", - "check": "reentrancy-events", + "description": "Reentrancy in TempleLineOfCredit.removeCollateral(uint128,address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#166-190):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#173-177)\n\tState variables written after the call(s):\n\t- totalCollateral -= amount (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#181)\n", + "markdown": "Reentrancy in [TempleLineOfCredit.removeCollateral(uint128,address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L173-L177)\n\tState variables written after the call(s):\n\t- [totalCollateral -= amount](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L181)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190", + "id": "7e54b77ff600dbf6c2607432f645013fef59227e4ff7c91d2c9c62ef8ddf1980", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -22562,17 +23859,17 @@ "elements": [ { "type": "function", - "name": "depositFor", + "name": "_distribute", "source_mapping": { - "start": 6905, - "length": 773, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22580,65 +23877,78 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGold", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 - ], - "starting_column": 1, - "ending_column": 2 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 } }, - "signature": "depositFor(address,uint256)" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount)", + "name": "staking.notifyDistribution(stakingAmount)", "source_mapping": { - "start": 7461, - "length": 82, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10748, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [187], + "lines": [240], "starting_column": 13, - "ending_column": 95 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositFor", + "name": "_distribute", "source_mapping": { - "start": 6905, - "length": 773, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22646,36 +23956,50 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGold", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 2, + "ending_column": 0 } }, - "signature": "depositFor(address,uint256)" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } }, @@ -22683,32 +24007,32 @@ }, { "type": "node", - "name": "templeExposureToken.mint(address(this),_amount)", + "name": "auction.notifyDistribution(auctionAmount)", "source_mapping": { - "start": 7557, - "length": 48, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 11012, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [188], + "lines": [246], "starting_column": 13, - "ending_column": 61 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositFor", + "name": "_distribute", "source_mapping": { - "start": 6905, - "length": 773, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22716,36 +24040,50 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGold", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 2, + "ending_column": 0 } }, - "signature": "depositFor(address,uint256)" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } }, @@ -22753,32 +24091,32 @@ }, { "type": "node", - "name": "Deposit(_account,_amount,amountStaked)", + "name": "staking.notifyDistribution(stakingAmount)", "source_mapping": { - "start": 7626, - "length": 45, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10748, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [191], - "starting_column": 9, + "lines": [240], + "starting_column": 13, "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositFor", + "name": "_distribute", "source_mapping": { - "start": 6905, - "length": 773, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22786,127 +24124,167 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGold", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 2, + "ending_column": 0 } }, - "signature": "depositFor(address,uint256)" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Vault.depositFor(address,uint256) (contracts/core/Vault.sol#176-192):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount) (contracts/core/Vault.sol#187)\n\t- templeExposureToken.mint(address(this),_amount) (contracts/core/Vault.sol#188)\n\tEvent emitted after the call(s):\n\t- Deposit(_account,_amount,amountStaked) (contracts/core/Vault.sol#191)\n", - "markdown": "Reentrancy in [Vault.depositFor(address,uint256)](contracts/core/Vault.sol#L176-L192):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount)](contracts/core/Vault.sol#L187)\n\t- [templeExposureToken.mint(address(this),_amount)](contracts/core/Vault.sol#L188)\n\tEvent emitted after the call(s):\n\t- [Deposit(_account,_amount,amountStaked)](contracts/core/Vault.sol#L191)\n", - "first_markdown_element": "contracts/core/Vault.sol#L176-L192", - "id": "9b7f364b05b547bddc816a0d5b06d8980808dad51839e6d4b0a54fad3ee65e71", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "directPayouts", + "type": "node", + "name": "auction.notifyDistribution(auctionAmount)", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 11012, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [246], + "starting_column": 13, + "ending_column": 54 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", + "type": "function", + "name": "_distribute", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } - }, - "signature": "directPayouts(IERC20,address[],uint256[])" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", + "name": "_circulatingSupply += mintAmount", "source_mapping": { - "start": 4662, - "length": 59, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 11367, + "length": 32, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [133], - "starting_column": 13, - "ending_column": 72 + "lines": [255], + "starting_column": 9, + "ending_column": 41 }, "type_specific_fields": { "parent": { "type": "function", - "name": "directPayouts", + "name": "_distribute", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22914,64 +24292,86 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleGold", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 2, + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_circulatingSupply" + } }, { "type": "node", - "name": "FundingPaid(lastPaidEpoch,_dests,_allocations)", + "name": "_totalDistributed += mintAmount", "source_mapping": { - "start": 4890, - "length": 53, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 11326, + "length": 31, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [142], + "lines": [254], "starting_column": 9, - "ending_column": 62 + "ending_column": 40 }, "type_specific_fields": { "parent": { "type": "function", - "name": "directPayouts", + "name": "_distribute", "source_mapping": { - "start": 4121, - "length": 829, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 ], "starting_column": 5, "ending_column": 6 @@ -22979,42 +24379,64 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleGold", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 2, + "ending_column": 0 } }, - "signature": "directPayouts(IERC20,address[],uint256[])" + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_totalDistributed" + } } ], - "description": "Reentrancy in TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,dest,value) (contracts/admin/TempleTeamPaymentsFactory.sol#133)\n\tEvent emitted after the call(s):\n\t- FundingPaid(lastPaidEpoch,_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#142)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)](contracts/admin/TempleTeamPaymentsFactory.sol#L133)\n\tEvent emitted after the call(s):\n\t- [FundingPaid(lastPaidEpoch,_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L142)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143", - "id": "6c80a1f2386bfefc5e825932ef0f67802c5f2af3857235cf886592ad9e720a6d", - "check": "reentrancy-events", + "description": "Reentrancy in TempleGold._distribute(ITempleGold.DistributionParams,uint256) (contracts/templegold/TempleGold.sol#236-257):\n\tExternal calls:\n\t- staking.notifyDistribution(stakingAmount) (contracts/templegold/TempleGold.sol#240)\n\t- auction.notifyDistribution(auctionAmount) (contracts/templegold/TempleGold.sol#246)\n\tState variables written after the call(s):\n\t- _circulatingSupply += mintAmount (contracts/templegold/TempleGold.sol#255)\n\t- _totalDistributed += mintAmount (contracts/templegold/TempleGold.sol#254)\n", + "markdown": "Reentrancy in [TempleGold._distribute(ITempleGold.DistributionParams,uint256)](contracts/templegold/TempleGold.sol#L236-L257):\n\tExternal calls:\n\t- [staking.notifyDistribution(stakingAmount)](contracts/templegold/TempleGold.sol#L240)\n\t- [auction.notifyDistribution(auctionAmount)](contracts/templegold/TempleGold.sol#L246)\n\tState variables written after the call(s):\n\t- [_circulatingSupply += mintAmount](contracts/templegold/TempleGold.sol#L255)\n\t- [_totalDistributed += mintAmount](contracts/templegold/TempleGold.sol#L254)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L236-L257", + "id": "59bf63d89c684f8dc76b8057b49f13b0ec083339070a1876c0988f9c29578afd", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -23022,97 +24444,168 @@ "elements": [ { "type": "function", - "name": "increaseShares", + "name": "_stake", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleGoldStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "_stake(address,uint256)" } }, { "type": "node", - "name": "claimFor(account)", + "name": "stakingToken.safeTransferFrom(msg.sender,address(this),_amount)", "source_mapping": { - "start": 2093, - "length": 17, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10728, + "length": 65, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [57], + "lines": [254], "starting_column": 9, - "ending_column": 26 + "ending_column": 74 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "_stake", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleGoldStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "_stake(address,uint256)" } } }, @@ -23120,57 +24613,94 @@ }, { "type": "node", - "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "name": "stakingToken.safeTransferFrom(msg.sender,address(this),_amount)", "source_mapping": { - "start": 3214, - "length": 56, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10728, + "length": 65, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [91], + "lines": [254], "starting_column": 9, - "ending_column": 65 + "ending_column": 74 }, "type_specific_fields": { "parent": { "type": "function", - "name": "claimFor", + "name": "_stake", "source_mapping": { - "start": 2738, - "length": 611, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleGoldStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "claimFor(address)" + "signature": "_stake(address,uint256)" } } }, @@ -23178,1517 +24708,1783 @@ }, { "type": "node", - "name": "IncreaseShares(account,amount)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 2266, - "length": 36, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [63], + "lines": [255], "starting_column": 9, - "ending_column": 45 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "increaseShares", + "name": "_stake", "source_mapping": { - "start": 2007, - "length": 302, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryFarmingRevenue", + "name": "TempleGoldStaking", "source_mapping": { - "start": 547, - "length": 3079, - "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", - "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "increaseShares(address,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- IncreaseShares(account,amount) (contracts/core/TreasuryFarmingRevenue.sol#63)\n", - "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [IncreaseShares(account,amount)](contracts/core/TreasuryFarmingRevenue.sol#L63)\n", - "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", - "id": "d4561252e63b6b2b82404c62a37f3524f0af810644056f99e52c4028a071621f", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "lockFor", - "source_mapping": { - "start": 943, - "length": 494, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", - "is_dependency": false, - "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53 - ], - "starting_column": 3, - "ending_column": 4 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "LockedOGTemple", - "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", - "is_dependency": false, - "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "lockFor(address,uint256,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_balances" } }, { "type": "node", - "name": "SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple)", + "name": "_balances[_for] += _amount", "source_mapping": { - "start": 1247, - "length": 111, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 16774, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [46, 47, 48, 49, 50, 51], - "starting_column": 5, - "ending_column": 6 + "lines": [431], + "starting_column": 9, + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "lockFor", + "name": "_applyStake", "source_mapping": { - "start": 943, - "length": 494, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 16652, + "length": 235, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53 - ], - "starting_column": 3, - "ending_column": 4 + "lines": [429, 430, 431, 432, 433, 434], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "LockedOGTemple", + "name": "TempleGoldStaking", "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "lockFor(address,uint256,uint256)" + "signature": "_applyStake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_balances" + } }, { "type": "node", - "name": "OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp)", + "name": "_moveDelegates(address(0),delegates[_for],_amount)", "source_mapping": { - "start": 1364, - "length": 68, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 10839, + "length": 52, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [52], - "starting_column": 5, - "ending_column": 73 + "lines": [256], + "starting_column": 9, + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "lockFor", + "name": "_stake", "source_mapping": { - "start": 943, - "length": 494, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53 - ], - "starting_column": 3, - "ending_column": 4 - }, + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 + }, "type_specific_fields": { "parent": { "type": "contract", - "name": "LockedOGTemple", + "name": "TempleGoldStaking", "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "lockFor(address,uint256,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in LockedOGTemple.lockFor(address,uint256,uint256) (contracts/deprecated/LockedOGTemple.sol#35-53):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple) (contracts/deprecated/LockedOGTemple.sol#46-51)\n\tEvent emitted after the call(s):\n\t- OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp) (contracts/deprecated/LockedOGTemple.sol#52)\n", - "markdown": "Reentrancy in [LockedOGTemple.lockFor(address,uint256,uint256)](contracts/deprecated/LockedOGTemple.sol#L35-L53):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple)](contracts/deprecated/LockedOGTemple.sol#L46-L51)\n\tEvent emitted after the call(s):\n\t- [OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp)](contracts/deprecated/LockedOGTemple.sol#L52)\n", - "first_markdown_element": "contracts/deprecated/LockedOGTemple.sol#L35-L53", - "id": "4230808e1cd7a4f58313604bd2841ce355116b1beb66b33f45e8990f931fb60f", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_checkpoints" + } + }, { - "type": "function", - "name": "recoverToken", + "type": "node", + "name": "_checkpoints[delegatee][nCheckpoints - 1].votes = newVotes", "source_mapping": { - "start": 2543, - "length": 244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20269, + "length": 58, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [73, 74, 75, 76, 77], - "starting_column": 5, - "ending_column": 6 + "lines": [518], + "starting_column": 13, + "ending_column": 71 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "VaultEarlyWithdraw", + "type": "function", + "name": "_writeCheckpoint", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" } - }, - "signature": "recoverToken(address,address,uint256)" + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_checkpoints" } }, { "type": "node", - "name": "IERC20(token).safeTransfer(to,amount)", + "name": "_checkpoints[delegatee][nCheckpoints] = Checkpoint(block.number,newVotes)", "source_mapping": { - "start": 2694, - "length": 38, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20358, + "length": 74, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [75], - "starting_column": 9, - "ending_column": 47 + "lines": [520], + "starting_column": 13, + "ending_column": 87 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "_writeCheckpoint", "source_mapping": { - "start": 2543, - "length": 244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [73, 74, 75, 76, 77], + "lines": [ + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultEarlyWithdraw", + "name": "TempleGoldStaking", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_checkpoints" + } }, { "type": "node", - "name": "TokenRecovered(token,to,amount)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 2742, - "length": 38, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [76], + "lines": [255], "starting_column": 9, - "ending_column": 47 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "_stake", "source_mapping": { - "start": 2543, - "length": 244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [73, 74, 75, 76, 77], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultEarlyWithdraw", + "name": "TempleGoldStaking", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in VaultEarlyWithdraw.recoverToken(address,address,uint256) (contracts/core/VaultEarlyWithdraw.sol#73-77):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/core/VaultEarlyWithdraw.sol#75)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(token,to,amount) (contracts/core/VaultEarlyWithdraw.sol#76)\n", - "markdown": "Reentrancy in [VaultEarlyWithdraw.recoverToken(address,address,uint256)](contracts/core/VaultEarlyWithdraw.sol#L73-L77):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/core/VaultEarlyWithdraw.sol#L75)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(token,to,amount)](contracts/core/VaultEarlyWithdraw.sol#L76)\n", - "first_markdown_element": "contracts/core/VaultEarlyWithdraw.sol#L73-L77", - "id": "1c3c00beda0eb4b0661cc31987f0cf4c864705a836f5da0004529d20a3b860b8", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "redeemAmount", - "source_mapping": { - "start": 3080, - "length": 296, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", - "is_dependency": false, - "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Exposure", - "source_mapping": { - "start": 362, - "length": 3840, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", - "is_dependency": false, - "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "redeemAmount(uint256,address)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "claimableRewards" } }, { "type": "node", - "name": "liquidator.toTemple(amount,to)", + "name": "claimableRewards[_account] = _earned(_account,rewardPerTokenCached)", "source_mapping": { - "start": 3261, - "length": 31, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 20895, + "length": 68, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [109], - "starting_column": 13, - "ending_column": 44 + "lines": [531], + "starting_column": 17, + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "redeemAmount", + "name": "updateReward", "source_mapping": { - "start": 3080, - "length": 296, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 20580, + "length": 507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], + "lines": [526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Exposure", + "name": "TempleGoldStaking", "source_mapping": { - "start": 362, - "length": 3840, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "redeemAmount(uint256,address)" + "signature": "updateReward(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "claimableRewards" + } }, { "type": "node", - "name": "Redeem(address(revalToken),msg.sender,to,amount)", + "name": "_moveDelegates(address(0),delegates[_for],_amount)", "source_mapping": { - "start": 3313, - "length": 56, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 10839, + "length": 52, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [112], + "lines": [256], "starting_column": 9, - "ending_column": 65 + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "redeemAmount", + "name": "_stake", "source_mapping": { - "start": 3080, - "length": 296, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Exposure", + "name": "TempleGoldStaking", "source_mapping": { - "start": 362, - "length": 3840, - "filename_relative": "contracts/core/Exposure.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", - "filename_short": "contracts/core/Exposure.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "redeemAmount(uint256,address)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Exposure.redeemAmount(uint256,address) (contracts/core/Exposure.sol#104-113):\n\tExternal calls:\n\t- liquidator.toTemple(amount,to) (contracts/core/Exposure.sol#109)\n\tEvent emitted after the call(s):\n\t- Redeem(address(revalToken),msg.sender,to,amount) (contracts/core/Exposure.sol#112)\n", - "markdown": "Reentrancy in [Exposure.redeemAmount(uint256,address)](contracts/core/Exposure.sol#L104-L113):\n\tExternal calls:\n\t- [liquidator.toTemple(amount,to)](contracts/core/Exposure.sol#L109)\n\tEvent emitted after the call(s):\n\t- [Redeem(address(revalToken),msg.sender,to,amount)](contracts/core/Exposure.sol#L112)\n", - "first_markdown_element": "contracts/core/Exposure.sol#L104-L113", - "id": "5c348eea3fa61ccb6c1609a61dfbf2ea3d76c031d344e46e4a98a0d17d2298c4", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdraw", - "source_mapping": { - "start": 1887, - "length": 562, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", - "is_dependency": false, - "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "VaultEarlyWithdraw", - "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", - "is_dependency": false, - "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdraw(address,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "numCheckpoints" } }, { "type": "node", - "name": "IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount)", + "name": "numCheckpoints[delegatee] = nCheckpoints + 1", "source_mapping": { - "start": 2179, - "length": 67, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20446, + "length": 44, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [62], - "starting_column": 9, - "ending_column": 76 + "lines": [521], + "starting_column": 13, + "ending_column": 57 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdraw", + "name": "_writeCheckpoint", "source_mapping": { - "start": 1887, - "length": 562, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "lines": [ + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultEarlyWithdraw", + "name": "TempleGoldStaking", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdraw(address,uint256)" + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "numCheckpoints" + } }, { "type": "node", - "name": "templeToken.safeTransfer(msg.sender,_templeAmount)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 2335, - "length": 51, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [65], + "lines": [255], "starting_column": 9, - "ending_column": 60 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdraw", + "name": "_stake", "source_mapping": { - "start": 1887, - "length": 562, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultEarlyWithdraw", + "name": "TempleGoldStaking", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdraw(address,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" + } }, { "type": "node", - "name": "EarlyWithdraw(msg.sender,_templeAmount)", + "name": "rewardPerTokenCached = rewardData.rewardPerTokenStored = uint216(_rewardPerToken())", "source_mapping": { - "start": 2397, - "length": 45, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20644, + "length": 91, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [67], - "starting_column": 9, - "ending_column": 54 + "lines": [528], + "starting_column": 13, + "ending_column": 104 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdraw", + "name": "updateReward", "source_mapping": { - "start": 1887, - "length": 562, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 20580, + "length": 507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "lines": [526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "VaultEarlyWithdraw", + "name": "TempleGoldStaking", "source_mapping": { - "start": 545, - "length": 2244, - "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", - "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdraw(address,uint256)" + "signature": "updateReward(address)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in VaultEarlyWithdraw.withdraw(address,uint256) (contracts/core/VaultEarlyWithdraw.sol#57-68):\n\tExternal calls:\n\t- IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#62)\n\t- templeToken.safeTransfer(msg.sender,_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#65)\n\tEvent emitted after the call(s):\n\t- EarlyWithdraw(msg.sender,_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#67)\n", - "markdown": "Reentrancy in [VaultEarlyWithdraw.withdraw(address,uint256)](contracts/core/VaultEarlyWithdraw.sol#L57-L68):\n\tExternal calls:\n\t- [IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L62)\n\t- [templeToken.safeTransfer(msg.sender,_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L65)\n\tEvent emitted after the call(s):\n\t- [EarlyWithdraw(msg.sender,_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L67)\n", - "first_markdown_element": "contracts/core/VaultEarlyWithdraw.sol#L57-L68", - "id": "7a41d062356aa90302a9b5d0829abad146259b6d909dd1702764a586f2839691", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdrawFor", - "source_mapping": { - "start": 8002, - "length": 349, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", - "is_dependency": false, - "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Vault", - "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdrawFor(address,address,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" } }, { "type": "node", - "name": "templeExposureToken.redeemAmount(_amount,_to)", + "name": "rewardData.lastUpdateTime = uint40(_lastTimeRewardApplicable(rewardData.periodFinish))", "source_mapping": { - "start": 8256, - "length": 46, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 20749, + "length": 86, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [207], - "starting_column": 9, - "ending_column": 55 + "lines": [529], + "starting_column": 13, + "ending_column": 99 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawFor", + "name": "updateReward", "source_mapping": { - "start": 8002, - "length": 349, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 20580, + "length": 507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawFor(address,address,uint256)" + "signature": "updateReward(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "rewardData" + } }, { "type": "node", - "name": "Withdraw(_account,_amount)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 8312, - "length": 32, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [208], + "lines": [255], "starting_column": 9, - "ending_column": 41 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawFor", + "name": "_stake", "source_mapping": { - "start": 8002, - "length": 349, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Vault", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1182, - "length": 7299, - "filename_relative": "contracts/core/Vault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", - "filename_short": "contracts/core/Vault.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawFor(address,address,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Vault.withdrawFor(address,address,uint256) (contracts/core/Vault.sol#200-209):\n\tExternal calls:\n\t- templeExposureToken.redeemAmount(_amount,_to) (contracts/core/Vault.sol#207)\n\tEvent emitted after the call(s):\n\t- Withdraw(_account,_amount) (contracts/core/Vault.sol#208)\n", - "markdown": "Reentrancy in [Vault.withdrawFor(address,address,uint256)](contracts/core/Vault.sol#L200-L209):\n\tExternal calls:\n\t- [templeExposureToken.redeemAmount(_amount,_to)](contracts/core/Vault.sol#L207)\n\tEvent emitted after the call(s):\n\t- [Withdraw(_account,_amount)](contracts/core/Vault.sol#L208)\n", - "first_markdown_element": "contracts/core/Vault.sol#L200-L209", - "id": "2ff96324c82420cceeabf74c571ad57f47606117de95c992bffac11206a305e2", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdrawFor", - "source_mapping": { - "start": 1642, - "length": 627, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", - "is_dependency": false, - "lines": [ - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81 - ], - "starting_column": 3, - "ending_column": 4 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "LockedOGTemple", - "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", - "is_dependency": false, - "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdrawFor(address,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "stakeTimes" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple)", + "name": "stakeTimes[_for] = block.timestamp", "source_mapping": { - "start": 2140, - "length": 65, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 16810, + "length": 34, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [79], - "starting_column": 5, - "ending_column": 70 + "lines": [432], + "starting_column": 9, + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawFor", + "name": "_applyStake", "source_mapping": { - "start": 1642, - "length": 627, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 16652, + "length": 235, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81 - ], - "starting_column": 3, - "ending_column": 4 + "lines": [429, 430, 431, 432, 433, 434], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "LockedOGTemple", + "name": "TempleGoldStaking", "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawFor(address,uint256)" + "signature": "_applyStake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "stakeTimes" + } }, { "type": "node", - "name": "OGTempleWithdraw(_staker,entry.BalanceOGTemple)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 2211, - "length": 53, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [80], - "starting_column": 5, - "ending_column": 58 + "lines": [255], + "starting_column": 9, + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawFor", + "name": "_stake", "source_mapping": { - "start": 1642, - "length": 627, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81 - ], - "starting_column": 3, - "ending_column": 4 + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "LockedOGTemple", + "name": "TempleGoldStaking", "source_mapping": { - "start": 213, - "length": 2143, - "filename_relative": "contracts/deprecated/LockedOGTemple.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", - "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawFor(address,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in LockedOGTemple.withdrawFor(address,uint256) (contracts/deprecated/LockedOGTemple.sol#62-81):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple) (contracts/deprecated/LockedOGTemple.sol#79)\n\tEvent emitted after the call(s):\n\t- OGTempleWithdraw(_staker,entry.BalanceOGTemple) (contracts/deprecated/LockedOGTemple.sol#80)\n", - "markdown": "Reentrancy in [LockedOGTemple.withdrawFor(address,uint256)](contracts/deprecated/LockedOGTemple.sol#L62-L81):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple)](contracts/deprecated/LockedOGTemple.sol#L79)\n\tEvent emitted after the call(s):\n\t- [OGTempleWithdraw(_staker,entry.BalanceOGTemple)](contracts/deprecated/LockedOGTemple.sol#L80)\n", - "first_markdown_element": "contracts/deprecated/LockedOGTemple.sol#L62-L81", - "id": "1121dbdb9cb432f782fa1dcd86b226568d78c9cf57bb807ccdc10360eed217f4", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdrawToken", - "source_mapping": { - "start": 1801, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [58, 59, 60, 61, 62], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdrawToken(IERC20,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalSupply" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(_token,msg.sender,_amount)", + "name": "totalSupply += _amount", "source_mapping": { - "start": 1936, - "length": 51, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 16742, + "length": 22, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [60], + "lines": [430], "starting_column": 9, - "ending_column": 60 + "ending_column": 31 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawToken", + "name": "_applyStake", "source_mapping": { - "start": 1801, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 16652, + "length": 235, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [58, 59, 60, 61, 62], + "lines": [429, 430, 431, 432, 433, 434], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsFactory", + "name": "TempleGoldStaking", "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdrawToken(IERC20,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "TokenRecovered(address(_token),_amount)", - "source_mapping": { - "start": 1997, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [61], - "starting_column": 9, - "ending_column": 54 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "withdrawToken", - "source_mapping": { - "start": 1801, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", - "is_dependency": false, - "lines": [58, 59, 60, 61, 62], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsFactory", - "source_mapping": { - "start": 279, - "length": 4673, - "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawToken(IERC20,uint256)" + "signature": "_applyStake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleTeamPaymentsFactory.withdrawToken(IERC20,uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#58-62):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(_token,msg.sender,_amount) (contracts/admin/TempleTeamPaymentsFactory.sol#60)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(address(_token),_amount) (contracts/admin/TempleTeamPaymentsFactory.sol#61)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsFactory.withdrawToken(IERC20,uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L58-L62):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(_token,msg.sender,_amount)](contracts/admin/TempleTeamPaymentsFactory.sol#L60)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(address(_token),_amount)](contracts/admin/TempleTeamPaymentsFactory.sol#L61)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L58-L62", - "id": "953d8875749802563ce4b05772559dd5c6f58bf7e3ad4f1c24b9968cf0977dca", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "withdrawToken", - "source_mapping": { - "start": 1920, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", - "is_dependency": false, - "lines": [59, 60, 61, 62, 63], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleTeamPaymentsV2", - "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", - "is_dependency": false, - "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withdrawToken(IERC20,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalSupply" } }, { "type": "node", - "name": "SafeERC20.safeTransfer(_token,msg.sender,_amount)", + "name": "_applyStake(_for,_amount)", "source_mapping": { - "start": 2055, - "length": 51, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [61], + "lines": [255], "starting_column": 9, - "ending_column": 60 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawToken", + "name": "_stake", "source_mapping": { - "start": 1920, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [59, 60, 61, 62, 63], + "lines": [250, 251, 252, 253, 254, 255, 256, 257], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsV2", + "name": "TempleGoldStaking", "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawToken(IERC20,uint256)" + "signature": "_stake(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "userRewardPerTokenPaid" + } }, { "type": "node", - "name": "TokenRecovered(address(_token),_amount)", + "name": "userRewardPerTokenPaid[_account] = uint256(rewardPerTokenCached)", "source_mapping": { - "start": 2116, - "length": 45, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 20981, + "length": 64, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [62], - "starting_column": 9, - "ending_column": 54 + "lines": [532], + "starting_column": 17, + "ending_column": 81 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawToken", + "name": "updateReward", "source_mapping": { - "start": 1920, - "length": 248, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 20580, + "length": 507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [59, 60, 61, 62, 63], + "lines": [526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTeamPaymentsV2", + "name": "TempleGoldStaking", "source_mapping": { - "start": 346, - "length": 2599, - "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", - "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "withdrawToken(IERC20,uint256)" + "signature": "updateReward(address)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "userRewardPerTokenPaid" + } } ], - "description": "Reentrancy in TempleTeamPaymentsV2.withdrawToken(IERC20,uint256) (contracts/admin/TempleTeamPaymentsV2.sol#59-63):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(_token,msg.sender,_amount) (contracts/admin/TempleTeamPaymentsV2.sol#61)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(address(_token),_amount) (contracts/admin/TempleTeamPaymentsV2.sol#62)\n", - "markdown": "Reentrancy in [TempleTeamPaymentsV2.withdrawToken(IERC20,uint256)](contracts/admin/TempleTeamPaymentsV2.sol#L59-L63):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(_token,msg.sender,_amount)](contracts/admin/TempleTeamPaymentsV2.sol#L61)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(address(_token),_amount)](contracts/admin/TempleTeamPaymentsV2.sol#L62)\n", - "first_markdown_element": "contracts/admin/TempleTeamPaymentsV2.sol#L59-L63", - "id": "1448ab1692e2240869b3f86449f76a8cb3919b98c18052b582afb147fffce7f0", - "check": "reentrancy-events", + "description": "Reentrancy in TempleGoldStaking._stake(address,uint256) (contracts/templegold/TempleGoldStaking.sol#250-257):\n\tExternal calls:\n\t- stakingToken.safeTransferFrom(msg.sender,address(this),_amount) (contracts/templegold/TempleGoldStaking.sol#254)\n\tState variables written after the call(s):\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- _balances[_for] += _amount (contracts/templegold/TempleGoldStaking.sol#431)\n\t- _moveDelegates(address(0),delegates[_for],_amount) (contracts/templegold/TempleGoldStaking.sol#256)\n\t\t- _checkpoints[delegatee][nCheckpoints - 1].votes = newVotes (contracts/templegold/TempleGoldStaking.sol#518)\n\t\t- _checkpoints[delegatee][nCheckpoints] = Checkpoint(block.number,newVotes) (contracts/templegold/TempleGoldStaking.sol#520)\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- claimableRewards[_account] = _earned(_account,rewardPerTokenCached) (contracts/templegold/TempleGoldStaking.sol#531)\n\t- _moveDelegates(address(0),delegates[_for],_amount) (contracts/templegold/TempleGoldStaking.sol#256)\n\t\t- numCheckpoints[delegatee] = nCheckpoints + 1 (contracts/templegold/TempleGoldStaking.sol#521)\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- rewardPerTokenCached = rewardData.rewardPerTokenStored = uint216(_rewardPerToken()) (contracts/templegold/TempleGoldStaking.sol#528)\n\t\t- rewardData.lastUpdateTime = uint40(_lastTimeRewardApplicable(rewardData.periodFinish)) (contracts/templegold/TempleGoldStaking.sol#529)\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- stakeTimes[_for] = block.timestamp (contracts/templegold/TempleGoldStaking.sol#432)\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- totalSupply += _amount (contracts/templegold/TempleGoldStaking.sol#430)\n\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n\t\t- userRewardPerTokenPaid[_account] = uint256(rewardPerTokenCached) (contracts/templegold/TempleGoldStaking.sol#532)\n", + "markdown": "Reentrancy in [TempleGoldStaking._stake(address,uint256)](contracts/templegold/TempleGoldStaking.sol#L250-L257):\n\tExternal calls:\n\t- [stakingToken.safeTransferFrom(msg.sender,address(this),_amount)](contracts/templegold/TempleGoldStaking.sol#L254)\n\tState variables written after the call(s):\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [_balances[_for] += _amount](contracts/templegold/TempleGoldStaking.sol#L431)\n\t- [_moveDelegates(address(0),delegates[_for],_amount)](contracts/templegold/TempleGoldStaking.sol#L256)\n\t\t- [_checkpoints[delegatee][nCheckpoints - 1].votes = newVotes](contracts/templegold/TempleGoldStaking.sol#L518)\n\t\t- [_checkpoints[delegatee][nCheckpoints] = Checkpoint(block.number,newVotes)](contracts/templegold/TempleGoldStaking.sol#L520)\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [claimableRewards[_account] = _earned(_account,rewardPerTokenCached)](contracts/templegold/TempleGoldStaking.sol#L531)\n\t- [_moveDelegates(address(0),delegates[_for],_amount)](contracts/templegold/TempleGoldStaking.sol#L256)\n\t\t- [numCheckpoints[delegatee] = nCheckpoints + 1](contracts/templegold/TempleGoldStaking.sol#L521)\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [rewardPerTokenCached = rewardData.rewardPerTokenStored = uint216(_rewardPerToken())](contracts/templegold/TempleGoldStaking.sol#L528)\n\t\t- [rewardData.lastUpdateTime = uint40(_lastTimeRewardApplicable(rewardData.periodFinish))](contracts/templegold/TempleGoldStaking.sol#L529)\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [stakeTimes[_for] = block.timestamp](contracts/templegold/TempleGoldStaking.sol#L432)\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [totalSupply += _amount](contracts/templegold/TempleGoldStaking.sol#L430)\n\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n\t\t- [userRewardPerTokenPaid[_account] = uint256(rewardPerTokenCached)](contracts/templegold/TempleGoldStaking.sol#L532)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L250-L257", + "id": "259949127bc1d92d32e1f22224a1f5c53c1e79fccf7066a57d82d78f1ed6c861", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -24696,18 +26492,17 @@ "elements": [ { "type": "function", - "name": "_burnDToken", + "name": "bid", "source_mapping": { - "start": 29999, - "length": 1179, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709 + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 ], "starting_column": 5, "ending_column": 6 @@ -24715,108 +26510,87 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "SpiceAuction", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + "signature": "bid(uint256)" } }, { "type": "node", - "name": "_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)", + "name": "IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)", "source_mapping": { - "start": 30398, - "length": 71, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11928, + "length": 65, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [688], + "lines": [239], "starting_column": 9, - "ending_column": 80 + "ending_column": 74 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_burnDToken", + "name": "bid", "source_mapping": { - "start": 29999, - "length": 1179, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709 + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 ], "starting_column": 5, "ending_column": 6 @@ -24824,82 +26598,60 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "SpiceAuction", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + "signature": "bid(uint256)" } } }, @@ -24907,33 +26659,32 @@ }, { "type": "node", - "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", + "name": "IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)", "source_mapping": { - "start": 31081, - "length": 90, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11928, + "length": 65, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [708], + "lines": [239], "starting_column": 9, - "ending_column": 99 + "ending_column": 74 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_burnDToken", + "name": "bid", "source_mapping": { - "start": 29999, - "length": 1179, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709 + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 ], "starting_column": 5, "ending_column": 6 @@ -24941,93 +26692,168 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "SpiceAuction", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + "signature": "bid(uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "depositors[msg.sender][epochId] += amount", + "source_mapping": { + "start": 12233, + "length": 41, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [243], + "starting_column": 9, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "depositors" + } } ], - "description": "Reentrancy in TreasuryReservesVault._burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256) (contracts/v2/TreasuryReservesVault.sol#677-709):\n\tExternal calls:\n\t- _burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount) (contracts/v2/TreasuryReservesVault.sol#688)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#708)\n", - "markdown": "Reentrancy in [TreasuryReservesVault._burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)](contracts/v2/TreasuryReservesVault.sol#L677-L709):\n\tExternal calls:\n\t- [_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)](contracts/v2/TreasuryReservesVault.sol#L688)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L708)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L677-L709", - "id": "39b30f51cb8e0f3bb137afd7388e494f2a117088a846eb999e1fe7c8a4337328", - "check": "reentrancy-events", + "description": "Reentrancy in SpiceAuction.bid(uint256) (contracts/templegold/SpiceAuction.sol#227-247):\n\tExternal calls:\n\t- IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount) (contracts/templegold/SpiceAuction.sol#239)\n\tState variables written after the call(s):\n\t- depositors[msg.sender][epochId] += amount (contracts/templegold/SpiceAuction.sol#243)\n", + "markdown": "Reentrancy in [SpiceAuction.bid(uint256)](contracts/templegold/SpiceAuction.sol#L227-L247):\n\tExternal calls:\n\t- [IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)](contracts/templegold/SpiceAuction.sol#L239)\n\tState variables written after the call(s):\n\t- [depositors[msg.sender][epochId] += amount](contracts/templegold/SpiceAuction.sol#L243)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L227-L247", + "id": "1f9b10ede8521896673c2385bcc43c61671131367a2128e7f0ea8d48c4da357c", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -25035,116 +26861,137 @@ "elements": [ { "type": "function", - "name": "_daiDeposit", + "name": "bid", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "bid(uint256)" } }, { "type": "node", - "name": "daiToUsds.daiToUsds(address(this),daiAmount)", + "name": "bidToken.safeTransferFrom(msg.sender,treasury,amount)", "source_mapping": { - "start": 7458, - "length": 45, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6511, + "length": 55, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [176], + "lines": [141], "starting_column": 9, - "ending_column": 54 + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "bid", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "bid(uint256)" } } }, @@ -25152,146 +26999,173 @@ }, { "type": "node", - "name": "usdsVaultToken.deposit(daiAmount,address(this))", + "name": "bidToken.safeTransferFrom(msg.sender,treasury,amount)", "source_mapping": { - "start": 7561, - "length": 48, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6511, + "length": 55, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [179], + "lines": [141], "starting_column": 9, - "ending_column": 57 + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "bid", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "bid(uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "DaiDeposited(daiAmount)", + "name": "depositors[msg.sender][epochIdCache] += amount", "source_mapping": { - "start": 7619, - "length": 28, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6625, + "length": 46, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [180], + "lines": [144], "starting_column": 9, - "ending_column": 37 + "ending_column": 55 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "bid", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "bid(uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "depositors" + } } ], - "description": "Reentrancy in SkyFarmBaseStrategy._daiDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#174-181):\n\tExternal calls:\n\t- daiToUsds.daiToUsds(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#176)\n\t- usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#180)\n", - "markdown": "Reentrancy in [SkyFarmBaseStrategy._daiDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181):\n\tExternal calls:\n\t- [daiToUsds.daiToUsds(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L176)\n\t- [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L180)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181", - "id": "42487f0aee09b0bb3df65a1b9008394a8c898a5f24ac966050e998d4fff1097d", - "check": "reentrancy-events", + "description": "Reentrancy in StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149):\n\tExternal calls:\n\t- bidToken.safeTransferFrom(msg.sender,treasury,amount) (contracts/templegold/StableGoldAuction.sol#141)\n\tState variables written after the call(s):\n\t- depositors[msg.sender][epochIdCache] += amount (contracts/templegold/StableGoldAuction.sol#144)\n", + "markdown": "Reentrancy in [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149):\n\tExternal calls:\n\t- [bidToken.safeTransferFrom(msg.sender,treasury,amount)](contracts/templegold/StableGoldAuction.sol#L141)\n\tState variables written after the call(s):\n\t- [depositors[msg.sender][epochIdCache] += amount](contracts/templegold/StableGoldAuction.sol#L144)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L138-L149", + "id": "0531316987f6cc40928ca12270babe31747bff11727edc7b9f4511f2ca256068", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -25299,116 +27173,110 @@ "elements": [ { "type": "function", - "name": "_daiWithdrawal", + "name": "createExposure", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "OpsManager", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_daiWithdrawal(uint256)" + "signature": "createExposure(string,string,IERC20)" } }, { "type": "node", - "name": "usdsVaultToken.withdraw(daiAmount,address(this),address(this))", + "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", "source_mapping": { - "start": 7770, - "length": 64, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1546, + "length": 81, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [185], + "lines": [51], "starting_column": 9, - "ending_column": 73 + "ending_column": 90 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiWithdrawal", + "name": "createExposure", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "OpsManager", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_daiWithdrawal(uint256)" + "signature": "createExposure(string,string,IERC20)" } } }, @@ -25416,146 +27284,143 @@ }, { "type": "node", - "name": "daiToUsds.usdsToDai(address(this),daiAmount)", + "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", "source_mapping": { - "start": 7871, - "length": 45, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1546, + "length": 81, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [188], + "lines": [51], "starting_column": 9, - "ending_column": 54 + "ending_column": 90 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiWithdrawal", + "name": "createExposure", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "OpsManager", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_daiWithdrawal(uint256)" + "signature": "createExposure(string,string,IERC20)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "revalTokens.push(address(revalToken))", "source_mapping": { - "start": 7926, - "length": 28, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1637, + "length": 37, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [189], + "lines": [52], "starting_column": 9, - "ending_column": 37 + "ending_column": 46 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiWithdrawal", + "name": "createExposure", "source_mapping": { - "start": 7660, - "length": 301, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, - "lines": [183, 184, 185, 186, 187, 188, 189, 190], + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "OpsManager", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_daiWithdrawal(uint256)" + "signature": "createExposure(string,string,IERC20)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "revalTokens" + } } ], - "description": "Reentrancy in SkyFarmBaseStrategy._daiWithdrawal(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#183-190):\n\tExternal calls:\n\t- usdsVaultToken.withdraw(daiAmount,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#185)\n\t- daiToUsds.usdsToDai(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#188)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#189)\n", - "markdown": "Reentrancy in [SkyFarmBaseStrategy._daiWithdrawal(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190):\n\tExternal calls:\n\t- [usdsVaultToken.withdraw(daiAmount,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L185)\n\t- [daiToUsds.usdsToDai(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L188)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L189)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190", - "id": "a699c320161b270181027cf3e08015c98a8dbbdadb7d1107f94429a042ac96b3", - "check": "reentrancy-events", + "description": "Reentrancy in OpsManager.createExposure(string,string,IERC20) (contracts/core/OpsManager.sol#45-54):\n\tExternal calls:\n\t- exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools) (contracts/core/OpsManager.sol#51)\n\tState variables written after the call(s):\n\t- revalTokens.push(address(revalToken)) (contracts/core/OpsManager.sol#52)\n", + "markdown": "Reentrancy in [OpsManager.createExposure(string,string,IERC20)](contracts/core/OpsManager.sol#L45-L54):\n\tExternal calls:\n\t- [exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)](contracts/core/OpsManager.sol#L51)\n\tState variables written after the call(s):\n\t- [revalTokens.push(address(revalToken))](contracts/core/OpsManager.sol#L52)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L45-L54", + "id": "51556a077db66dfc3240e846360a26235f1360662907e56d0702b662359b5526", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -25563,129 +27428,97 @@ "elements": [ { "type": "function", - "name": "_doShutdown", + "name": "decreaseShares", "source_mapping": { - "start": 12281, - "length": 502, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_doShutdown(bytes)" + "signature": "decreaseShares(address,uint256)" } }, { "type": "node", - "name": "(daiAvailable,sharesAvailable) = _checkpointDaiBalance()", + "name": "claimFor(account)", "source_mapping": { - "start": 12388, - "length": 74, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2461, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [295], + "lines": [70], "starting_column": 9, - "ending_column": 83 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_doShutdown", + "name": "decreaseShares", "source_mapping": { - "start": 12281, - "length": 502, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_doShutdown(bytes)" + "signature": "decreaseShares(address,uint256)" } } }, @@ -25693,74 +27526,57 @@ }, { "type": "node", - "name": "chi = pot.drip()", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [142], + "lines": [91], "starting_column": 9, - "ending_column": 69 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "claimFor", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_checkpointChi()" + "signature": "claimFor(address)" } } }, @@ -25768,149 +27584,115 @@ }, { "type": "node", - "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", + "name": "claimFor(account)", "source_mapping": { - "start": 12472, - "length": 45, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2461, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [296], + "lines": [70], "starting_column": 9, - "ending_column": 54 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_doShutdown", + "name": "decreaseShares", "source_mapping": { - "start": 12281, - "length": 502, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_doShutdown(bytes)" + "signature": "decreaseShares(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "pot.exit(sharesAmount)", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 11598, - "length": 22, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [279], + "lines": [91], "starting_column": 9, - "ending_column": 31 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "claimFor", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [278, 279, 280, 281, 282], - "starting_column": 5, - "ending_column": 6 + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "claimFor(address)" } } }, @@ -25918,365 +27700,317 @@ }, { "type": "node", - "name": "daiJoin.exit(address(this),daiAmount)", + "name": "totalShares -= amount", "source_mapping": { - "start": 11630, - "length": 38, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2524, + "length": 21, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [280], + "lines": [73], "starting_column": 9, - "ending_column": 47 + "ending_column": 30 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "decreaseShares", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "decreaseShares(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalShares" + } + } + ], + "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- totalShares -= amount (contracts/core/TreasuryFarmingRevenue.sol#73)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [totalShares -= amount](contracts/core/TreasuryFarmingRevenue.sol#L73)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", + "id": "0b0602eac2622c580688b404d63d57f1596371f95c0951d2b30d3754c6a94161", + "check": "reentrancy-benign", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "paymentContract.initialize(_token)", "source_mapping": { - "start": 11678, - "length": 28, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3294, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [281], + "lines": [89], "starting_column": 9, - "ending_column": 37 + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "deployPayouts", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", + "name": "paymentContract.setAllocations(_dests,_allocations)", "source_mapping": { - "start": 12472, - "length": 45, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3338, + "length": 52, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [296], + "lines": [90], "starting_column": 9, - "ending_column": 54 + "ending_column": 61 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_doShutdown", + "name": "deployPayouts", "source_mapping": { - "start": 12281, - "length": 502, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_doShutdown(bytes)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in DsrBaseStrategy._doShutdown(bytes) (contracts/v2/strategies/DsrBaseStrategy.sol#293-303):\n\tExternal calls:\n\t- (daiAvailable,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#295)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#296)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#296)\n", - "markdown": "Reentrancy in [DsrBaseStrategy._doShutdown(bytes)](contracts/v2/strategies/DsrBaseStrategy.sol#L293-L303):\n\tExternal calls:\n\t- [(daiAvailable,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L295)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L296)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L296)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L293-L303", - "id": "2d01281faf7161866f00d8f2c914cd6f900f84c01032af46a90491363ac26414", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_dsrDeposit", - "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_dsrDeposit(uint256)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "shares = _rdiv(amount,_checkpointChi())", + "name": "paymentContract.transferOwnership(msg.sender)", "source_mapping": { - "start": 8249, - "length": 48, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3401, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [204], + "lines": [92], "starting_column": 9, - "ending_column": 57 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrDeposit", + "name": "deployPayouts", "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrDeposit(uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, @@ -26284,790 +28018,474 @@ }, { "type": "node", - "name": "chi = pot.drip()", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3493, + "length": 165, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [142], - "starting_column": 9, - "ending_column": 69 + "lines": [95, 96, 97, 98, 99, 100], + "starting_column": 13, + "ending_column": 14 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "deployPayouts", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_checkpointChi()" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "DaiDeposited(amount)", + "name": "paymentContract.initialize(_token)", "source_mapping": { - "start": 8308, - "length": 25, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3294, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [206], + "lines": [89], "starting_column": 9, - "ending_column": 34 + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrDeposit", + "name": "deployPayouts", "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrDeposit(uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in DsrBaseStrategy._dsrDeposit(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#201-209):\n\tExternal calls:\n\t- shares = _rdiv(amount,_checkpointChi()) (contracts/v2/strategies/DsrBaseStrategy.sol#204)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#206)\n", - "markdown": "Reentrancy in [DsrBaseStrategy._dsrDeposit(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L201-L209):\n\tExternal calls:\n\t- [shares = _rdiv(amount,_checkpointChi())](contracts/v2/strategies/DsrBaseStrategy.sol#L204)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L206)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L201-L209", - "id": "d7b6d2a10c4c72fb8ed18e875155e8f19fb9578527302b34acf8ce0824782543", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "_dsrWithdrawal", + "type": "node", + "name": "paymentContract.setAllocations(_dests,_allocations)", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3338, + "length": 52, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], - "starting_column": 5, - "ending_column": 6 + "lines": [90], + "starting_column": 9, + "ending_column": 61 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "DsrBaseStrategy", + "type": "function", + "name": "deployPayouts", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } - }, - "signature": "_dsrWithdrawal(uint256,uint256)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "pot.exit(sharesAmount)", + "name": "paymentContract.transferOwnership(msg.sender)", "source_mapping": { - "start": 11598, - "length": 22, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3401, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [279], + "lines": [92], "starting_column": 9, - "ending_column": 31 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "deployPayouts", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "daiJoin.exit(address(this),daiAmount)", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", "source_mapping": { - "start": 11630, - "length": 38, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3493, + "length": 165, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [280], - "starting_column": 9, - "ending_column": 47 + "lines": [95, 96, 97, 98, 99, 100], + "starting_column": 13, + "ending_column": 14 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "deployPayouts", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "incrementEpoch(address(paymentContract),_totalFunding)", "source_mapping": { - "start": 11678, - "length": 28, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3669, + "length": 55, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [281], + "lines": [102], "starting_column": 9, - "ending_column": 37 + "ending_column": 64 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "deployPayouts", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in DsrBaseStrategy._dsrWithdrawal(uint256,uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#278-282):\n\tExternal calls:\n\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n", - "markdown": "Reentrancy in [DsrBaseStrategy._dsrWithdrawal(uint256,uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L278-L282):\n\tExternal calls:\n\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L278-L282", - "id": "d35e410305415164f2083f99e160a70431f3fb38caf25144473d47103896e96b", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_mintDToken", - "source_mapping": { - "start": 28533, - "length": 1205, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochsFunded" } }, { "type": "node", - "name": "tokenConfig.dToken.mint(strategy,_newDebt)", - "source_mapping": { - "start": 29294, - "length": 43, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [657], - "starting_column": 13, - "ending_column": 56 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "_mintDToken", - "source_mapping": { - "start": 28533, - "length": 1205, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", + "name": "epochsFunded[lastPaidEpoch] = data", "source_mapping": { - "start": 29641, - "length": 90, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1754, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [669], + "lines": [55], "starting_column": 9, - "ending_column": 99 + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_mintDToken", + "name": "incrementEpoch", "source_mapping": { - "start": 28533, - "length": 1205, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1448, + "length": 347, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670 - ], + "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + "signature": "incrementEpoch(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochsFunded" + } } ], - "description": "Reentrancy in TreasuryReservesVault._mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256) (contracts/v2/TreasuryReservesVault.sol#638-670):\n\tExternal calls:\n\t- tokenConfig.dToken.mint(strategy,_newDebt) (contracts/v2/TreasuryReservesVault.sol#657)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#669)\n", - "markdown": "Reentrancy in [TreasuryReservesVault._mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)](contracts/v2/TreasuryReservesVault.sol#L638-L670):\n\tExternal calls:\n\t- [tokenConfig.dToken.mint(strategy,_newDebt)](contracts/v2/TreasuryReservesVault.sol#L657)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L669)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L638-L670", - "id": "d06d6a53d0451e137729438d3e1093db6d5e7f0f78494fe8b2a70bd44b393675", - "check": "reentrancy-events", + "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#102)\n\t\t- epochsFunded[lastPaidEpoch] = data (contracts/admin/TempleTeamPaymentsFactory.sol#55)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L102)\n\t\t- [epochsFunded[lastPaidEpoch] = data](contracts/admin/TempleTeamPaymentsFactory.sol#L55)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", + "id": "38547e1ee698a66798b081a9551aa0d534f4641810a5486cd31cdbdd25f55313", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -27075,116 +28493,111 @@ "elements": [ { "type": "function", - "name": "_vaultRedemption", + "name": "directPayouts", "source_mapping": { - "start": 7967, - "length": 343, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [192, 193, 194, 195, 196, 197, 198, 199], + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_vaultRedemption(uint256)" + "signature": "directPayouts(IERC20,address[],uint256[])" } }, { "type": "node", - "name": "daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this))", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", "source_mapping": { - "start": 8107, - "length": 76, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4662, + "length": 59, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [194], - "starting_column": 9, - "ending_column": 85 + "lines": [133], + "starting_column": 13, + "ending_column": 72 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_vaultRedemption", + "name": "directPayouts", "source_mapping": { - "start": 7967, - "length": 343, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [192, 193, 194, 195, 196, 197, 198, 199], + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_vaultRedemption(uint256)" + "signature": "directPayouts(IERC20,address[],uint256[])" } } }, @@ -27192,394 +28605,230 @@ }, { "type": "node", - "name": "daiToUsds.usdsToDai(address(this),daiAmount)", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", "source_mapping": { - "start": 8220, - "length": 45, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4662, + "length": 59, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [197], - "starting_column": 9, - "ending_column": 54 + "lines": [133], + "starting_column": 13, + "ending_column": 72 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_vaultRedemption", + "name": "directPayouts", "source_mapping": { - "start": 7967, - "length": 343, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [192, 193, 194, 195, 196, 197, 198, 199], + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_vaultRedemption(uint256)" + "signature": "directPayouts(IERC20,address[],uint256[])" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "incrementEpoch(address(this),totalFunding)", "source_mapping": { - "start": 8275, - "length": 28, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4836, + "length": 43, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [198], + "lines": [140], "starting_column": 9, - "ending_column": 37 + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_vaultRedemption", + "name": "directPayouts", "source_mapping": { - "start": 7967, - "length": 343, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [192, 193, 194, 195, 196, 197, 198, 199], + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "_vaultRedemption(uint256)" + "signature": "directPayouts(IERC20,address[],uint256[])" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in SkyFarmBaseStrategy._vaultRedemption(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#192-199):\n\tExternal calls:\n\t- daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#194)\n\t- daiToUsds.usdsToDai(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#197)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#198)\n", - "markdown": "Reentrancy in [SkyFarmBaseStrategy._vaultRedemption(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L192-L199):\n\tExternal calls:\n\t- [daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L194)\n\t- [daiToUsds.usdsToDai(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L197)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L198)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L192-L199", - "id": "b9fbdaafb7ad19fc9d756b8ea0203efc9dc4f9e7de006c75fe74cbc90c6b8bdd", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_withdrawFromBaseStrategy", - "source_mapping": { - "start": 25804, - "length": 2552, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochsFunded" } }, { "type": "node", - "name": "_withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount)", + "name": "epochsFunded[lastPaidEpoch] = data", "source_mapping": { - "start": 27290, - "length": 85, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1754, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [608], - "starting_column": 17, - "ending_column": 102 + "lines": [55], + "starting_column": 9, + "ending_column": 43 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_withdrawFromBaseStrategy", + "name": "incrementEpoch", "source_mapping": { - "start": 25804, - "length": 2552, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1448, + "length": 347, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 - ], + "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" + "signature": "incrementEpoch(address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "epochsFunded" + } }, { "type": "node", - "name": "_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))", + "name": "incrementEpoch(address(this),totalFunding)", "source_mapping": { - "start": 27553, - "length": 319, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 4836, + "length": 43, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [614, 615, 616, 617, 618, 619, 620, 621], - "starting_column": 21, - "ending_column": 22 + "lines": [140], + "starting_column": 9, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_withdrawFromBaseStrategy", + "name": "directPayouts", "source_mapping": { - "start": 25804, - "length": 2552, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 ], "starting_column": 5, "ending_column": 6 @@ -27587,445 +28836,110 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" + "signature": "directPayouts(IERC20,address[],uint256[])" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastPaidEpoch" + } }, { "type": "node", - "name": "_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)", + "name": "data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})", "source_mapping": { - "start": 30398, - "length": 71, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1562, + "length": 182, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [688], + "lines": [50, 51, 52, 53, 54], "starting_column": 9, - "ending_column": 80 + "ending_column": 11 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_burnDToken", + "name": "incrementEpoch", "source_mapping": { - "start": 29999, - "length": 1179, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1448, + "length": 347, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, - "lines": [ - 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709 - ], + "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "TempleTeamPaymentsFactory", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { - "type": "node", - "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", - "source_mapping": { - "start": 31081, - "length": 90, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [708], - "starting_column": 9, - "ending_column": 99 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "_burnDToken", - "source_mapping": { - "start": 29999, - "length": 1179, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "event" } - }, - { - "type": "node", - "name": "_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))", - "source_mapping": { - "start": 27553, - "length": 319, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [614, 615, 616, 617, 618, 619, 620, 621], - "starting_column": 21, - "ending_column": 22 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "_withdrawFromBaseStrategy", - "source_mapping": { - "start": 25804, - "length": 2552, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" + "signature": "incrementEpoch(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "lastPaidEpoch" + } } ], - "description": "Reentrancy in TreasuryReservesVault._withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256) (contracts/v2/TreasuryReservesVault.sol#582-632):\n\tExternal calls:\n\t- _withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount) (contracts/v2/TreasuryReservesVault.sol#608)\n\t- _burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr)) (contracts/v2/TreasuryReservesVault.sol#614-621)\n\t\t- _burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount) (contracts/v2/TreasuryReservesVault.sol#688)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#708)\n\t\t- _burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr)) (contracts/v2/TreasuryReservesVault.sol#614-621)\n", - "markdown": "Reentrancy in [TreasuryReservesVault._withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)](contracts/v2/TreasuryReservesVault.sol#L582-L632):\n\tExternal calls:\n\t- [_withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount)](contracts/v2/TreasuryReservesVault.sol#L608)\n\t- [_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))](contracts/v2/TreasuryReservesVault.sol#L614-L621)\n\t\t- [_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)](contracts/v2/TreasuryReservesVault.sol#L688)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L708)\n\t\t- [_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))](contracts/v2/TreasuryReservesVault.sol#L614-L621)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L582-L632", - "id": "89618dfba3ac7d15e5970daa2e83a543e99a75c999d6a13fbdd7a2d009309297", - "check": "reentrancy-events", + "description": "Reentrancy in TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,dest,value) (contracts/admin/TempleTeamPaymentsFactory.sol#133)\n\tState variables written after the call(s):\n\t- incrementEpoch(address(this),totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#140)\n\t\t- epochsFunded[lastPaidEpoch] = data (contracts/admin/TempleTeamPaymentsFactory.sol#55)\n\t- incrementEpoch(address(this),totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#140)\n\t\t- data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++}) (contracts/admin/TempleTeamPaymentsFactory.sol#50-54)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)](contracts/admin/TempleTeamPaymentsFactory.sol#L133)\n\tState variables written after the call(s):\n\t- [incrementEpoch(address(this),totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L140)\n\t\t- [epochsFunded[lastPaidEpoch] = data](contracts/admin/TempleTeamPaymentsFactory.sol#L55)\n\t- [incrementEpoch(address(this),totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L140)\n\t\t- [data = FundingData({paymentContract:address(_paymentContract),totalFunding:_totalFunding,epoch:lastPaidEpoch ++})](contracts/admin/TempleTeamPaymentsFactory.sol#L50-L54)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143", + "id": "e7d7cc7383e1682a576694bbc276f3a8cb1f5f6783434f8f5336ea3b0d9bf554", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -28033,19 +28947,16 @@ "elements": [ { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -28053,19 +28964,20 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, @@ -28100,50 +29012,42 @@ 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } }, { "type": "node", - "name": "_tokenVault.borrowProtocolToken(protocolTokenAmount,address(this))", + "name": "_distributeGold()", "source_mapping": { - "start": 20653, - "length": 67, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7794, + "length": 17, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [481], + "lines": [178], "starting_column": 9, - "ending_column": 76 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -28151,69 +29055,64 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } } }, @@ -28221,34 +29120,126 @@ }, { "type": "node", - "name": "_tokenVault.borrowQuoteToken(quoteTokenAmount,address(this))", + "name": "ITempleGold(address(rewardToken)).mint()", "source_mapping": { - "start": 20730, - "length": 61, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 18706, + "length": 40, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [482], + "lines": [477], "starting_column": 9, - "ending_column": 70 + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "_distributeGold", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 18600, + "length": 153, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [475, 476, 477, 478], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_distributeGold()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "_distributeGold()", + "source_mapping": { + "start": 7794, + "length": 17, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [178], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "distributeRewards", + "source_mapping": { + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -28256,209 +29247,191 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount)", + "name": "ITempleGold(address(rewardToken)).mint()", "source_mapping": { - "start": 20871, - "length": 80, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 18706, + "length": 40, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [486], - "starting_column": 13, - "ending_column": 93 + "lines": [477], + "starting_column": 9, + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "_distributeGold", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 18600, + "length": 153, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 - ], + "lines": [475, 476, 477, 478], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "_distributeGold()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "quoteToken.approve(address(balancerVault),0)", + "name": "nextRewardAmount = 0", "source_mapping": { - "start": 21130, - "length": 45, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8054, + "length": 20, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [489], - "starting_column": 17, - "ending_column": 62 + "lines": [182], + "starting_column": 9, + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -28466,104 +29439,99 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "nextRewardAmount" + } }, { "type": "node", - "name": "quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount)", + "name": "_notifyReward(rewardAmount)", "source_mapping": { - "start": 21193, - "length": 74, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8084, + "length": 27, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [490], - "starting_column": 17, - "ending_column": 91 + "lines": [183], + "starting_column": 9, + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "distributeRewards", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -28571,104 +29539,100 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "distributeRewards()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "nextRewardAmount" + } }, { "type": "node", - "name": "balancerVault.joinPool(balancerPoolId,address(this),address(this),request)", + "name": "nextRewardAmount = amount - (rewardData.rewardRate * rewardDurationCache)", "source_mapping": { - "start": 21410, - "length": 77, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 17644, + "length": 73, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [497], + "lines": [454], "starting_column": 13, - "ending_column": 90 + "ending_column": 86 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "_notifyReward", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], "starting_column": 5, "ending_column": 6 @@ -28676,104 +29640,100 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "_notifyReward(uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "nextRewardAmount" + } }, { "type": "node", - "name": "LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)", + "name": "nextRewardAmount = (amount + leftover) - (rewardData.rewardRate * rewardDurationCache)", "source_mapping": { - "start": 21686, - "length": 75, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 18014, + "length": 86, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [504], - "starting_column": 9, - "ending_column": 84 + "lines": [460], + "starting_column": 13, + "ending_column": 99 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "_notifyReward", "source_mapping": { - "start": 19877, - "length": 2088, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], "starting_column": 5, "ending_column": 6 @@ -28781,80 +29741,78 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "_notifyReward(uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "nextRewardAmount" + } } ], - "description": "Reentrancy in Ramos.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/amo/Ramos.sol#462-511):\n\tExternal calls:\n\t- _tokenVault.borrowProtocolToken(protocolTokenAmount,address(this)) (contracts/amo/Ramos.sol#481)\n\t- _tokenVault.borrowQuoteToken(quoteTokenAmount,address(this)) (contracts/amo/Ramos.sol#482)\n\t- protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount) (contracts/amo/Ramos.sol#486)\n\t- quoteToken.approve(address(balancerVault),0) (contracts/amo/Ramos.sol#489)\n\t- quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount) (contracts/amo/Ramos.sol#490)\n\t- balancerVault.joinPool(balancerPoolId,address(this),address(this),request) (contracts/amo/Ramos.sol#497)\n\tEvent emitted after the call(s):\n\t- LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) (contracts/amo/Ramos.sol#504)\n", - "markdown": "Reentrancy in [Ramos.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/amo/Ramos.sol#L462-L511):\n\tExternal calls:\n\t- [_tokenVault.borrowProtocolToken(protocolTokenAmount,address(this))](contracts/amo/Ramos.sol#L481)\n\t- [_tokenVault.borrowQuoteToken(quoteTokenAmount,address(this))](contracts/amo/Ramos.sol#L482)\n\t- [protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount)](contracts/amo/Ramos.sol#L486)\n\t- [quoteToken.approve(address(balancerVault),0)](contracts/amo/Ramos.sol#L489)\n\t- [quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount)](contracts/amo/Ramos.sol#L490)\n\t- [balancerVault.joinPool(balancerPoolId,address(this),address(this),request)](contracts/amo/Ramos.sol#L497)\n\tEvent emitted after the call(s):\n\t- [LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)](contracts/amo/Ramos.sol#L504)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L462-L511", - "id": "091d4b185888c9ea40fc206a3a47abe3a16a55f493010202d1ea982502231085", - "check": "reentrancy-events", + "description": "Reentrancy in TempleGoldStaking.distributeRewards() (contracts/templegold/TempleGoldStaking.sol#172-184):\n\tExternal calls:\n\t- _distributeGold() (contracts/templegold/TempleGoldStaking.sol#178)\n\t\t- ITempleGold(address(rewardToken)).mint() (contracts/templegold/TempleGoldStaking.sol#477)\n\tState variables written after the call(s):\n\t- nextRewardAmount = 0 (contracts/templegold/TempleGoldStaking.sol#182)\n\t- _notifyReward(rewardAmount) (contracts/templegold/TempleGoldStaking.sol#183)\n\t\t- nextRewardAmount = amount - (rewardData.rewardRate * rewardDurationCache) (contracts/templegold/TempleGoldStaking.sol#454)\n\t\t- nextRewardAmount = (amount + leftover) - (rewardData.rewardRate * rewardDurationCache) (contracts/templegold/TempleGoldStaking.sol#460)\n", + "markdown": "Reentrancy in [TempleGoldStaking.distributeRewards()](contracts/templegold/TempleGoldStaking.sol#L172-L184):\n\tExternal calls:\n\t- [_distributeGold()](contracts/templegold/TempleGoldStaking.sol#L178)\n\t\t- [ITempleGold(address(rewardToken)).mint()](contracts/templegold/TempleGoldStaking.sol#L477)\n\tState variables written after the call(s):\n\t- [nextRewardAmount = 0](contracts/templegold/TempleGoldStaking.sol#L182)\n\t- [_notifyReward(rewardAmount)](contracts/templegold/TempleGoldStaking.sol#L183)\n\t\t- [nextRewardAmount = amount - (rewardData.rewardRate * rewardDurationCache)](contracts/templegold/TempleGoldStaking.sol#L454)\n\t\t- [nextRewardAmount = (amount + leftover) - (rewardData.rewardRate * rewardDurationCache)](contracts/templegold/TempleGoldStaking.sol#L460)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L172-L184", + "id": "5322c246f24d8a80dd7c5036a8dda72a09e9b940c8059b5682d86eb78a78ecad", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -28862,123 +29820,97 @@ "elements": [ { "type": "function", - "name": "addLiquidity", + "name": "increaseShares", "source_mapping": { - "start": 7071, - "length": 365, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [181, 182, 183, 184, 185, 186, 187, 188], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "increaseShares(address,uint256)" } }, { "type": "node", - "name": "(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData)", + "name": "claimFor(account)", "source_mapping": { - "start": 7185, - "length": 161, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2093, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [182, 183, 184, 185, 186], + "lines": [57], "starting_column": 9, - "ending_column": 45 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "increaseShares", "source_mapping": { - "start": 7071, - "length": 365, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [181, 182, 183, 184, 185, 186, 187, 188], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "increaseShares(address,uint256)" } } }, @@ -28986,272 +29918,245 @@ }, { "type": "node", - "name": "AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 7356, - "length": 73, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [187], + "lines": [91], "starting_column": 9, - "ending_column": 82 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "addLiquidity", + "name": "claimFor", "source_mapping": { - "start": 7071, - "length": 365, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [181, 182, 183, 184, 185, 186, 187, 188], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" + "signature": "claimFor(address)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in RamosStrategy.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/v2/strategies/RamosStrategy.sol#181-188):\n\tExternal calls:\n\t- (quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData) (contracts/v2/strategies/RamosStrategy.sol#182-186)\n\tEvent emitted after the call(s):\n\t- AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) (contracts/v2/strategies/RamosStrategy.sol#187)\n", - "markdown": "Reentrancy in [RamosStrategy.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/v2/strategies/RamosStrategy.sol#L181-L188):\n\tExternal calls:\n\t- [(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData)](contracts/v2/strategies/RamosStrategy.sol#L182-L186)\n\tEvent emitted after the call(s):\n\t- [AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)](contracts/v2/strategies/RamosStrategy.sol#L187)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L181-L188", - "id": "86c6739a14ef579509f4e0190b6310b585123eb008deed594e5fdc44ec40eefe", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "borrow", + "type": "node", + "name": "claimFor(account)", "source_mapping": { - "start": 3212, - "length": 319, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 2093, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], - "starting_column": 5, - "ending_column": 6 + "lines": [57], + "starting_column": 9, + "ending_column": 26 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "GnosisStrategy", + "type": "function", + "name": "increaseShares", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191 - ], - "starting_column": 1, - "ending_column": 0 + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "increaseShares(address,uint256)" } - }, - "signature": "borrow(IERC20,uint256)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "circuitBreakerProxy.preCheck(address(token),msg.sender,amount)", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", "source_mapping": { - "start": 3296, - "length": 112, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [89, 90, 91, 92, 93], + "lines": [91], "starting_column": 9, - "ending_column": 10 + "ending_column": 65 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrow", + "name": "claimFor", "source_mapping": { - "start": 3212, - "length": 319, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrow(IERC20,uint256)" + "signature": "claimFor(address)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "Borrow(address(token),amount)", + "name": "totalShares += amount", "source_mapping": { - "start": 3418, - "length": 35, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 2156, + "length": 21, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [94], + "lines": [60], "starting_column": 9, - "ending_column": 44 + "ending_column": 30 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrow", + "name": "increaseShares", "source_mapping": { - "start": 3212, - "length": 319, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, - "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "TreasuryFarmingRevenue", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrow(IERC20,uint256)" + "signature": "increaseShares(address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalShares" + } } ], - "description": "Reentrancy in GnosisStrategy.borrow(IERC20,uint256) (contracts/v2/strategies/GnosisStrategy.sol#88-96):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(token),msg.sender,amount) (contracts/v2/strategies/GnosisStrategy.sol#89-93)\n\tEvent emitted after the call(s):\n\t- Borrow(address(token),amount) (contracts/v2/strategies/GnosisStrategy.sol#94)\n", - "markdown": "Reentrancy in [GnosisStrategy.borrow(IERC20,uint256)](contracts/v2/strategies/GnosisStrategy.sol#L88-L96):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(token),msg.sender,amount)](contracts/v2/strategies/GnosisStrategy.sol#L89-L93)\n\tEvent emitted after the call(s):\n\t- [Borrow(address(token),amount)](contracts/v2/strategies/GnosisStrategy.sol#L94)\n", - "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L88-L96", - "id": "816d5794942352b4b9c381b210cb4b35ac9c43889f1c7eaa1b7e32f3c1f8ab33", - "check": "reentrancy-events", + "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tState variables written after the call(s):\n\t- totalShares += amount (contracts/core/TreasuryFarmingRevenue.sol#60)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tState variables written after the call(s):\n\t- [totalShares += amount](contracts/core/TreasuryFarmingRevenue.sol#L60)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", + "id": "842e91df89a71525a6459c0d1291885967545da62e3f06975364172343f78737", + "check": "reentrancy-benign", "impact": "Low", "confidence": "Medium" }, @@ -29259,129 +30164,141 @@ "elements": [ { "type": "function", - "name": "borrowAndDeposit", + "name": "startAuction", "source_mapping": { - "start": 7810, - "length": 246, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [195, 196, 197, 198, 199], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "startAuction()" } }, { "type": "node", - "name": "treasuryReservesVault.borrow(daiToken,amount,address(this))", + "name": "_distributeGold()", "source_mapping": { - "start": 7959, - "length": 61, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5535, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [197], + "lines": [119], "starting_column": 9, - "ending_column": 70 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "startAuction", "source_mapping": { - "start": 7810, - "length": 246, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [195, 196, 197, 198, 199], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "startAuction()" } } }, @@ -29389,149 +30306,158 @@ }, { "type": "node", - "name": "_dsrDeposit(amount)", + "name": "templeGold.mint()", "source_mapping": { - "start": 8030, - "length": 19, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 14719, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [198], + "lines": [335], "starting_column": 9, - "ending_column": 28 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "_distributeGold", "source_mapping": { - "start": 7810, - "length": 246, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 14614, + "length": 129, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [195, 196, 197, 198, 199], + "lines": [333, 334, 335, 336], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "_distributeGold()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "chi = pot.drip()", + "name": "_distributeGold()", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5535, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [142], + "lines": [119], "starting_column": 9, - "ending_column": 69 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "startAuction", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_checkpointChi()" + "signature": "startAuction()" } } }, @@ -29539,74 +30465,77 @@ }, { "type": "node", - "name": "daiJoin.join(address(this),amount)", + "name": "templeGold.mint()", "source_mapping": { - "start": 8343, - "length": 35, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 14719, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [207], + "lines": [335], "starting_column": 9, - "ending_column": 44 + "ending_column": 26 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrDeposit", + "name": "_distributeGold", "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 14614, + "length": 129, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [333, 334, 335, 336], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrDeposit(uint256)" + "signature": "_distributeGold()" } } }, @@ -29614,352 +30543,348 @@ }, { "type": "node", - "name": "pot.join(shares)", + "name": "nextAuctionGoldAmount = 0", "source_mapping": { - "start": 8388, - "length": 16, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5619, + "length": 25, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [208], + "lines": [121], "starting_column": 9, - "ending_column": 25 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrDeposit", + "name": "startAuction", "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "StableGoldAuction", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrDeposit(uint256)" + "signature": "startAuction()" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "nextAuctionGoldAmount" + } + } + ], + "description": "Reentrancy in StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132):\n\tExternal calls:\n\t- _distributeGold() (contracts/templegold/StableGoldAuction.sol#119)\n\t\t- templeGold.mint() (contracts/templegold/StableGoldAuction.sol#335)\n\tState variables written after the call(s):\n\t- nextAuctionGoldAmount = 0 (contracts/templegold/StableGoldAuction.sol#121)\n", + "markdown": "Reentrancy in [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132):\n\tExternal calls:\n\t- [_distributeGold()](contracts/templegold/StableGoldAuction.sol#L119)\n\t\t- [templeGold.mint()](contracts/templegold/StableGoldAuction.sol#L335)\n\tState variables written after the call(s):\n\t- [nextAuctionGoldAmount = 0](contracts/templegold/StableGoldAuction.sol#L121)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L107-L132", + "id": "e8f65eaeb50d3406efec85b7c8c93816e863891b4dff3386ab8b7d67739bceaa", + "check": "reentrancy-benign", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "burn", + "source_mapping": { + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "burn(address)" + } }, { "type": "node", - "name": "DaiDeposited(amount)", + "name": "_safeTransfer(_token0,to,amount0)", "source_mapping": { - "start": 8308, - "length": 25, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6213, + "length": 35, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [206], + "lines": [131], "starting_column": 9, - "ending_column": 34 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrDeposit", + "name": "burn", "source_mapping": { - "start": 8062, - "length": 349, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrDeposit(uint256)" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "_dsrDeposit(amount)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 8030, - "length": 19, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [198], + "lines": [50], "starting_column": 9, - "ending_column": 28 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "_safeTransfer", "source_mapping": { - "start": 7810, - "length": 246, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [195, 196, 197, 198, 199], - "starting_column": 5, - "ending_column": 6 + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [49, 50, 51, 52], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in DsrBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#195-199):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(daiToken,amount,address(this)) (contracts/v2/strategies/DsrBaseStrategy.sol#197)\n\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t\t- daiJoin.join(address(this),amount) (contracts/v2/strategies/DsrBaseStrategy.sol#207)\n\t\t- pot.join(shares) (contracts/v2/strategies/DsrBaseStrategy.sol#208)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#206)\n\t\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n", - "markdown": "Reentrancy in [DsrBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(daiToken,amount,address(this))](contracts/v2/strategies/DsrBaseStrategy.sol#L197)\n\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t\t- [daiJoin.join(address(this),amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L207)\n\t\t- [pot.join(shares)](contracts/v2/strategies/DsrBaseStrategy.sol#L208)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L206)\n\t\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199", - "id": "fa02cb67c0fadd634b5b58c828b6c896bd82d9eafb17365664e0ed1810997c50", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "borrowAndDeposit", - "source_mapping": { - "start": 4194, - "length": 246, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [103, 104, 105, 106, 107], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "SkyFarmBaseStrategy", - "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "borrowAndDeposit(uint256)" - } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "treasuryReservesVault.borrow(daiToken,amount,address(this))", + "name": "_safeTransfer(_token1,to,amount1)", "source_mapping": { - "start": 4343, - "length": 61, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6258, + "length": 35, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [105], + "lines": [132], "starting_column": 9, - "ending_column": 70 + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "burn", "source_mapping": { - "start": 4194, - "length": 246, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [103, 104, 105, 106, 107], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "burn(address)" } } }, @@ -29967,349 +30892,279 @@ }, { "type": "node", - "name": "_daiDeposit(amount)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 4414, - "length": 19, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [106], + "lines": [50], "starting_column": 9, - "ending_column": 28 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "_safeTransfer", "source_mapping": { - "start": 4194, - "length": 246, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [103, 104, 105, 106, 107], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "daiToUsds.daiToUsds(address(this),daiAmount)", + "name": "Burn(msg.sender,amount0,amount1,to)", "source_mapping": { - "start": 7458, - "length": 45, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6485, + "length": 43, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [176], + "lines": [137], "starting_column": 9, - "ending_column": 54 + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "burn", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "burn(address)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "usdsVaultToken.deposit(daiAmount,address(this))", + "name": "Sync(reserve0,reserve1)", "source_mapping": { - "start": 7561, - "length": 48, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 3918, + "length": 29, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [179], + "lines": [92], "starting_column": 9, - "ending_column": 57 + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "_update", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_daiDeposit(uint256)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "DaiDeposited(daiAmount)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 7619, - "length": 28, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 6426, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [180], + "lines": [136], "starting_column": 9, - "ending_column": 37 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_daiDeposit", + "name": "burn", "source_mapping": { - "start": 7372, - "length": 282, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 5241, + "length": 1294, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "lines": [ + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SkyFarmBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_daiDeposit(uint256)" - } - } - }, - "additional_fields": { "underlying_type": "event" } - }, - { - "type": "node", - "name": "_daiDeposit(amount)", - "source_mapping": { - "start": 4414, - "length": 19, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [106], - "starting_column": 9, - "ending_column": 28 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "borrowAndDeposit", - "source_mapping": { - "start": 4194, - "length": 246, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [103, 104, 105, 106, 107], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "SkyFarmBaseStrategy", - "source_mapping": { - "start": 853, - "length": 8473, - "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220 - ], - "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "burn(address)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in SkyFarmBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#103-107):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(daiToken,amount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#105)\n\t- _daiDeposit(amount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#106)\n\t\t- daiToUsds.daiToUsds(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#176)\n\t\t- usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#180)\n\t\t- _daiDeposit(amount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#106)\n", - "markdown": "Reentrancy in [SkyFarmBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L103-L107):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(daiToken,amount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L105)\n\t- [_daiDeposit(amount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L106)\n\t\t- [daiToUsds.daiToUsds(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L176)\n\t\t- [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L180)\n\t\t- [_daiDeposit(amount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L106)\n", - "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L103-L107", - "id": "7801f7ed954e6c382883d3916d5a3aaf2908821f630755ae3b9acee0bc1b7f6b", + "description": "Reentrancy in TempleUniswapV2Pair.burn(address) (contracts/amm/TempleUniswapV2Pair.sol#118-138):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0) (contracts/amm/TempleUniswapV2Pair.sol#131)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1) (contracts/amm/TempleUniswapV2Pair.sol#132)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\tEvent emitted after the call(s):\n\t- Burn(msg.sender,amount0,amount1,to) (contracts/amm/TempleUniswapV2Pair.sol#137)\n\t- Sync(reserve0,reserve1) (contracts/amm/TempleUniswapV2Pair.sol#92)\n\t\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#136)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.burn(address)](contracts/amm/TempleUniswapV2Pair.sol#L118-L138):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0)](contracts/amm/TempleUniswapV2Pair.sol#L131)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1)](contracts/amm/TempleUniswapV2Pair.sol#L132)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\tEvent emitted after the call(s):\n\t- [Burn(msg.sender,amount0,amount1,to)](contracts/amm/TempleUniswapV2Pair.sol#L137)\n\t- [Sync(reserve0,reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L92)\n\t\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L136)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L118-L138", + "id": "127a57c69604f2ba16f4cd02c712486dff1968238a1c69ead2035920584207c2", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -30318,101 +31173,120 @@ "elements": [ { "type": "function", - "name": "borrowAndDeposit", + "name": "swap", "source_mapping": { - "start": 2046, - "length": 229, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [61, 62, 63, 64, 65], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTokenBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 689, - "length": 4427, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } }, { "type": "node", - "name": "treasuryReservesVault.borrow(templeToken,amount,address(this))", + "name": "_safeTransfer(_token0,to,amount0Out)", "source_mapping": { - "start": 2135, - "length": 64, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 7388, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [62], - "starting_column": 9, - "ending_column": 73 + "lines": [153], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "swap", "source_mapping": { - "start": 2046, - "length": 229, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [61, 62, 63, 64, 65], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTokenBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 689, - "length": 4427, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, @@ -30420,161 +31294,179 @@ }, { "type": "node", - "name": "TempleBurned(amount)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 2209, - "length": 25, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [63], + "lines": [50], "starting_column": 9, - "ending_column": 34 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowAndDeposit", + "name": "_safeTransfer", "source_mapping": { - "start": 2046, - "length": 229, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [61, 62, 63, 64, 65], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleTokenBaseStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 689, - "length": 4427, - "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowAndDeposit(uint256)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleTokenBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#61-65):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(templeToken,amount,address(this)) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#62)\n\tEvent emitted after the call(s):\n\t- TempleBurned(amount) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#63)\n", - "markdown": "Reentrancy in [TempleTokenBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L61-L65):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(templeToken,amount,address(this))](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L62)\n\tEvent emitted after the call(s):\n\t- [TempleBurned(amount)](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L63)\n", - "first_markdown_element": "contracts/v2/strategies/TempleTokenBaseStrategy.sol#L61-L65", - "id": "a4b7ebab2add03874fc7d7e0fb2176bb3cce4461f7bee4c56c5e3938077ba4b2", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "borrowMax", + "type": "node", + "name": "_safeTransfer(_token1,to,amount1Out)", "source_mapping": { - "start": 3668, - "length": 489, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 7490, + "length": 38, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], - "starting_column": 5, - "ending_column": 6 + "lines": [154], + "starting_column": 29, + "ending_column": 67 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "GnosisStrategy", + "type": "function", + "name": "swap", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "swap(uint256,uint256,address,bytes)" } - }, - "signature": "borrowMax(IERC20)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount)", + "name": "(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))", "source_mapping": { - "start": 3915, - "length": 120, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1972, + "length": 91, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [105, 106, 107, 108, 109], + "lines": [50], "starting_column": 9, - "ending_column": 10 + "ending_column": 100 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowMax", + "name": "_safeTransfer", "source_mapping": { - "start": 3668, - "length": 489, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 1892, + "length": 284, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "lines": [49, 50, 51, 52], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, @@ -30590,57 +31482,61 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowMax(IERC20)" + "signature": "_safeTransfer(address,address,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "Borrow(address(token),borrowedAmount)", + "name": "IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)", "source_mapping": { - "start": 4045, - "length": 43, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 7593, + "length": 76, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [110], - "starting_column": 9, - "ending_column": 52 + "lines": [155], + "starting_column": 30, + "ending_column": 106 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowMax", + "name": "swap", "source_mapping": { - "start": 3668, - "length": 489, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, @@ -30656,230 +31552,229 @@ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowMax(IERC20)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in GnosisStrategy.borrowMax(IERC20) (contracts/v2/strategies/GnosisStrategy.sol#102-112):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount) (contracts/v2/strategies/GnosisStrategy.sol#105-109)\n\tEvent emitted after the call(s):\n\t- Borrow(address(token),borrowedAmount) (contracts/v2/strategies/GnosisStrategy.sol#110)\n", - "markdown": "Reentrancy in [GnosisStrategy.borrowMax(IERC20)](contracts/v2/strategies/GnosisStrategy.sol#L102-L112):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount)](contracts/v2/strategies/GnosisStrategy.sol#L105-L109)\n\tEvent emitted after the call(s):\n\t- [Borrow(address(token),borrowedAmount)](contracts/v2/strategies/GnosisStrategy.sol#L110)\n", - "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L102-L112", - "id": "c3beb3c3be57476ae61c0a7cfb0301faed9288220416d314839649d2de9f7b5e", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls" } + }, { - "type": "function", - "name": "borrowProtocolToken", + "type": "node", + "name": "Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)", "source_mapping": { - "start": 3626, - "length": 353, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 8516, + "length": 71, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], - "starting_column": 5, - "ending_column": 6 + "lines": [169], + "starting_column": 9, + "ending_column": 80 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "RamosStrategy", + "type": "function", + "name": "swap", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 ], - "starting_column": 1, - "ending_column": 0 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "swap(uint256,uint256,address,bytes)" } - }, - "signature": "borrowProtocolToken(uint256,address)" - } + } + }, + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", + "name": "Sync(reserve0,reserve1)", "source_mapping": { - "start": 3728, - "length": 118, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 3918, + "length": 29, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [92, 93, 94, 95, 96], + "lines": [92], "starting_column": 9, - "ending_column": 10 + "ending_column": 38 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowProtocolToken", + "name": "_update", "source_mapping": { - "start": 3626, - "length": 353, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowProtocolToken(uint256,address)" + "signature": "_update(uint256,uint256,uint112,uint112)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "BorrowToken(address(templeToken),amount)", + "name": "_update(balance0,balance1,_reserve0,_reserve1)", "source_mapping": { - "start": 3856, - "length": 46, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 8457, + "length": 49, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [97], + "lines": [168], "starting_column": 9, - "ending_column": 55 + "ending_column": 58 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowProtocolToken", + "name": "swap", "source_mapping": { - "start": 3626, - "length": 353, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 6644, + "length": 1950, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, - "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TempleUniswapV2Pair", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowProtocolToken(uint256,address)" + "signature": "swap(uint256,uint256,address,bytes)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in RamosStrategy.borrowProtocolToken(uint256,address) (contracts/v2/strategies/RamosStrategy.sol#91-99):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/strategies/RamosStrategy.sol#92-96)\n\tEvent emitted after the call(s):\n\t- BorrowToken(address(templeToken),amount) (contracts/v2/strategies/RamosStrategy.sol#97)\n", - "markdown": "Reentrancy in [RamosStrategy.borrowProtocolToken(uint256,address)](contracts/v2/strategies/RamosStrategy.sol#L91-L99):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/strategies/RamosStrategy.sol#L92-L96)\n\tEvent emitted after the call(s):\n\t- [BorrowToken(address(templeToken),amount)](contracts/v2/strategies/RamosStrategy.sol#L97)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L91-L99", - "id": "e0ba9fad7b97dfcfdfbb8b5dcf413149d4e3c15549b5560fb8aacdf2167f9e31", + "description": "Reentrancy in TempleUniswapV2Pair.swap(uint256,uint256,address,bytes) (contracts/amm/TempleUniswapV2Pair.sol#141-170):\n\tExternal calls:\n\t- _safeTransfer(_token0,to,amount0Out) (contracts/amm/TempleUniswapV2Pair.sol#153)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- _safeTransfer(_token1,to,amount1Out) (contracts/amm/TempleUniswapV2Pair.sol#154)\n\t\t- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (contracts/amm/TempleUniswapV2Pair.sol#50)\n\t- IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data) (contracts/amm/TempleUniswapV2Pair.sol#155)\n\tEvent emitted after the call(s):\n\t- Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to) (contracts/amm/TempleUniswapV2Pair.sol#169)\n\t- Sync(reserve0,reserve1) (contracts/amm/TempleUniswapV2Pair.sol#92)\n\t\t- _update(balance0,balance1,_reserve0,_reserve1) (contracts/amm/TempleUniswapV2Pair.sol#168)\n", + "markdown": "Reentrancy in [TempleUniswapV2Pair.swap(uint256,uint256,address,bytes)](contracts/amm/TempleUniswapV2Pair.sol#L141-L170):\n\tExternal calls:\n\t- [_safeTransfer(_token0,to,amount0Out)](contracts/amm/TempleUniswapV2Pair.sol#L153)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [_safeTransfer(_token1,to,amount1Out)](contracts/amm/TempleUniswapV2Pair.sol#L154)\n\t\t- [(success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value))](contracts/amm/TempleUniswapV2Pair.sol#L50)\n\t- [IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)](contracts/amm/TempleUniswapV2Pair.sol#L155)\n\tEvent emitted after the call(s):\n\t- [Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)](contracts/amm/TempleUniswapV2Pair.sol#L169)\n\t- [Sync(reserve0,reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L92)\n\t\t- [_update(balance0,balance1,_reserve0,_reserve1)](contracts/amm/TempleUniswapV2Pair.sol#L168)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L141-L170", + "id": "702607b50ee9e5b85f6e9be980d2529af09be332237e0acb690cb814df52cb87", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -30888,123 +31783,210 @@ "elements": [ { "type": "function", - "name": "borrowQuoteToken", + "name": "_burnDToken", "source_mapping": { - "start": 4172, - "length": 347, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 30000, + "length": 1179, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "lines": [ + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowQuoteToken(uint256,address)" + "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } }, { "type": "node", - "name": "circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount)", + "name": "_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)", "source_mapping": { - "start": 4271, - "length": 117, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 30399, + "length": 71, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [107, 108, 109, 110, 111], + "lines": [688], "starting_column": 9, - "ending_column": 10 + "ending_column": 80 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowQuoteToken", + "name": "_burnDToken", "source_mapping": { - "start": 4172, - "length": 347, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 30000, + "length": 1179, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "lines": [ + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowQuoteToken(uint256,address)" + "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } } }, @@ -31012,81 +31994,126 @@ }, { "type": "node", - "name": "BorrowToken(address(quoteToken),amount)", + "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", "source_mapping": { - "start": 4398, - "length": 45, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 31082, + "length": 90, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [112], + "lines": [708], "starting_column": 9, - "ending_column": 54 + "ending_column": 99 }, "type_specific_fields": { "parent": { "type": "function", - "name": "borrowQuoteToken", + "name": "_burnDToken", "source_mapping": { - "start": 4172, - "length": 347, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 30000, + "length": 1179, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "lines": [ + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RamosStrategy", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1131, - "length": 9320, - "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", - "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "borrowQuoteToken(uint256,address)" + "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in RamosStrategy.borrowQuoteToken(uint256,address) (contracts/v2/strategies/RamosStrategy.sol#106-114):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount) (contracts/v2/strategies/RamosStrategy.sol#107-111)\n\tEvent emitted after the call(s):\n\t- BorrowToken(address(quoteToken),amount) (contracts/v2/strategies/RamosStrategy.sol#112)\n", - "markdown": "Reentrancy in [RamosStrategy.borrowQuoteToken(uint256,address)](contracts/v2/strategies/RamosStrategy.sol#L106-L114):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount)](contracts/v2/strategies/RamosStrategy.sol#L107-L111)\n\tEvent emitted after the call(s):\n\t- [BorrowToken(address(quoteToken),amount)](contracts/v2/strategies/RamosStrategy.sol#L112)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L106-L114", - "id": "bbc7a06e8819c324c8e6cacd486325e56ef60f1d5a3b26d061c95866855e9804", + "description": "Reentrancy in TreasuryReservesVault._burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256) (contracts/v2/TreasuryReservesVault.sol#677-709):\n\tExternal calls:\n\t- _burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount) (contracts/v2/TreasuryReservesVault.sol#688)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#708)\n", + "markdown": "Reentrancy in [TreasuryReservesVault._burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)](contracts/v2/TreasuryReservesVault.sol#L677-L709):\n\tExternal calls:\n\t- [_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)](contracts/v2/TreasuryReservesVault.sol#L688)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L708)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L677-L709", + "id": "39b30f51cb8e0f3bb137afd7388e494f2a117088a846eb999e1fe7c8a4337328", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -31095,129 +32122,116 @@ "elements": [ { "type": "function", - "name": "checkpointAssetBalances", + "name": "_daiDeposit", "source_mapping": { - "start": 6889, - "length": 403, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "checkpointAssetBalances()" + "signature": "_daiDeposit(uint256)" } }, { "type": "node", - "name": "(daiBalance) = _checkpointDaiBalance()", + "name": "daiToUsds.daiToUsds(address(this),daiAmount)", "source_mapping": { - "start": 7012, - "length": 48, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7458, + "length": 45, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [176], "starting_column": 9, - "ending_column": 57 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "checkpointAssetBalances", + "name": "_daiDeposit", "source_mapping": { - "start": 6889, - "length": 403, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "checkpointAssetBalances()" + "signature": "_daiDeposit(uint256)" } } }, @@ -31225,159 +32239,145 @@ }, { "type": "node", - "name": "chi = pot.drip()", + "name": "usdsVaultToken.deposit(daiAmount,address(this))", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7561, + "length": 48, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [142], + "lines": [179], "starting_column": 9, - "ending_column": 69 + "ending_column": 57 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "_daiDeposit", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_checkpointChi()" + "signature": "_daiDeposit(uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "AssetBalancesCheckpoint(assetBalances)", + "name": "DaiDeposited(daiAmount)", "source_mapping": { - "start": 7242, - "length": 43, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7619, + "length": 28, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [182], + "lines": [180], "starting_column": 9, - "ending_column": 52 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "checkpointAssetBalances", + "name": "_daiDeposit", "source_mapping": { - "start": 6889, - "length": 403, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "lines": [174, 175, 176, 177, 178, 179, 180, 181], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "checkpointAssetBalances()" + "signature": "_daiDeposit(uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in DsrBaseStrategy.checkpointAssetBalances() (contracts/v2/strategies/DsrBaseStrategy.sol#173-183):\n\tExternal calls:\n\t- (daiBalance) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#176)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\tEvent emitted after the call(s):\n\t- AssetBalancesCheckpoint(assetBalances) (contracts/v2/strategies/DsrBaseStrategy.sol#182)\n", - "markdown": "Reentrancy in [DsrBaseStrategy.checkpointAssetBalances()](contracts/v2/strategies/DsrBaseStrategy.sol#L173-L183):\n\tExternal calls:\n\t- [(daiBalance) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L176)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\tEvent emitted after the call(s):\n\t- [AssetBalancesCheckpoint(assetBalances)](contracts/v2/strategies/DsrBaseStrategy.sol#L182)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L173-L183", - "id": "91547e7be3e8d823bd0bb0f659906fbda2e7c22a3e071f2d8982d126ca2e8293", + "description": "Reentrancy in SkyFarmBaseStrategy._daiDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#174-181):\n\tExternal calls:\n\t- daiToUsds.daiToUsds(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#176)\n\t- usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#180)\n", + "markdown": "Reentrancy in [SkyFarmBaseStrategy._daiDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181):\n\tExternal calls:\n\t- [daiToUsds.daiToUsds(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L176)\n\t- [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L180)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L174-L181", + "id": "42487f0aee09b0bb3df65a1b9008394a8c898a5f24ac966050e998d4fff1097d", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -31386,277 +32386,116 @@ "elements": [ { "type": "function", - "name": "depositAndStakeBptTokens", + "name": "_daiWithdrawal", "source_mapping": { - "start": 24025, - "length": 411, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStakeBptTokens(uint256,bool)" + "signature": "_daiWithdrawal(uint256)" } }, { "type": "node", - "name": "bptToken.safeTransferFrom(msg.sender,address(this),amount)", + "name": "usdsVaultToken.withdraw(daiAmount,address(this),address(this))", "source_mapping": { - "start": 24208, - "length": 60, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7770, + "length": 64, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [569], - "starting_column": 13, + "lines": [185], + "starting_column": 9, "ending_column": 73 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositAndStakeBptTokens", + "name": "_daiWithdrawal", "source_mapping": { - "start": 24025, - "length": 411, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "depositAndStakeBptTokens(uint256,bool)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "bptToken.safeTransfer(address(amoStaking),amount)", - "source_mapping": { - "start": 24288, - "length": 50, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [571], - "starting_column": 9, - "ending_column": 59 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "depositAndStakeBptTokens", - "source_mapping": { - "start": 24025, - "length": 411, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStakeBptTokens(uint256,bool)" + "signature": "_daiWithdrawal(uint256)" } } }, @@ -31664,99 +32503,67 @@ }, { "type": "node", - "name": "amoStaking.depositAndStake(amount)", + "name": "daiToUsds.usdsToDai(address(this),daiAmount)", "source_mapping": { - "start": 24348, - "length": 34, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7871, + "length": 45, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [572], + "lines": [188], "starting_column": 9, - "ending_column": 43 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositAndStakeBptTokens", + "name": "_daiWithdrawal", "source_mapping": { - "start": 24025, - "length": 411, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStakeBptTokens(uint256,bool)" + "signature": "_daiWithdrawal(uint256)" } } }, @@ -31764,109 +32571,77 @@ }, { "type": "node", - "name": "DepositAndStakeBptTokens(amount)", + "name": "DaiWithdrawn(daiAmount)", "source_mapping": { - "start": 24392, - "length": 37, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7926, + "length": 28, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [573], + "lines": [189], "starting_column": 9, - "ending_column": 46 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "depositAndStakeBptTokens", + "name": "_daiWithdrawal", "source_mapping": { - "start": 24025, - "length": 411, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7660, + "length": 301, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "lines": [183, 184, 185, 186, 187, 188, 189, 190], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "depositAndStakeBptTokens(uint256,bool)" + "signature": "_daiWithdrawal(uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in Ramos.depositAndStakeBptTokens(uint256,bool) (contracts/amo/Ramos.sol#564-574):\n\tExternal calls:\n\t- bptToken.safeTransferFrom(msg.sender,address(this),amount) (contracts/amo/Ramos.sol#569)\n\t- bptToken.safeTransfer(address(amoStaking),amount) (contracts/amo/Ramos.sol#571)\n\t- amoStaking.depositAndStake(amount) (contracts/amo/Ramos.sol#572)\n\tEvent emitted after the call(s):\n\t- DepositAndStakeBptTokens(amount) (contracts/amo/Ramos.sol#573)\n", - "markdown": "Reentrancy in [Ramos.depositAndStakeBptTokens(uint256,bool)](contracts/amo/Ramos.sol#L564-L574):\n\tExternal calls:\n\t- [bptToken.safeTransferFrom(msg.sender,address(this),amount)](contracts/amo/Ramos.sol#L569)\n\t- [bptToken.safeTransfer(address(amoStaking),amount)](contracts/amo/Ramos.sol#L571)\n\t- [amoStaking.depositAndStake(amount)](contracts/amo/Ramos.sol#L572)\n\tEvent emitted after the call(s):\n\t- [DepositAndStakeBptTokens(amount)](contracts/amo/Ramos.sol#L573)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L564-L574", - "id": "a7249c20cc127d6173fc40d9683538ced29502e2d3e8095440a2939d5dddf5d0", + "description": "Reentrancy in SkyFarmBaseStrategy._daiWithdrawal(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#183-190):\n\tExternal calls:\n\t- usdsVaultToken.withdraw(daiAmount,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#185)\n\t- daiToUsds.usdsToDai(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#188)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#189)\n", + "markdown": "Reentrancy in [SkyFarmBaseStrategy._daiWithdrawal(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190):\n\tExternal calls:\n\t- [usdsVaultToken.withdraw(daiAmount,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L185)\n\t- [daiToUsds.usdsToDai(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L188)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L189)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L183-L190", + "id": "a699c320161b270181027cf3e08015c98a8dbbdadb7d1107f94429a042ac96b3", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -31875,185 +32650,129 @@ "elements": [ { "type": "function", - "name": "rebalanceDownExit", + "name": "_doShutdown", "source_mapping": { - "start": 13776, - "length": 1330, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 12282, + "length": 502, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362 - ], + "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownExit(uint256,uint256)" + "signature": "_doShutdown(bytes)" } }, { "type": "node", - "name": "amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))", + "name": "(daiAvailable,sharesAvailable) = _checkpointDaiBalance()", "source_mapping": { - "start": 14207, - "length": 70, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 12389, + "length": 74, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [341], + "lines": [295], "starting_column": 9, - "ending_column": 79 + "ending_column": 83 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownExit", + "name": "_doShutdown", "source_mapping": { - "start": 13776, - "length": 1330, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362 - ], + "start": 12282, + "length": 502, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownExit(uint256,uint256)" + "signature": "_doShutdown(bytes)" } } }, @@ -32061,207 +32780,149 @@ }, { "type": "node", - "name": "quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken)", + "name": "chi = pot.drip()", "source_mapping": { - "start": 14327, - "length": 266, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [344, 345, 346, 347], + "lines": [142], "starting_column": 9, - "ending_column": 10 + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownExit", + "name": "_checkpointChi", "source_mapping": { - "start": 13776, - "length": 1330, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362 - ], + "lines": [140, 141, 142, 143], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownExit(uint256,uint256)" + "signature": "_checkpointChi()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "quoteToken.safeTransfer(feeCollector,feeAmt)", + "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", "source_mapping": { - "start": 14786, + "start": 12473, "length": 45, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [352], - "starting_column": 13, - "ending_column": 58 + "lines": [296], + "starting_column": 9, + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownExit", + "name": "_doShutdown", "source_mapping": { - "start": 13776, - "length": 1330, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 12282, + "length": 502, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362 - ], + "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownExit(uint256,uint256)" + "signature": "_doShutdown(bytes)" } } }, @@ -32269,508 +32930,440 @@ }, { "type": "node", - "name": "RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt)", + "name": "pot.exit(sharesAmount)", "source_mapping": { - "start": 14925, - "length": 64, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11599, + "length": 22, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [358], + "lines": [279], "starting_column": 9, - "ending_column": 73 + "ending_column": 31 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownExit", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 13776, - "length": 1330, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownExit(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Ramos.rebalanceDownExit(uint256,uint256) (contracts/amo/Ramos.sol#332-362):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper)) (contracts/amo/Ramos.sol#341)\n\t- quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken) (contracts/amo/Ramos.sol#344-347)\n\t- quoteToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#352)\n\tEvent emitted after the call(s):\n\t- RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt) (contracts/amo/Ramos.sol#358)\n", - "markdown": "Reentrancy in [Ramos.rebalanceDownExit(uint256,uint256)](contracts/amo/Ramos.sol#L332-L362):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))](contracts/amo/Ramos.sol#L341)\n\t- [quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken)](contracts/amo/Ramos.sol#L344-L347)\n\t- [quoteToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L352)\n\tEvent emitted after the call(s):\n\t- [RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt)](contracts/amo/Ramos.sol#L358)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L332-L362", - "id": "86a53e330fffe167ad16fe5543549acebea2b6d799ac824c06d7b5f50d6c38da", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, { - "type": "function", - "name": "rebalanceDownJoin", + "type": "node", + "name": "daiJoin.exit(address(this),daiAmount)", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11631, + "length": 38, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [280], + "starting_column": 9, + "ending_column": 47 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "Ramos", + "type": "function", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" } - }, - "signature": "rebalanceDownJoin(uint256,uint256)" - } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this))", + "name": "DaiWithdrawn(daiAmount)", "source_mapping": { - "start": 18312, - "length": 68, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11679, + "length": 28, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [427], + "lines": [281], "starting_column": 9, - "ending_column": 77 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownJoin", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownJoin(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "event" } }, { "type": "node", - "name": "protocolToken.safeTransfer(feeCollector,feeAmt)", + "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", "source_mapping": { - "start": 18586, - "length": 48, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 12473, + "length": 45, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [432], - "starting_column": 13, - "ending_column": 61 + "lines": [296], + "starting_column": 9, + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownJoin", + "name": "_doShutdown", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 12282, + "length": 502, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], + "lines": [293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownJoin(uint256,uint256)" + "signature": "_doShutdown(bytes)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy._doShutdown(bytes) (contracts/v2/strategies/DsrBaseStrategy.sol#293-303):\n\tExternal calls:\n\t- (daiAvailable,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#295)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#296)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#296)\n", + "markdown": "Reentrancy in [DsrBaseStrategy._doShutdown(bytes)](contracts/v2/strategies/DsrBaseStrategy.sol#L293-L303):\n\tExternal calls:\n\t- [(daiAvailable,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L295)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L296)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L296)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L293-L303", + "id": "2d01281faf7161866f00d8f2c914cd6f900f84c01032af46a90491363ac26414", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_dsrDeposit", + "source_mapping": { + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrDeposit(uint256)" + } }, { "type": "node", - "name": "protocolToken.safeTransfer(address(_poolHelper),joinAmountIn)", + "name": "shares = _rdiv(amount,_checkpointChi())", "source_mapping": { - "start": 18818, - "length": 62, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8250, + "length": 48, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [438], + "lines": [204], "starting_column": 9, - "ending_column": 71 + "ending_column": 57 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownJoin", + "name": "_dsrDeposit", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownJoin(uint256,uint256)" + "signature": "_dsrDeposit(uint256)" } } }, @@ -32778,217 +33371,159 @@ }, { "type": "node", - "name": "bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken)", + "name": "chi = pot.drip()", "source_mapping": { - "start": 18933, - "length": 264, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [441, 442, 443, 444, 445], + "lines": [142], "starting_column": 9, - "ending_column": 10 + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownJoin", + "name": "_checkpointChi", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], + "lines": [140, 141, 142, 143], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownJoin(uint256,uint256)" + "signature": "_checkpointChi()" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt)", + "name": "DaiDeposited(amount)", "source_mapping": { - "start": 19207, - "length": 70, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8309, + "length": 25, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [446], + "lines": [206], "starting_column": 9, - "ending_column": 79 + "ending_column": 34 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceDownJoin", + "name": "_dsrDeposit", "source_mapping": { - "start": 17948, - "length": 1545, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453 - ], + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceDownJoin(uint256,uint256)" + "signature": "_dsrDeposit(uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in Ramos.rebalanceDownJoin(uint256,uint256) (contracts/amo/Ramos.sol#419-453):\n\tExternal calls:\n\t- tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this)) (contracts/amo/Ramos.sol#427)\n\t- protocolToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#432)\n\t- protocolToken.safeTransfer(address(_poolHelper),joinAmountIn) (contracts/amo/Ramos.sol#438)\n\t- bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken) (contracts/amo/Ramos.sol#441-445)\n\tEvent emitted after the call(s):\n\t- RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt) (contracts/amo/Ramos.sol#446)\n", - "markdown": "Reentrancy in [Ramos.rebalanceDownJoin(uint256,uint256)](contracts/amo/Ramos.sol#L419-L453):\n\tExternal calls:\n\t- [tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this))](contracts/amo/Ramos.sol#L427)\n\t- [protocolToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L432)\n\t- [protocolToken.safeTransfer(address(_poolHelper),joinAmountIn)](contracts/amo/Ramos.sol#L438)\n\t- [bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken)](contracts/amo/Ramos.sol#L441-L445)\n\tEvent emitted after the call(s):\n\t- [RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt)](contracts/amo/Ramos.sol#L446)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L419-L453", - "id": "cf17a4ee1ba6b6f324d63d28f3c7859bb03f334538e78ac2daf4f5d9278251dd", + "description": "Reentrancy in DsrBaseStrategy._dsrDeposit(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#201-209):\n\tExternal calls:\n\t- shares = _rdiv(amount,_checkpointChi()) (contracts/v2/strategies/DsrBaseStrategy.sol#204)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#206)\n", + "markdown": "Reentrancy in [DsrBaseStrategy._dsrDeposit(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L201-L209):\n\tExternal calls:\n\t- [shares = _rdiv(amount,_checkpointChi())](contracts/v2/strategies/DsrBaseStrategy.sol#L204)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L206)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L201-L209", + "id": "d7b6d2a10c4c72fb8ed18e875155e8f19fb9578527302b34acf8ce0824782543", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -32997,185 +33532,129 @@ "elements": [ { "type": "function", - "name": "rebalanceUpExit", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 11723, - "length": 1435, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpExit(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } }, { "type": "node", - "name": "amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))", + "name": "pot.exit(sharesAmount)", "source_mapping": { - "start": 12146, - "length": 70, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11599, + "length": 22, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [297], + "lines": [279], "starting_column": 9, - "ending_column": 79 + "ending_column": 31 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpExit", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 11723, - "length": 1435, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpExit(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } } }, @@ -33183,207 +33662,74 @@ }, { "type": "node", - "name": "protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken)", + "name": "daiJoin.exit(address(this),daiAmount)", "source_mapping": { - "start": 12273, - "length": 279, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11631, + "length": 38, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [300, 301, 302, 303, 304], + "lines": [280], "starting_column": 9, - "ending_column": 10 + "ending_column": 47 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpExit", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 11723, - "length": 1435, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "rebalanceUpExit(uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "protocolToken.safeTransfer(feeCollector,feeAmt)", - "source_mapping": { - "start": 12751, - "length": 48, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [309], - "starting_column": 13, - "ending_column": 61 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "rebalanceUpExit", - "source_mapping": { - "start": 11723, - "length": 1435, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpExit(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } } }, @@ -33391,113 +33737,84 @@ }, { "type": "node", - "name": "RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt)", + "name": "DaiWithdrawn(daiAmount)", "source_mapping": { - "start": 12967, - "length": 65, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11679, + "length": 28, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [316], + "lines": [281], "starting_column": 9, - "ending_column": 74 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpExit", + "name": "_dsrWithdrawal", "source_mapping": { - "start": 11723, - "length": 1435, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320 - ], + "lines": [278, 279, 280, 281, 282], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpExit(uint256,uint256)" + "signature": "_dsrWithdrawal(uint256,uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in Ramos.rebalanceUpExit(uint256,uint256) (contracts/amo/Ramos.sol#288-320):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper)) (contracts/amo/Ramos.sol#297)\n\t- protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken) (contracts/amo/Ramos.sol#300-304)\n\t- protocolToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#309)\n\tEvent emitted after the call(s):\n\t- RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt) (contracts/amo/Ramos.sol#316)\n", - "markdown": "Reentrancy in [Ramos.rebalanceUpExit(uint256,uint256)](contracts/amo/Ramos.sol#L288-L320):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))](contracts/amo/Ramos.sol#L297)\n\t- [protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken)](contracts/amo/Ramos.sol#L300-L304)\n\t- [protocolToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L309)\n\tEvent emitted after the call(s):\n\t- [RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt)](contracts/amo/Ramos.sol#L316)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L288-L320", - "id": "f01702004594863e23f38f398fde5ec3a792ca5c4b26bd0a6b93e8dc1846cabf", + "description": "Reentrancy in DsrBaseStrategy._dsrWithdrawal(uint256,uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#278-282):\n\tExternal calls:\n\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n", + "markdown": "Reentrancy in [DsrBaseStrategy._dsrWithdrawal(uint256,uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L278-L282):\n\tExternal calls:\n\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L278-L282", + "id": "d35e410305415164f2083f99e160a70431f3fb38caf25144473d47103896e96b", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -33506,18 +33823,18 @@ "elements": [ { "type": "function", - "name": "rebalanceUpJoin", + "name": "_mintDToken", "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 28534, + "length": 1205, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670 ], "starting_column": 5, "ending_column": 6 @@ -33525,96 +33842,108 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpJoin(uint256,uint256)" + "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } }, { "type": "node", - "name": "tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this))", + "name": "tokenConfig.dToken.mint(strategy,_newDebt)", "source_mapping": { - "start": 16123, - "length": 62, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 29295, + "length": 43, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [382], - "starting_column": 9, - "ending_column": 71 + "lines": [657], + "starting_column": 13, + "ending_column": 56 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpJoin", + "name": "_mintDToken", "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 28534, + "length": 1205, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670 ], "starting_column": 5, "ending_column": 6 @@ -33622,173 +33951,82 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "rebalanceUpJoin(uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "quoteToken.safeTransfer(feeCollector,feeAmt)", - "source_mapping": { - "start": 16378, - "length": 45, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [387], - "starting_column": 13, - "ending_column": 58 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "rebalanceUpJoin", - "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpJoin(uint256,uint256)" + "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } } }, @@ -33796,33 +34034,33 @@ }, { "type": "node", - "name": "quoteToken.safeTransfer(address(_poolHelper),joinAmountIn)", + "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", "source_mapping": { - "start": 16619, - "length": 59, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 29642, + "length": 90, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [393], + "lines": [669], "starting_column": 9, - "ending_column": 68 + "ending_column": 99 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpJoin", + "name": "_mintDToken", "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 28534, + "length": 1205, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670 ], "starting_column": 5, "ending_column": 6 @@ -33830,173 +34068,210 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "rebalanceUpJoin(uint256,uint256)" + "signature": "_mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TreasuryReservesVault._mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256) (contracts/v2/TreasuryReservesVault.sol#638-670):\n\tExternal calls:\n\t- tokenConfig.dToken.mint(strategy,_newDebt) (contracts/v2/TreasuryReservesVault.sol#657)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#669)\n", + "markdown": "Reentrancy in [TreasuryReservesVault._mintDToken(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)](contracts/v2/TreasuryReservesVault.sol#L638-L670):\n\tExternal calls:\n\t- [tokenConfig.dToken.mint(strategy,_newDebt)](contracts/v2/TreasuryReservesVault.sol#L657)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L669)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L638-L670", + "id": "d06d6a53d0451e137729438d3e1093db6d5e7f0f78494fe8b2a70bd44b393675", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_vaultRedemption", + "source_mapping": { + "start": 7967, + "length": 343, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [192, 193, 194, 195, 196, 197, 198, 199], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_vaultRedemption(uint256)" + } }, { "type": "node", - "name": "bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken)", + "name": "daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this))", "source_mapping": { - "start": 16728, - "length": 250, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8107, + "length": 76, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [396, 397, 398, 399], + "lines": [194], "starting_column": 9, - "ending_column": 10 + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpJoin", + "name": "_vaultRedemption", "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7967, + "length": 343, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 - ], + "lines": [192, 193, 194, 195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "rebalanceUpJoin(uint256,uint256)" + "signature": "_vaultRedemption(uint256)" } } }, @@ -34004,227 +34279,67 @@ }, { "type": "node", - "name": "RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt)", + "name": "daiToUsds.usdsToDai(address(this),daiAmount)", "source_mapping": { - "start": 16988, - "length": 65, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 8220, + "length": 45, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [400], + "lines": [197], "starting_column": 9, - "ending_column": 74 + "ending_column": 54 }, "type_specific_fields": { "parent": { "type": "function", - "name": "rebalanceUpJoin", + "name": "_vaultRedemption", "source_mapping": { - "start": 15773, - "length": 1496, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 7967, + "length": 343, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [ - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407 - ], + "lines": [192, 193, 194, 195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "Ramos", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, - 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "rebalanceUpJoin(uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Ramos.rebalanceUpJoin(uint256,uint256) (contracts/amo/Ramos.sol#374-407):\n\tExternal calls:\n\t- tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this)) (contracts/amo/Ramos.sol#382)\n\t- quoteToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#387)\n\t- quoteToken.safeTransfer(address(_poolHelper),joinAmountIn) (contracts/amo/Ramos.sol#393)\n\t- bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken) (contracts/amo/Ramos.sol#396-399)\n\tEvent emitted after the call(s):\n\t- RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt) (contracts/amo/Ramos.sol#400)\n", - "markdown": "Reentrancy in [Ramos.rebalanceUpJoin(uint256,uint256)](contracts/amo/Ramos.sol#L374-L407):\n\tExternal calls:\n\t- [tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this))](contracts/amo/Ramos.sol#L382)\n\t- [quoteToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L387)\n\t- [quoteToken.safeTransfer(address(_poolHelper),joinAmountIn)](contracts/amo/Ramos.sol#L393)\n\t- [bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken)](contracts/amo/Ramos.sol#L396-L399)\n\tEvent emitted after the call(s):\n\t- [RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt)](contracts/amo/Ramos.sol#L400)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L374-L407", - "id": "d452854a083064df7259f0954835ef242ab535df19218e9bf3aaf9b81c9b26c1", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "recoverToGnosis", - "source_mapping": { - "start": 5325, - "length": 237, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [142, 143, 144, 145], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "GnosisStrategy", - "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "recoverToGnosis(address,uint256)" - } - }, - { - "type": "node", - "name": "IERC20(token).safeTransfer(gnosisSafeWallet,amount)", - "source_mapping": { - "start": 5419, - "length": 52, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [143], - "starting_column": 9, - "ending_column": 61 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "recoverToGnosis", - "source_mapping": { - "start": 5325, - "length": 237, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [142, 143, 144, 145], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "GnosisStrategy", - "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "recoverToGnosis(address,uint256)" + "signature": "_vaultRedemption(uint256)" } } }, @@ -34232,75 +34347,77 @@ }, { "type": "node", - "name": "CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount)", + "name": "DaiWithdrawn(daiAmount)", "source_mapping": { - "start": 5481, - "length": 74, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 8275, + "length": 28, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [144], + "lines": [198], "starting_column": 9, - "ending_column": 83 + "ending_column": 37 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToGnosis", + "name": "_vaultRedemption", "source_mapping": { - "start": 5325, - "length": 237, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 7967, + "length": 343, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, - "lines": [142, 143, 144, 145], + "lines": [192, 193, 194, 195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "GnosisStrategy", + "name": "SkyFarmBaseStrategy", "source_mapping": { - "start": 584, - "length": 6684, - "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", - "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191 + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "recoverToGnosis(address,uint256)" + "signature": "_vaultRedemption(uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in GnosisStrategy.recoverToGnosis(address,uint256) (contracts/v2/strategies/GnosisStrategy.sol#142-145):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(gnosisSafeWallet,amount) (contracts/v2/strategies/GnosisStrategy.sol#143)\n\tEvent emitted after the call(s):\n\t- CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount) (contracts/v2/strategies/GnosisStrategy.sol#144)\n", - "markdown": "Reentrancy in [GnosisStrategy.recoverToGnosis(address,uint256)](contracts/v2/strategies/GnosisStrategy.sol#L142-L145):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(gnosisSafeWallet,amount)](contracts/v2/strategies/GnosisStrategy.sol#L143)\n\tEvent emitted after the call(s):\n\t- [CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount)](contracts/v2/strategies/GnosisStrategy.sol#L144)\n", - "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L142-L145", - "id": "d9bd0a33246588c83983d63975a9ce55470568eeff09e037f055b8e7122562e2", + "description": "Reentrancy in SkyFarmBaseStrategy._vaultRedemption(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#192-199):\n\tExternal calls:\n\t- daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#194)\n\t- daiToUsds.usdsToDai(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#197)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#198)\n", + "markdown": "Reentrancy in [SkyFarmBaseStrategy._vaultRedemption(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L192-L199):\n\tExternal calls:\n\t- [daiAmount = usdsVaultToken.redeem(vaultShares,address(this),address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L194)\n\t- [daiToUsds.usdsToDai(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L197)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L198)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L192-L199", + "id": "b9fbdaafb7ad19fc9d756b8ea0203efc9dc4f9e7de006c75fe74cbc90c6b8bdd", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -34309,106 +34426,212 @@ "elements": [ { "type": "function", - "name": "recoverToken", + "name": "_withdrawFromBaseStrategy", "source_mapping": { - "start": 2334, - "length": 206, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 25805, + "length": 2552, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" } }, { "type": "node", - "name": "IERC20(token).safeTransfer(to,amount)", + "name": "_withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount)", "source_mapping": { - "start": 2446, - "length": 38, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 27291, + "length": 85, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [68], - "starting_column": 9, - "ending_column": 47 + "lines": [608], + "starting_column": 17, + "ending_column": 102 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "_withdrawFromBaseStrategy", "source_mapping": { - "start": 2334, - "length": 206, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 25805, + "length": 2552, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" } } }, @@ -34416,72 +34639,479 @@ }, { "type": "node", - "name": "RecoveredToken(token,to,amount)", + "name": "_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))", "source_mapping": { - "start": 2495, - "length": 38, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 27554, + "length": 319, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [70], - "starting_column": 9, - "ending_column": 47 + "lines": [614, 615, 616, 617, 618, 619, 620, 621], + "starting_column": 21, + "ending_column": 22 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "_withdrawFromBaseStrategy", "source_mapping": { - "start": 2334, - "length": 206, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 25805, + "length": 2552, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, - "lines": [67, 68, 69, 70, 71], + "lines": [ + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuraStaking", + "name": "TreasuryReservesVault", "source_mapping": { - "start": 604, - "length": 5204, - "filename_relative": "contracts/amo/AuraStaking.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", - "filename_short": "contracts/amo/AuraStaking.sol", + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151 + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)", + "source_mapping": { + "start": 30399, + "length": 71, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [688], + "starting_column": 9, + "ending_column": 80 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_burnDToken", + "source_mapping": { + "start": 30000, + "length": 1179, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)", + "source_mapping": { + "start": 31082, + "length": 90, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [708], + "starting_column": 9, + "ending_column": 99 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_burnDToken", + "source_mapping": { + "start": 30000, + "length": 1179, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_burnDToken(address,ITreasuryReservesVault.StrategyConfig,IERC20,ITreasuryReservesVault.BorrowTokenConfig,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))", + "source_mapping": { + "start": 27554, + "length": 319, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [614, 615, 616, 617, 618, 619, 620, 621], + "starting_column": 21, + "ending_column": 22 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_withdrawFromBaseStrategy", + "source_mapping": { + "start": 25805, + "length": 2552, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in AuraStaking.recoverToken(address,address,uint256) (contracts/amo/AuraStaking.sol#67-71):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/amo/AuraStaking.sol#68)\n\tEvent emitted after the call(s):\n\t- RecoveredToken(token,to,amount) (contracts/amo/AuraStaking.sol#70)\n", - "markdown": "Reentrancy in [AuraStaking.recoverToken(address,address,uint256)](contracts/amo/AuraStaking.sol#L67-L71):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/amo/AuraStaking.sol#L68)\n\tEvent emitted after the call(s):\n\t- [RecoveredToken(token,to,amount)](contracts/amo/AuraStaking.sol#L70)\n", - "first_markdown_element": "contracts/amo/AuraStaking.sol#L67-L71", - "id": "721f7e4ea8f943fb92b4b72846f0042313e2b5e55c2edcd24d2ab5f7aab87665", + "description": "Reentrancy in TreasuryReservesVault._withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256) (contracts/v2/TreasuryReservesVault.sol#582-632):\n\tExternal calls:\n\t- _withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount) (contracts/v2/TreasuryReservesVault.sol#608)\n\t- _burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr)) (contracts/v2/TreasuryReservesVault.sol#614-621)\n\t\t- _burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount) (contracts/v2/TreasuryReservesVault.sol#688)\n\tEvent emitted after the call(s):\n\t- StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance) (contracts/v2/TreasuryReservesVault.sol#708)\n\t\t- _burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr)) (contracts/v2/TreasuryReservesVault.sol#614-621)\n", + "markdown": "Reentrancy in [TreasuryReservesVault._withdrawFromBaseStrategy(address,IERC20,ITreasuryReservesVault.BorrowTokenConfig,address,uint256)](contracts/v2/TreasuryReservesVault.sol#L582-L632):\n\tExternal calls:\n\t- [_withdrawnAmount = _baseStrategy.trvWithdraw(_withdrawFromBaseStrategyAmount)](contracts/v2/TreasuryReservesVault.sol#L608)\n\t- [_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))](contracts/v2/TreasuryReservesVault.sol#L614-L621)\n\t\t- [_burnedAmount = tokenConfig.dToken.burn(strategy,toBurnAmount)](contracts/v2/TreasuryReservesVault.sol#L688)\n\tEvent emitted after the call(s):\n\t- [StrategyCreditAndDebtBalance(strategy,address(token),_creditBalance,dTokenBalance)](contracts/v2/TreasuryReservesVault.sol#L708)\n\t\t- [_burnDToken(_baseStrategyAddr,strategies[_baseStrategyAddr],token,tokenConfig,_withdrawnAmount,tokenConfig.dToken.balanceOf(_baseStrategyAddr))](contracts/v2/TreasuryReservesVault.sol#L614-L621)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L582-L632", + "id": "89618dfba3ac7d15e5970daa2e83a543e99a75c999d6a13fbdd7a2d009309297", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -34490,15 +35120,20 @@ "elements": [ { "type": "function", - "name": "recoverToken", + "name": "addLiquidity", "source_mapping": { - "start": 10888, - "length": 197, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [272, 273, 274, 275, 276], + "lines": [ + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + ], "starting_column": 5, "ending_column": 6 }, @@ -34507,7 +35142,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -34563,35 +35198,40 @@ "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } }, { "type": "node", - "name": "IERC20(token).safeTransfer(to,amount)", + "name": "_tokenVault.borrowProtocolToken(protocolTokenAmount,address(this))", "source_mapping": { - "start": 10991, - "length": 38, + "start": 20654, + "length": 67, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [273], + "lines": [481], "starting_column": 9, - "ending_column": 47 + "ending_column": 76 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "addLiquidity", "source_mapping": { - "start": 10888, - "length": 197, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [272, 273, 274, 275, 276], + "lines": [ + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + ], "starting_column": 5, "ending_column": 6 }, @@ -34600,7 +35240,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -34660,7 +35300,7 @@ "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -34668,30 +35308,35 @@ }, { "type": "node", - "name": "RecoveredToken(token,to,amount)", + "name": "_tokenVault.borrowQuoteToken(quoteTokenAmount,address(this))", "source_mapping": { - "start": 11040, - "length": 38, + "start": 20731, + "length": 61, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [275], + "lines": [482], "starting_column": 9, - "ending_column": 47 + "ending_column": 70 }, "type_specific_fields": { "parent": { "type": "function", - "name": "recoverToken", + "name": "addLiquidity", "source_mapping": { - "start": 10888, - "length": 197, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [272, 273, 274, 275, 276], + "lines": [ + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 + ], "starting_column": 5, "ending_column": 6 }, @@ -34700,7 +35345,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -34760,499 +35405,42 @@ "ending_column": 0 } }, - "signature": "recoverToken(address,address,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in Ramos.recoverToken(address,address,uint256) (contracts/amo/Ramos.sol#272-276):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/amo/Ramos.sol#273)\n\tEvent emitted after the call(s):\n\t- RecoveredToken(token,to,amount) (contracts/amo/Ramos.sol#275)\n", - "markdown": "Reentrancy in [Ramos.recoverToken(address,address,uint256)](contracts/amo/Ramos.sol#L272-L276):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/amo/Ramos.sol#L273)\n\tEvent emitted after the call(s):\n\t- [RecoveredToken(token,to,amount)](contracts/amo/Ramos.sol#L275)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L272-L276", - "id": "15a59117d9f24ee76b20d5a5453f589570a7f156b421e560b9305927c9131e2c", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ + "additional_fields": { "underlying_type": "external_calls" } + }, { - "type": "function", - "name": "removeCollateral", + "type": "node", + "name": "protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount)", "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 20872, + "length": 80, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleLineOfCredit", - "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "removeCollateral(uint128,address)" - } - }, - { - "type": "node", - "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", - "source_mapping": { - "start": 7012, - "length": 118, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [173, 174, 175, 176, 177], - "starting_column": 9, - "ending_column": 10 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "removeCollateral", - "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleLineOfCredit", - "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "removeCollateral(uint128,address)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "CollateralRemoved(msg.sender,recipient,amount)", - "source_mapping": { - "start": 7320, - "length": 53, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [182], - "starting_column": 9, - "ending_column": 62 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "removeCollateral", - "source_mapping": { - "start": 6498, - "length": 1031, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleLineOfCredit", - "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "removeCollateral(uint128,address)" - } - } - }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleLineOfCredit.removeCollateral(uint128,address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#166-190):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#173-177)\n\tEvent emitted after the call(s):\n\t- CollateralRemoved(msg.sender,recipient,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#182)\n", - "markdown": "Reentrancy in [TempleLineOfCredit.removeCollateral(uint128,address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L173-L177)\n\tEvent emitted after the call(s):\n\t- [CollateralRemoved(msg.sender,recipient,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L182)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190", - "id": "995ebae8f6668f6a1d468a923e261df6e2cd441ac86401c473cc53982585815d", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "removeLiquidity", - "source_mapping": { - "start": 22407, - "length": 1408, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "Ramos", - "source_mapping": { - "start": 1890, - "length": 24208, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [ - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" - } - }, - { - "type": "node", - "name": "amoStaking.withdrawAndUnwrap(bptIn,false,address(this))", - "source_mapping": { - "start": 23088, - "length": 57, - "filename_relative": "contracts/amo/Ramos.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", - "filename_short": "contracts/amo/Ramos.sol", - "is_dependency": false, - "lines": [539], - "starting_column": 9, - "ending_column": 66 + "lines": [486], + "starting_column": 13, + "ending_column": 93 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 22407, - "length": 1408, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 ], "starting_column": 5, "ending_column": 6 @@ -35262,7 +35450,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -35322,7 +35510,7 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -35330,33 +35518,34 @@ }, { "type": "node", - "name": "balancerVault.exitPool(balancerPoolId,address(this),address(this),request)", + "name": "quoteToken.approve(address(balancerVault),0)", "source_mapping": { - "start": 23155, - "length": 77, + "start": 21131, + "length": 45, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [540], - "starting_column": 9, - "ending_column": 86 + "lines": [489], + "starting_column": 17, + "ending_column": 62 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 22407, - "length": 1408, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 ], "starting_column": 5, "ending_column": 6 @@ -35366,7 +35555,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -35426,7 +35615,7 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -35434,33 +35623,34 @@ }, { "type": "node", - "name": "_tokenVault.repayProtocolToken(protocolTokenAmount)", + "name": "quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount)", "source_mapping": { - "start": 23563, - "length": 51, + "start": 21194, + "length": 74, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [549], - "starting_column": 13, - "ending_column": 64 + "lines": [490], + "starting_column": 17, + "ending_column": 91 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 22407, - "length": 1408, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 ], "starting_column": 5, "ending_column": 6 @@ -35470,7 +35660,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -35530,7 +35720,7 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -35538,33 +35728,34 @@ }, { "type": "node", - "name": "_tokenVault.repayQuoteToken(quoteTokenAmount)", + "name": "balancerVault.joinPool(balancerPoolId,address(this),address(this),request)", "source_mapping": { - "start": 23675, - "length": 45, + "start": 21411, + "length": 77, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [553], + "lines": [497], "starting_column": 13, - "ending_column": 58 + "ending_column": 90 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 22407, - "length": 1408, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 ], "starting_column": 5, "ending_column": 6 @@ -35574,7 +35765,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -35634,7 +35825,7 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -35642,33 +35833,34 @@ }, { "type": "node", - "name": "LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn)", + "name": "LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)", "source_mapping": { - "start": 23741, - "length": 67, + "start": 21687, + "length": 75, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, - "lines": [556], + "lines": [504], "starting_column": 9, - "ending_column": 76 + "ending_column": 84 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 22407, - "length": 1408, + "start": 19878, + "length": 2088, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", "filename_short": "contracts/amo/Ramos.sol", "is_dependency": false, "lines": [ - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, - 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511 ], "starting_column": 5, "ending_column": 6 @@ -35678,7 +35870,7 @@ "type": "contract", "name": "Ramos", "source_mapping": { - "start": 1890, + "start": 1891, "length": 24208, "filename_relative": "contracts/amo/Ramos.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", @@ -35738,17 +35930,17 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in Ramos.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256) (contracts/amo/Ramos.sol#520-557):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptIn,false,address(this)) (contracts/amo/Ramos.sol#539)\n\t- balancerVault.exitPool(balancerPoolId,address(this),address(this),request) (contracts/amo/Ramos.sol#540)\n\t- _tokenVault.repayProtocolToken(protocolTokenAmount) (contracts/amo/Ramos.sol#549)\n\t- _tokenVault.repayQuoteToken(quoteTokenAmount) (contracts/amo/Ramos.sol#553)\n\tEvent emitted after the call(s):\n\t- LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn) (contracts/amo/Ramos.sol#556)\n", - "markdown": "Reentrancy in [Ramos.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)](contracts/amo/Ramos.sol#L520-L557):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptIn,false,address(this))](contracts/amo/Ramos.sol#L539)\n\t- [balancerVault.exitPool(balancerPoolId,address(this),address(this),request)](contracts/amo/Ramos.sol#L540)\n\t- [_tokenVault.repayProtocolToken(protocolTokenAmount)](contracts/amo/Ramos.sol#L549)\n\t- [_tokenVault.repayQuoteToken(quoteTokenAmount)](contracts/amo/Ramos.sol#L553)\n\tEvent emitted after the call(s):\n\t- [LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn)](contracts/amo/Ramos.sol#L556)\n", - "first_markdown_element": "contracts/amo/Ramos.sol#L520-L557", - "id": "58971ea68a44f13c3035e5c40470aed4ee35ec8780baec9e6fde35f1a56bae22", + "description": "Reentrancy in Ramos.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/amo/Ramos.sol#462-511):\n\tExternal calls:\n\t- _tokenVault.borrowProtocolToken(protocolTokenAmount,address(this)) (contracts/amo/Ramos.sol#481)\n\t- _tokenVault.borrowQuoteToken(quoteTokenAmount,address(this)) (contracts/amo/Ramos.sol#482)\n\t- protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount) (contracts/amo/Ramos.sol#486)\n\t- quoteToken.approve(address(balancerVault),0) (contracts/amo/Ramos.sol#489)\n\t- quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount) (contracts/amo/Ramos.sol#490)\n\t- balancerVault.joinPool(balancerPoolId,address(this),address(this),request) (contracts/amo/Ramos.sol#497)\n\tEvent emitted after the call(s):\n\t- LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) (contracts/amo/Ramos.sol#504)\n", + "markdown": "Reentrancy in [Ramos.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/amo/Ramos.sol#L462-L511):\n\tExternal calls:\n\t- [_tokenVault.borrowProtocolToken(protocolTokenAmount,address(this))](contracts/amo/Ramos.sol#L481)\n\t- [_tokenVault.borrowQuoteToken(quoteTokenAmount,address(this))](contracts/amo/Ramos.sol#L482)\n\t- [protocolToken.safeIncreaseAllowance(address(balancerVault),protocolTokenAmount)](contracts/amo/Ramos.sol#L486)\n\t- [quoteToken.approve(address(balancerVault),0)](contracts/amo/Ramos.sol#L489)\n\t- [quoteToken.safeIncreaseAllowance(address(balancerVault),quoteTokenAmount)](contracts/amo/Ramos.sol#L490)\n\t- [balancerVault.joinPool(balancerPoolId,address(this),address(this),request)](contracts/amo/Ramos.sol#L497)\n\tEvent emitted after the call(s):\n\t- [LiquidityAdded(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)](contracts/amo/Ramos.sol#L504)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L462-L511", + "id": "091d4b185888c9ea40fc206a3a47abe3a16a55f493010202d1ea982502231085", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -35757,15 +35949,15 @@ "elements": [ { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 8140, + "start": 7072, "length": 365, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [209, 210, 211, 212, 213, 214, 215], + "lines": [181, 182, 183, 184, 185, 186, 187, 188], "starting_column": 5, "ending_column": 6 }, @@ -35774,7 +35966,7 @@ "type": "contract", "name": "RamosStrategy", "source_mapping": { - "start": 1131, + "start": 1132, "length": 9320, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", @@ -35804,35 +35996,35 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } }, { "type": "node", - "name": "(quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount)", + "name": "(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData)", "source_mapping": { - "start": 8277, - "length": 140, + "start": 7186, + "length": 161, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [210, 211, 212, 213], + "lines": [182, 183, 184, 185, 186], "starting_column": 9, - "ending_column": 60 + "ending_column": 45 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 8140, + "start": 7072, "length": 365, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [209, 210, 211, 212, 213, 214, 215], + "lines": [181, 182, 183, 184, 185, 186, 187, 188], "starting_column": 5, "ending_column": 6 }, @@ -35841,7 +36033,7 @@ "type": "contract", "name": "RamosStrategy", "source_mapping": { - "start": 1131, + "start": 1132, "length": 9320, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", @@ -35873,7 +36065,7 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, @@ -35881,30 +36073,30 @@ }, { "type": "node", - "name": "RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount)", + "name": "AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)", "source_mapping": { - "start": 8427, - "length": 71, + "start": 7357, + "length": 73, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [214], + "lines": [187], "starting_column": 9, - "ending_column": 80 + "ending_column": 82 }, "type_specific_fields": { "parent": { "type": "function", - "name": "removeLiquidity", + "name": "addLiquidity", "source_mapping": { - "start": 8140, + "start": 7072, "length": 365, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", "filename_short": "contracts/v2/strategies/RamosStrategy.sol", "is_dependency": false, - "lines": [209, 210, 211, 212, 213, 214, 215], + "lines": [181, 182, 183, 184, 185, 186, 187, 188], "starting_column": 5, "ending_column": 6 }, @@ -35913,7 +36105,7 @@ "type": "contract", "name": "RamosStrategy", "source_mapping": { - "start": 1131, + "start": 1132, "length": 9320, "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", @@ -35945,17 +36137,17 @@ "ending_column": 0 } }, - "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + "signature": "addLiquidity(IBalancerVault.JoinPoolRequest)" } } }, "additional_fields": { "underlying_type": "event" } } ], - "description": "Reentrancy in RamosStrategy.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256) (contracts/v2/strategies/RamosStrategy.sol#209-215):\n\tExternal calls:\n\t- (quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount) (contracts/v2/strategies/RamosStrategy.sol#210-213)\n\tEvent emitted after the call(s):\n\t- RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount) (contracts/v2/strategies/RamosStrategy.sol#214)\n", - "markdown": "Reentrancy in [RamosStrategy.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)](contracts/v2/strategies/RamosStrategy.sol#L209-L215):\n\tExternal calls:\n\t- [(quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L210-L213)\n\tEvent emitted after the call(s):\n\t- [RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L214)\n", - "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L209-L215", - "id": "7c31093def50156c36e632afd1bdd7b3c7f967dee0aff539f837b6a8448615ae", + "description": "Reentrancy in RamosStrategy.addLiquidity(IBalancerVault.JoinPoolRequest) (contracts/v2/strategies/RamosStrategy.sol#181-188):\n\tExternal calls:\n\t- (quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData) (contracts/v2/strategies/RamosStrategy.sol#182-186)\n\tEvent emitted after the call(s):\n\t- AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) (contracts/v2/strategies/RamosStrategy.sol#187)\n", + "markdown": "Reentrancy in [RamosStrategy.addLiquidity(IBalancerVault.JoinPoolRequest)](contracts/v2/strategies/RamosStrategy.sol#L181-L188):\n\tExternal calls:\n\t- [(quoteTokenAmount,protocolTokenAmount,bptTokensStaked) = ramos.addLiquidity(_requestData)](contracts/v2/strategies/RamosStrategy.sol#L182-L186)\n\tEvent emitted after the call(s):\n\t- [AddLiquidity(quoteTokenAmount,protocolTokenAmount,bptTokensStaked)](contracts/v2/strategies/RamosStrategy.sol#L187)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L181-L188", + "id": "86c6739a14ef579509f4e0190b6310b585123eb008deed594e5fdc44ec40eefe", "check": "reentrancy-events", "impact": "Low", "confidence": "Medium" @@ -35964,227 +36156,112 @@ "elements": [ { "type": "function", - "name": "setTlcStrategy", + "name": "borrow", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3213, + "length": 319, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 - ], + "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "GnosisStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTlcStrategy(address)" + "signature": "borrow(IERC20,uint256)" } }, { "type": "node", - "name": "daiToken.approve(previousTrv,0)", + "name": "circuitBreakerProxy.preCheck(address(token),msg.sender,amount)", "source_mapping": { - "start": 16002, - "length": 32, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3297, + "length": 112, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [394], - "starting_column": 13, - "ending_column": 45 + "lines": [89, 90, 91, 92, 93], + "starting_column": 9, + "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTlcStrategy", + "name": "borrow", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3213, + "length": 319, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 - ], + "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "GnosisStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTlcStrategy(address)" + "signature": "borrow(IERC20,uint256)" } } }, @@ -36192,473 +36269,281 @@ }, { "type": "node", - "name": "daiToken.forceApprove(_trv,type()(uint256).max)", + "name": "Borrow(address(token),amount)", "source_mapping": { - "start": 16245, - "length": 46, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3419, + "length": 35, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [402], - "starting_column": 13, - "ending_column": 59 + "lines": [94], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTlcStrategy", + "name": "borrow", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 3213, + "length": 319, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, - "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 - ], + "lines": [88, 89, 90, 91, 92, 93, 94, 95, 96], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "GnosisStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTlcStrategy(address)" + "signature": "borrow(IERC20,uint256)" } } }, - "additional_fields": { "underlying_type": "external_calls" } + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in GnosisStrategy.borrow(IERC20,uint256) (contracts/v2/strategies/GnosisStrategy.sol#88-96):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(token),msg.sender,amount) (contracts/v2/strategies/GnosisStrategy.sol#89-93)\n\tEvent emitted after the call(s):\n\t- Borrow(address(token),amount) (contracts/v2/strategies/GnosisStrategy.sol#94)\n", + "markdown": "Reentrancy in [GnosisStrategy.borrow(IERC20,uint256)](contracts/v2/strategies/GnosisStrategy.sol#L88-L96):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(token),msg.sender,amount)](contracts/v2/strategies/GnosisStrategy.sol#L89-L93)\n\tEvent emitted after the call(s):\n\t- [Borrow(address(token),amount)](contracts/v2/strategies/GnosisStrategy.sol#L94)\n", + "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L88-L96", + "id": "816d5794942352b4b9c381b210cb4b35ac9c43889f1c7eaa1b7e32f3c1f8ab33", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [195, 196, 197, 198, 199], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowAndDeposit(uint256)" + } }, { "type": "node", - "name": "TlcStrategySet(newTlcStrategy,_trv)", + "name": "treasuryReservesVault.borrow(daiToken,amount,address(this))", "source_mapping": { - "start": 16312, - "length": 41, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 7960, + "length": 61, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [405], + "lines": [197], "starting_column": 9, - "ending_column": 50 + "ending_column": 70 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTlcStrategy", + "name": "borrowAndDeposit", "source_mapping": { - "start": 15688, - "length": 819, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 - ], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTlcStrategy(address)" + "signature": "borrowAndDeposit(uint256)" } } }, - "additional_fields": { "underlying_type": "event" } - } - ], - "description": "Reentrancy in TempleLineOfCredit.setTlcStrategy(address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#386-409):\n\tExternal calls:\n\t- daiToken.approve(previousTrv,0) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#394)\n\t- daiToken.forceApprove(_trv,type()(uint256).max) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#402)\n\tEvent emitted after the call(s):\n\t- TlcStrategySet(newTlcStrategy,_trv) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#405)\n", - "markdown": "Reentrancy in [TempleLineOfCredit.setTlcStrategy(address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409):\n\tExternal calls:\n\t- [daiToken.approve(previousTrv,0)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L394)\n\t- [daiToken.forceApprove(_trv,type()(uint256).max)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L402)\n\tEvent emitted after the call(s):\n\t- [TlcStrategySet(newTlcStrategy,_trv)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L405)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409", - "id": "c39c59a77f1824a150880b6907c47e451f7784419c1b3eab509e104e0a7eba72", - "check": "reentrancy-events", - "impact": "Low", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "shutdown", - "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryReservesVault", - "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", - "is_dependency": false, - "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "shutdown(address)" - } + "additional_fields": { "underlying_type": "external_calls" } }, { "type": "node", - "name": "_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)", + "name": "_dsrDeposit(amount)", "source_mapping": { - "start": 12499, - "length": 64, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 8031, + "length": 19, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [296], - "starting_column": 13, - "ending_column": 77 + "lines": [198], + "starting_column": 9, + "ending_column": 28 }, "type_specific_fields": { "parent": { "type": "function", - "name": "shutdown", + "name": "borrowAndDeposit", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [195, 196, 197, 198, 199], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "shutdown(address)" + "signature": "borrowAndDeposit(uint256)" } } }, @@ -36666,169 +36551,7364 @@ }, { "type": "node", - "name": "StrategyRemoved(strategy)", + "name": "chi = pot.drip()", "source_mapping": { - "start": 13162, - "length": 30, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [312], + "lines": [142], "starting_column": 9, - "ending_column": 39 + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "shutdown", + "name": "_checkpointChi", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [140, 141, 142, 143], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "shutdown(address)" + "signature": "_checkpointChi()" } } }, - "additional_fields": { "underlying_type": "event" } + "additional_fields": { "underlying_type": "external_calls_sending_eth" } }, { "type": "node", - "name": "StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt})", + "name": "daiJoin.join(address(this),amount)", "source_mapping": { - "start": 12577, - "length": 231, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 8344, + "length": 35, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [297, 298, 299, 300, 301, 302], - "starting_column": 13, - "ending_column": 15 + "lines": [207], + "starting_column": 9, + "ending_column": 44 }, "type_specific_fields": { "parent": { "type": "function", - "name": "shutdown", + "name": "_dsrDeposit", "source_mapping": { - "start": 11822, - "length": 1632, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [ - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 - ], + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryReservesVault", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 2150, - "length": 32023, - "filename_relative": "contracts/v2/TreasuryReservesVault.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", - "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, "lines": [ - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "pot.join(shares)", + "source_mapping": { + "start": 8389, + "length": 16, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [208], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrDeposit", + "source_mapping": { + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DaiDeposited(amount)", + "source_mapping": { + "start": 8309, + "length": 25, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [206], + "starting_column": 9, + "ending_column": 34 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrDeposit", + "source_mapping": { + "start": 8063, + "length": 349, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_dsrDeposit(amount)", + "source_mapping": { + "start": 8031, + "length": 19, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [198], + "starting_column": 9, + "ending_column": 28 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 7811, + "length": 246, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [195, 196, 197, 198, 199], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#195-199):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(daiToken,amount,address(this)) (contracts/v2/strategies/DsrBaseStrategy.sol#197)\n\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t\t- daiJoin.join(address(this),amount) (contracts/v2/strategies/DsrBaseStrategy.sol#207)\n\t\t- pot.join(shares) (contracts/v2/strategies/DsrBaseStrategy.sol#208)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#206)\n\t\t- _dsrDeposit(amount) (contracts/v2/strategies/DsrBaseStrategy.sol#198)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(daiToken,amount,address(this))](contracts/v2/strategies/DsrBaseStrategy.sol#L197)\n\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t\t- [daiJoin.join(address(this),amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L207)\n\t\t- [pot.join(shares)](contracts/v2/strategies/DsrBaseStrategy.sol#L208)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L206)\n\t\t- [_dsrDeposit(amount)](contracts/v2/strategies/DsrBaseStrategy.sol#L198)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L195-L199", + "id": "fa02cb67c0fadd634b5b58c828b6c896bd82d9eafb17365664e0ed1810997c50", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 4194, + "length": 246, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [103, 104, 105, 106, 107], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + }, + { + "type": "node", + "name": "treasuryReservesVault.borrow(daiToken,amount,address(this))", + "source_mapping": { + "start": 4343, + "length": 61, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [105], + "starting_column": 9, + "ending_column": 70 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 4194, + "length": 246, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [103, 104, 105, 106, 107], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "_daiDeposit(amount)", + "source_mapping": { + "start": 4414, + "length": 19, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [106], + "starting_column": 9, + "ending_column": 28 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 4194, + "length": 246, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [103, 104, 105, 106, 107], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "daiToUsds.daiToUsds(address(this),daiAmount)", + "source_mapping": { + "start": 7458, + "length": 45, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [176], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_daiDeposit", + "source_mapping": { + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_daiDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "usdsVaultToken.deposit(daiAmount,address(this))", + "source_mapping": { + "start": 7561, + "length": 48, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [179], + "starting_column": 9, + "ending_column": 57 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_daiDeposit", + "source_mapping": { + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_daiDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DaiDeposited(daiAmount)", + "source_mapping": { + "start": 7619, + "length": 28, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [180], + "starting_column": 9, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_daiDeposit", + "source_mapping": { + "start": 7372, + "length": 282, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [174, 175, 176, 177, 178, 179, 180, 181], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_daiDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_daiDeposit(amount)", + "source_mapping": { + "start": 4414, + "length": 19, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [106], + "starting_column": 9, + "ending_column": 28 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 4194, + "length": 246, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [103, 104, 105, 106, 107], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SkyFarmBaseStrategy", + "source_mapping": { + "start": 853, + "length": 8473, + "filename_relative": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/SkyFarmBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in SkyFarmBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#103-107):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(daiToken,amount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#105)\n\t- _daiDeposit(amount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#106)\n\t\t- daiToUsds.daiToUsds(address(this),daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#176)\n\t\t- usdsVaultToken.deposit(daiAmount,address(this)) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#179)\n\tEvent emitted after the call(s):\n\t- DaiDeposited(daiAmount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#180)\n\t\t- _daiDeposit(amount) (contracts/v2/strategies/SkyFarmBaseStrategy.sol#106)\n", + "markdown": "Reentrancy in [SkyFarmBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L103-L107):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(daiToken,amount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L105)\n\t- [_daiDeposit(amount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L106)\n\t\t- [daiToUsds.daiToUsds(address(this),daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L176)\n\t\t- [usdsVaultToken.deposit(daiAmount,address(this))](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L179)\n\tEvent emitted after the call(s):\n\t- [DaiDeposited(daiAmount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L180)\n\t\t- [_daiDeposit(amount)](contracts/v2/strategies/SkyFarmBaseStrategy.sol#L106)\n", + "first_markdown_element": "contracts/v2/strategies/SkyFarmBaseStrategy.sol#L103-L107", + "id": "7801f7ed954e6c382883d3916d5a3aaf2908821f630755ae3b9acee0bc1b7f6b", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 2047, + "length": 229, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [61, 62, 63, 64, 65], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTokenBaseStrategy", + "source_mapping": { + "start": 690, + "length": 4427, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + }, + { + "type": "node", + "name": "treasuryReservesVault.borrow(templeToken,amount,address(this))", + "source_mapping": { + "start": 2136, + "length": 64, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [62], + "starting_column": 9, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 2047, + "length": 229, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [61, 62, 63, 64, 65], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTokenBaseStrategy", + "source_mapping": { + "start": 690, + "length": 4427, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TempleBurned(amount)", + "source_mapping": { + "start": 2210, + "length": 25, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [63], + "starting_column": 9, + "ending_column": 34 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowAndDeposit", + "source_mapping": { + "start": 2047, + "length": 229, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [61, 62, 63, 64, 65], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTokenBaseStrategy", + "source_mapping": { + "start": 690, + "length": 4427, + "filename_relative": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/TempleTokenBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowAndDeposit(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTokenBaseStrategy.borrowAndDeposit(uint256) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#61-65):\n\tExternal calls:\n\t- treasuryReservesVault.borrow(templeToken,amount,address(this)) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#62)\n\tEvent emitted after the call(s):\n\t- TempleBurned(amount) (contracts/v2/strategies/TempleTokenBaseStrategy.sol#63)\n", + "markdown": "Reentrancy in [TempleTokenBaseStrategy.borrowAndDeposit(uint256)](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L61-L65):\n\tExternal calls:\n\t- [treasuryReservesVault.borrow(templeToken,amount,address(this))](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L62)\n\tEvent emitted after the call(s):\n\t- [TempleBurned(amount)](contracts/v2/strategies/TempleTokenBaseStrategy.sol#L63)\n", + "first_markdown_element": "contracts/v2/strategies/TempleTokenBaseStrategy.sol#L61-L65", + "id": "a4b7ebab2add03874fc7d7e0fb2176bb3cce4461f7bee4c56c5e3938077ba4b2", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowMax", + "source_mapping": { + "start": 3669, + "length": 489, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowMax(IERC20)" + } + }, + { + "type": "node", + "name": "circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount)", + "source_mapping": { + "start": 3916, + "length": 120, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [105, 106, 107, 108, 109], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowMax", + "source_mapping": { + "start": 3669, + "length": 489, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowMax(IERC20)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Borrow(address(token),borrowedAmount)", + "source_mapping": { + "start": 4046, + "length": 43, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [110], + "starting_column": 9, + "ending_column": 52 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowMax", + "source_mapping": { + "start": 3669, + "length": 489, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowMax(IERC20)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in GnosisStrategy.borrowMax(IERC20) (contracts/v2/strategies/GnosisStrategy.sol#102-112):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount) (contracts/v2/strategies/GnosisStrategy.sol#105-109)\n\tEvent emitted after the call(s):\n\t- Borrow(address(token),borrowedAmount) (contracts/v2/strategies/GnosisStrategy.sol#110)\n", + "markdown": "Reentrancy in [GnosisStrategy.borrowMax(IERC20)](contracts/v2/strategies/GnosisStrategy.sol#L102-L112):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(token),msg.sender,borrowedAmount)](contracts/v2/strategies/GnosisStrategy.sol#L105-L109)\n\tEvent emitted after the call(s):\n\t- [Borrow(address(token),borrowedAmount)](contracts/v2/strategies/GnosisStrategy.sol#L110)\n", + "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L102-L112", + "id": "c3beb3c3be57476ae61c0a7cfb0301faed9288220416d314839649d2de9f7b5e", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowProtocolToken", + "source_mapping": { + "start": 3627, + "length": 353, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowProtocolToken(uint256,address)" + } + }, + { + "type": "node", + "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", + "source_mapping": { + "start": 3729, + "length": 118, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [92, 93, 94, 95, 96], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowProtocolToken", + "source_mapping": { + "start": 3627, + "length": 353, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowProtocolToken(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "BorrowToken(address(templeToken),amount)", + "source_mapping": { + "start": 3857, + "length": 46, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [97], + "starting_column": 9, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowProtocolToken", + "source_mapping": { + "start": 3627, + "length": 353, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowProtocolToken(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in RamosStrategy.borrowProtocolToken(uint256,address) (contracts/v2/strategies/RamosStrategy.sol#91-99):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/strategies/RamosStrategy.sol#92-96)\n\tEvent emitted after the call(s):\n\t- BorrowToken(address(templeToken),amount) (contracts/v2/strategies/RamosStrategy.sol#97)\n", + "markdown": "Reentrancy in [RamosStrategy.borrowProtocolToken(uint256,address)](contracts/v2/strategies/RamosStrategy.sol#L91-L99):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/strategies/RamosStrategy.sol#L92-L96)\n\tEvent emitted after the call(s):\n\t- [BorrowToken(address(templeToken),amount)](contracts/v2/strategies/RamosStrategy.sol#L97)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L91-L99", + "id": "e0ba9fad7b97dfcfdfbb8b5dcf413149d4e3c15549b5560fb8aacdf2167f9e31", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "borrowQuoteToken", + "source_mapping": { + "start": 4173, + "length": 347, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowQuoteToken(uint256,address)" + } + }, + { + "type": "node", + "name": "circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount)", + "source_mapping": { + "start": 4272, + "length": 117, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [107, 108, 109, 110, 111], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowQuoteToken", + "source_mapping": { + "start": 4173, + "length": 347, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowQuoteToken(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "BorrowToken(address(quoteToken),amount)", + "source_mapping": { + "start": 4399, + "length": 45, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [112], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "borrowQuoteToken", + "source_mapping": { + "start": 4173, + "length": 347, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "borrowQuoteToken(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in RamosStrategy.borrowQuoteToken(uint256,address) (contracts/v2/strategies/RamosStrategy.sol#106-114):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount) (contracts/v2/strategies/RamosStrategy.sol#107-111)\n\tEvent emitted after the call(s):\n\t- BorrowToken(address(quoteToken),amount) (contracts/v2/strategies/RamosStrategy.sol#112)\n", + "markdown": "Reentrancy in [RamosStrategy.borrowQuoteToken(uint256,address)](contracts/v2/strategies/RamosStrategy.sol#L106-L114):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(quoteToken),msg.sender,amount)](contracts/v2/strategies/RamosStrategy.sol#L107-L111)\n\tEvent emitted after the call(s):\n\t- [BorrowToken(address(quoteToken),amount)](contracts/v2/strategies/RamosStrategy.sol#L112)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L106-L114", + "id": "bbc7a06e8819c324c8e6cacd486325e56ef60f1d5a3b26d061c95866855e9804", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "checkpointAssetBalances", + "source_mapping": { + "start": 6890, + "length": 403, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "checkpointAssetBalances()" + } + }, + { + "type": "node", + "name": "(daiBalance) = _checkpointDaiBalance()", + "source_mapping": { + "start": 7013, + "length": 48, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [176], + "starting_column": 9, + "ending_column": 57 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "checkpointAssetBalances", + "source_mapping": { + "start": 6890, + "length": 403, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "checkpointAssetBalances()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "chi = pot.drip()", + "source_mapping": { + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [142], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_checkpointChi", + "source_mapping": { + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [140, 141, 142, 143], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_checkpointChi()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "AssetBalancesCheckpoint(assetBalances)", + "source_mapping": { + "start": 7243, + "length": 43, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [182], + "starting_column": 9, + "ending_column": 52 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "checkpointAssetBalances", + "source_mapping": { + "start": 6890, + "length": 403, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "checkpointAssetBalances()" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy.checkpointAssetBalances() (contracts/v2/strategies/DsrBaseStrategy.sol#173-183):\n\tExternal calls:\n\t- (daiBalance) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#176)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\tEvent emitted after the call(s):\n\t- AssetBalancesCheckpoint(assetBalances) (contracts/v2/strategies/DsrBaseStrategy.sol#182)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.checkpointAssetBalances()](contracts/v2/strategies/DsrBaseStrategy.sol#L173-L183):\n\tExternal calls:\n\t- [(daiBalance) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L176)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\tEvent emitted after the call(s):\n\t- [AssetBalancesCheckpoint(assetBalances)](contracts/v2/strategies/DsrBaseStrategy.sol#L182)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L173-L183", + "id": "91547e7be3e8d823bd0bb0f659906fbda2e7c22a3e071f2d8982d126ca2e8293", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "depositAndStakeBptTokens", + "source_mapping": { + "start": 24026, + "length": 411, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "depositAndStakeBptTokens(uint256,bool)" + } + }, + { + "type": "node", + "name": "bptToken.safeTransferFrom(msg.sender,address(this),amount)", + "source_mapping": { + "start": 24209, + "length": 60, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [569], + "starting_column": 13, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositAndStakeBptTokens", + "source_mapping": { + "start": 24026, + "length": 411, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "depositAndStakeBptTokens(uint256,bool)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "bptToken.safeTransfer(address(amoStaking),amount)", + "source_mapping": { + "start": 24289, + "length": 50, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [571], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositAndStakeBptTokens", + "source_mapping": { + "start": 24026, + "length": 411, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "depositAndStakeBptTokens(uint256,bool)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "amoStaking.depositAndStake(amount)", + "source_mapping": { + "start": 24349, + "length": 34, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [572], + "starting_column": 9, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositAndStakeBptTokens", + "source_mapping": { + "start": 24026, + "length": 411, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "depositAndStakeBptTokens(uint256,bool)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "DepositAndStakeBptTokens(amount)", + "source_mapping": { + "start": 24393, + "length": 37, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [573], + "starting_column": 9, + "ending_column": 46 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositAndStakeBptTokens", + "source_mapping": { + "start": 24026, + "length": 411, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "depositAndStakeBptTokens(uint256,bool)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.depositAndStakeBptTokens(uint256,bool) (contracts/amo/Ramos.sol#564-574):\n\tExternal calls:\n\t- bptToken.safeTransferFrom(msg.sender,address(this),amount) (contracts/amo/Ramos.sol#569)\n\t- bptToken.safeTransfer(address(amoStaking),amount) (contracts/amo/Ramos.sol#571)\n\t- amoStaking.depositAndStake(amount) (contracts/amo/Ramos.sol#572)\n\tEvent emitted after the call(s):\n\t- DepositAndStakeBptTokens(amount) (contracts/amo/Ramos.sol#573)\n", + "markdown": "Reentrancy in [Ramos.depositAndStakeBptTokens(uint256,bool)](contracts/amo/Ramos.sol#L564-L574):\n\tExternal calls:\n\t- [bptToken.safeTransferFrom(msg.sender,address(this),amount)](contracts/amo/Ramos.sol#L569)\n\t- [bptToken.safeTransfer(address(amoStaking),amount)](contracts/amo/Ramos.sol#L571)\n\t- [amoStaking.depositAndStake(amount)](contracts/amo/Ramos.sol#L572)\n\tEvent emitted after the call(s):\n\t- [DepositAndStakeBptTokens(amount)](contracts/amo/Ramos.sol#L573)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L564-L574", + "id": "a7249c20cc127d6173fc40d9683538ced29502e2d3e8095440a2939d5dddf5d0", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "rebalanceDownExit", + "source_mapping": { + "start": 13777, + "length": 1330, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownExit(uint256,uint256)" + } + }, + { + "type": "node", + "name": "amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))", + "source_mapping": { + "start": 14208, + "length": 70, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [341], + "starting_column": 9, + "ending_column": 79 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownExit", + "source_mapping": { + "start": 13777, + "length": 1330, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken)", + "source_mapping": { + "start": 14328, + "length": 266, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [344, 345, 346, 347], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownExit", + "source_mapping": { + "start": 13777, + "length": 1330, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "quoteToken.safeTransfer(feeCollector,feeAmt)", + "source_mapping": { + "start": 14787, + "length": 45, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [352], + "starting_column": 13, + "ending_column": 58 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownExit", + "source_mapping": { + "start": 13777, + "length": 1330, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt)", + "source_mapping": { + "start": 14926, + "length": 64, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [358], + "starting_column": 9, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownExit", + "source_mapping": { + "start": 13777, + "length": 1330, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.rebalanceDownExit(uint256,uint256) (contracts/amo/Ramos.sol#332-362):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper)) (contracts/amo/Ramos.sol#341)\n\t- quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken) (contracts/amo/Ramos.sol#344-347)\n\t- quoteToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#352)\n\tEvent emitted after the call(s):\n\t- RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt) (contracts/amo/Ramos.sol#358)\n", + "markdown": "Reentrancy in [Ramos.rebalanceDownExit(uint256,uint256)](contracts/amo/Ramos.sol#L332-L362):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))](contracts/amo/Ramos.sol#L341)\n\t- [quoteTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minQuoteTokenAmountOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,treasuryPriceIndex(),quoteToken)](contracts/amo/Ramos.sol#L344-L347)\n\t- [quoteToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L352)\n\tEvent emitted after the call(s):\n\t- [RebalanceDownExit(bptAmountIn,quoteTokenAmountOut,feeAmt)](contracts/amo/Ramos.sol#L358)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L332-L362", + "id": "86a53e330fffe167ad16fe5543549acebea2b6d799ac824c06d7b5f50d6c38da", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + }, + { + "type": "node", + "name": "tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this))", + "source_mapping": { + "start": 18313, + "length": 68, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [427], + "starting_column": 9, + "ending_column": 77 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "protocolToken.safeTransfer(feeCollector,feeAmt)", + "source_mapping": { + "start": 18587, + "length": 48, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [432], + "starting_column": 13, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "protocolToken.safeTransfer(address(_poolHelper),joinAmountIn)", + "source_mapping": { + "start": 18819, + "length": 62, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [438], + "starting_column": 9, + "ending_column": 71 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken)", + "source_mapping": { + "start": 18934, + "length": 264, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [441, 442, 443, 444, 445], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt)", + "source_mapping": { + "start": 19208, + "length": 70, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [446], + "starting_column": 9, + "ending_column": 79 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceDownJoin", + "source_mapping": { + "start": 17949, + "length": 1545, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceDownJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.rebalanceDownJoin(uint256,uint256) (contracts/amo/Ramos.sol#419-453):\n\tExternal calls:\n\t- tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this)) (contracts/amo/Ramos.sol#427)\n\t- protocolToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#432)\n\t- protocolToken.safeTransfer(address(_poolHelper),joinAmountIn) (contracts/amo/Ramos.sol#438)\n\t- bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken) (contracts/amo/Ramos.sol#441-445)\n\tEvent emitted after the call(s):\n\t- RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt) (contracts/amo/Ramos.sol#446)\n", + "markdown": "Reentrancy in [Ramos.rebalanceDownJoin(uint256,uint256)](contracts/amo/Ramos.sol#L419-L453):\n\tExternal calls:\n\t- [tokenVault.borrowProtocolToken(protocolTokenAmountIn,address(this))](contracts/amo/Ramos.sol#L427)\n\t- [protocolToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L432)\n\t- [protocolToken.safeTransfer(address(_poolHelper),joinAmountIn)](contracts/amo/Ramos.sol#L438)\n\t- [bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,protocolTokenBalancerPoolIndex,protocolToken)](contracts/amo/Ramos.sol#L441-L445)\n\tEvent emitted after the call(s):\n\t- [RebalanceDownJoin(protocolTokenAmountIn,bptTokensStaked,feeAmt)](contracts/amo/Ramos.sol#L446)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L419-L453", + "id": "cf17a4ee1ba6b6f324d63d28f3c7859bb03f334538e78ac2daf4f5d9278251dd", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "rebalanceUpExit", + "source_mapping": { + "start": 11724, + "length": 1435, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpExit(uint256,uint256)" + } + }, + { + "type": "node", + "name": "amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))", + "source_mapping": { + "start": 12147, + "length": 70, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [297], + "starting_column": 9, + "ending_column": 79 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpExit", + "source_mapping": { + "start": 11724, + "length": 1435, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken)", + "source_mapping": { + "start": 12274, + "length": 279, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [300, 301, 302, 303, 304], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpExit", + "source_mapping": { + "start": 11724, + "length": 1435, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "protocolToken.safeTransfer(feeCollector,feeAmt)", + "source_mapping": { + "start": 12752, + "length": 48, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [309], + "starting_column": 13, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpExit", + "source_mapping": { + "start": 11724, + "length": 1435, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt)", + "source_mapping": { + "start": 12968, + "length": 65, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [316], + "starting_column": 9, + "ending_column": 74 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpExit", + "source_mapping": { + "start": 11724, + "length": 1435, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpExit(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.rebalanceUpExit(uint256,uint256) (contracts/amo/Ramos.sol#288-320):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper)) (contracts/amo/Ramos.sol#297)\n\t- protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken) (contracts/amo/Ramos.sol#300-304)\n\t- protocolToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#309)\n\tEvent emitted after the call(s):\n\t- RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt) (contracts/amo/Ramos.sol#316)\n", + "markdown": "Reentrancy in [Ramos.rebalanceUpExit(uint256,uint256)](contracts/amo/Ramos.sol#L288-L320):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptAmountIn,false,address(_poolHelper))](contracts/amo/Ramos.sol#L297)\n\t- [protocolTokenAmountOut = _poolHelper.exitPool(bptAmountIn,minProtocolTokenOut,rebalancePercentageBoundLow,rebalancePercentageBoundUp,postRebalanceDelta,protocolTokenBalancerPoolIndex,treasuryPriceIndex(),protocolToken)](contracts/amo/Ramos.sol#L300-L304)\n\t- [protocolToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L309)\n\tEvent emitted after the call(s):\n\t- [RebalanceUpExit(bptAmountIn,protocolTokenAmountOut,feeAmt)](contracts/amo/Ramos.sol#L316)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L288-L320", + "id": "f01702004594863e23f38f398fde5ec3a792ca5c4b26bd0a6b93e8dc1846cabf", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + }, + { + "type": "node", + "name": "tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this))", + "source_mapping": { + "start": 16124, + "length": 62, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [382], + "starting_column": 9, + "ending_column": 71 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "quoteToken.safeTransfer(feeCollector,feeAmt)", + "source_mapping": { + "start": 16379, + "length": 45, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [387], + "starting_column": 13, + "ending_column": 58 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "quoteToken.safeTransfer(address(_poolHelper),joinAmountIn)", + "source_mapping": { + "start": 16620, + "length": 59, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [393], + "starting_column": 9, + "ending_column": 68 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken)", + "source_mapping": { + "start": 16729, + "length": 250, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [396, 397, 398, 399], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt)", + "source_mapping": { + "start": 16989, + "length": 65, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [400], + "starting_column": 9, + "ending_column": 74 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "rebalanceUpJoin", + "source_mapping": { + "start": 15774, + "length": 1496, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "rebalanceUpJoin(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.rebalanceUpJoin(uint256,uint256) (contracts/amo/Ramos.sol#374-407):\n\tExternal calls:\n\t- tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this)) (contracts/amo/Ramos.sol#382)\n\t- quoteToken.safeTransfer(feeCollector,feeAmt) (contracts/amo/Ramos.sol#387)\n\t- quoteToken.safeTransfer(address(_poolHelper),joinAmountIn) (contracts/amo/Ramos.sol#393)\n\t- bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken) (contracts/amo/Ramos.sol#396-399)\n\tEvent emitted after the call(s):\n\t- RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt) (contracts/amo/Ramos.sol#400)\n", + "markdown": "Reentrancy in [Ramos.rebalanceUpJoin(uint256,uint256)](contracts/amo/Ramos.sol#L374-L407):\n\tExternal calls:\n\t- [tokenVault.borrowQuoteToken(quoteTokenAmountIn,address(this))](contracts/amo/Ramos.sol#L382)\n\t- [quoteToken.safeTransfer(feeCollector,feeAmt)](contracts/amo/Ramos.sol#L387)\n\t- [quoteToken.safeTransfer(address(_poolHelper),joinAmountIn)](contracts/amo/Ramos.sol#L393)\n\t- [bptTokensStaked = _poolHelper.joinPool(joinAmountIn,minBptOut,rebalancePercentageBoundUp,rebalancePercentageBoundLow,treasuryPriceIndex(),postRebalanceDelta,1 - protocolTokenBalancerPoolIndex,quoteToken)](contracts/amo/Ramos.sol#L396-L399)\n\tEvent emitted after the call(s):\n\t- [RebalanceUpJoin(quoteTokenAmountIn,bptTokensStaked,feeAmt)](contracts/amo/Ramos.sol#L400)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L374-L407", + "id": "d452854a083064df7259f0954835ef242ab535df19218e9bf3aaf9b81c9b26c1", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToGnosis", + "source_mapping": { + "start": 5326, + "length": 237, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [142, 143, 144, 145], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToGnosis(address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(token).safeTransfer(gnosisSafeWallet,amount)", + "source_mapping": { + "start": 5420, + "length": 52, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [143], + "starting_column": 9, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToGnosis", + "source_mapping": { + "start": 5326, + "length": 237, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [142, 143, 144, 145], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToGnosis(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount)", + "source_mapping": { + "start": 5482, + "length": 74, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [144], + "starting_column": 9, + "ending_column": 83 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToGnosis", + "source_mapping": { + "start": 5326, + "length": 237, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [142, 143, 144, 145], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GnosisStrategy", + "source_mapping": { + "start": 585, + "length": 6684, + "filename_relative": "contracts/v2/strategies/GnosisStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/GnosisStrategy.sol", + "filename_short": "contracts/v2/strategies/GnosisStrategy.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToGnosis(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in GnosisStrategy.recoverToGnosis(address,uint256) (contracts/v2/strategies/GnosisStrategy.sol#142-145):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(gnosisSafeWallet,amount) (contracts/v2/strategies/GnosisStrategy.sol#143)\n\tEvent emitted after the call(s):\n\t- CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount) (contracts/v2/strategies/GnosisStrategy.sol#144)\n", + "markdown": "Reentrancy in [GnosisStrategy.recoverToGnosis(address,uint256)](contracts/v2/strategies/GnosisStrategy.sol#L142-L145):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(gnosisSafeWallet,amount)](contracts/v2/strategies/GnosisStrategy.sol#L143)\n\tEvent emitted after the call(s):\n\t- [CommonEventsAndErrors.TokenRecovered(gnosisSafeWallet,token,amount)](contracts/v2/strategies/GnosisStrategy.sol#L144)\n", + "first_markdown_element": "contracts/v2/strategies/GnosisStrategy.sol#L142-L145", + "id": "d9bd0a33246588c83983d63975a9ce55470568eeff09e037f055b8e7122562e2", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2335, + "length": 206, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [67, 68, 69, 70, 71], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AuraStaking", + "source_mapping": { + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(token).safeTransfer(to,amount)", + "source_mapping": { + "start": 2447, + "length": 38, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [68], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2335, + "length": 206, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [67, 68, 69, 70, 71], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AuraStaking", + "source_mapping": { + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RecoveredToken(token,to,amount)", + "source_mapping": { + "start": 2496, + "length": 38, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [70], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2335, + "length": 206, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [67, 68, 69, 70, 71], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AuraStaking", + "source_mapping": { + "start": 605, + "length": 5204, + "filename_relative": "contracts/amo/AuraStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/AuraStaking.sol", + "filename_short": "contracts/amo/AuraStaking.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in AuraStaking.recoverToken(address,address,uint256) (contracts/amo/AuraStaking.sol#67-71):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/amo/AuraStaking.sol#68)\n\tEvent emitted after the call(s):\n\t- RecoveredToken(token,to,amount) (contracts/amo/AuraStaking.sol#70)\n", + "markdown": "Reentrancy in [AuraStaking.recoverToken(address,address,uint256)](contracts/amo/AuraStaking.sol#L67-L71):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/amo/AuraStaking.sol#L68)\n\tEvent emitted after the call(s):\n\t- [RecoveredToken(token,to,amount)](contracts/amo/AuraStaking.sol#L70)\n", + "first_markdown_element": "contracts/amo/AuraStaking.sol#L67-L71", + "id": "721f7e4ea8f943fb92b4b72846f0042313e2b5e55c2edcd24d2ab5f7aab87665", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 10889, + "length": 197, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [272, 273, 274, 275, 276], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(token).safeTransfer(to,amount)", + "source_mapping": { + "start": 10992, + "length": 38, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [273], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 10889, + "length": 197, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [272, 273, 274, 275, 276], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RecoveredToken(token,to,amount)", + "source_mapping": { + "start": 11041, + "length": 38, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [275], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 10889, + "length": 197, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [272, 273, 274, 275, 276], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.recoverToken(address,address,uint256) (contracts/amo/Ramos.sol#272-276):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/amo/Ramos.sol#273)\n\tEvent emitted after the call(s):\n\t- RecoveredToken(token,to,amount) (contracts/amo/Ramos.sol#275)\n", + "markdown": "Reentrancy in [Ramos.recoverToken(address,address,uint256)](contracts/amo/Ramos.sol#L272-L276):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/amo/Ramos.sol#L273)\n\tEvent emitted after the call(s):\n\t- [RecoveredToken(token,to,amount)](contracts/amo/Ramos.sol#L275)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L272-L276", + "id": "15a59117d9f24ee76b20d5a5453f589570a7f156b421e560b9305927c9131e2c", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "removeCollateral", + "source_mapping": { + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeCollateral(uint128,address)" + } + }, + { + "type": "node", + "name": "circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)", + "source_mapping": { + "start": 7074, + "length": 118, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [173, 174, 175, 176, 177], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeCollateral", + "source_mapping": { + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeCollateral(uint128,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CollateralRemoved(msg.sender,recipient,amount)", + "source_mapping": { + "start": 7382, + "length": 53, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [182], + "starting_column": 9, + "ending_column": 62 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeCollateral", + "source_mapping": { + "start": 6560, + "length": 1031, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeCollateral(uint128,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleLineOfCredit.removeCollateral(uint128,address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#166-190):\n\tExternal calls:\n\t- circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#173-177)\n\tEvent emitted after the call(s):\n\t- CollateralRemoved(msg.sender,recipient,amount) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#182)\n", + "markdown": "Reentrancy in [TempleLineOfCredit.removeCollateral(uint128,address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190):\n\tExternal calls:\n\t- [circuitBreakerProxy.preCheck(address(templeToken),msg.sender,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L173-L177)\n\tEvent emitted after the call(s):\n\t- [CollateralRemoved(msg.sender,recipient,amount)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L182)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L166-L190", + "id": "995ebae8f6668f6a1d468a923e261df6e2cd441ac86401c473cc53982585815d", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + }, + { + "type": "node", + "name": "amoStaking.withdrawAndUnwrap(bptIn,false,address(this))", + "source_mapping": { + "start": 23089, + "length": 57, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [539], + "starting_column": 9, + "ending_column": 66 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "balancerVault.exitPool(balancerPoolId,address(this),address(this),request)", + "source_mapping": { + "start": 23156, + "length": 77, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [540], + "starting_column": 9, + "ending_column": 86 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "_tokenVault.repayProtocolToken(protocolTokenAmount)", + "source_mapping": { + "start": 23564, + "length": 51, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [549], + "starting_column": 13, + "ending_column": 64 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "_tokenVault.repayQuoteToken(quoteTokenAmount)", + "source_mapping": { + "start": 23676, + "length": 45, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [553], + "starting_column": 13, + "ending_column": 58 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn)", + "source_mapping": { + "start": 23742, + "length": 67, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [556], + "starting_column": 9, + "ending_column": 76 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 22408, + "length": 1408, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Ramos", + "source_mapping": { + "start": 1891, + "length": 24208, + "filename_relative": "contracts/amo/Ramos.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amo/Ramos.sol", + "filename_short": "contracts/amo/Ramos.sol", + "is_dependency": false, + "lines": [ + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Ramos.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256) (contracts/amo/Ramos.sol#520-557):\n\tExternal calls:\n\t- amoStaking.withdrawAndUnwrap(bptIn,false,address(this)) (contracts/amo/Ramos.sol#539)\n\t- balancerVault.exitPool(balancerPoolId,address(this),address(this),request) (contracts/amo/Ramos.sol#540)\n\t- _tokenVault.repayProtocolToken(protocolTokenAmount) (contracts/amo/Ramos.sol#549)\n\t- _tokenVault.repayQuoteToken(quoteTokenAmount) (contracts/amo/Ramos.sol#553)\n\tEvent emitted after the call(s):\n\t- LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn) (contracts/amo/Ramos.sol#556)\n", + "markdown": "Reentrancy in [Ramos.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)](contracts/amo/Ramos.sol#L520-L557):\n\tExternal calls:\n\t- [amoStaking.withdrawAndUnwrap(bptIn,false,address(this))](contracts/amo/Ramos.sol#L539)\n\t- [balancerVault.exitPool(balancerPoolId,address(this),address(this),request)](contracts/amo/Ramos.sol#L540)\n\t- [_tokenVault.repayProtocolToken(protocolTokenAmount)](contracts/amo/Ramos.sol#L549)\n\t- [_tokenVault.repayQuoteToken(quoteTokenAmount)](contracts/amo/Ramos.sol#L553)\n\tEvent emitted after the call(s):\n\t- [LiquidityRemoved(quoteTokenAmount,protocolTokenAmount,bptIn)](contracts/amo/Ramos.sol#L556)\n", + "first_markdown_element": "contracts/amo/Ramos.sol#L520-L557", + "id": "58971ea68a44f13c3035e5c40470aed4ee35ec8780baec9e6fde35f1a56bae22", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 8141, + "length": 365, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [209, 210, 211, 212, 213, 214, 215], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + }, + { + "type": "node", + "name": "(quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount)", + "source_mapping": { + "start": 8278, + "length": 140, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [210, 211, 212, 213], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 8141, + "length": 365, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [209, 210, 211, 212, 213, 214, 215], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount)", + "source_mapping": { + "start": 8428, + "length": 71, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [214], + "starting_column": 9, + "ending_column": 80 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "removeLiquidity", + "source_mapping": { + "start": 8141, + "length": 365, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [209, 210, 211, 212, 213, 214, 215], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RamosStrategy", + "source_mapping": { + "start": 1132, + "length": 9320, + "filename_relative": "contracts/v2/strategies/RamosStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/RamosStrategy.sol", + "filename_short": "contracts/v2/strategies/RamosStrategy.sol", + "is_dependency": false, + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in RamosStrategy.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256) (contracts/v2/strategies/RamosStrategy.sol#209-215):\n\tExternal calls:\n\t- (quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount) (contracts/v2/strategies/RamosStrategy.sol#210-213)\n\tEvent emitted after the call(s):\n\t- RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount) (contracts/v2/strategies/RamosStrategy.sol#214)\n", + "markdown": "Reentrancy in [RamosStrategy.removeLiquidity(IBalancerVault.ExitPoolRequest,uint256)](contracts/v2/strategies/RamosStrategy.sol#L209-L215):\n\tExternal calls:\n\t- [(quoteTokenAmount,protocolTokenAmount) = ramos.removeLiquidity(_requestData,_bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L210-L213)\n\tEvent emitted after the call(s):\n\t- [RemoveLiquidity(quoteTokenAmount,protocolTokenAmount,_bptAmount)](contracts/v2/strategies/RamosStrategy.sol#L214)\n", + "first_markdown_element": "contracts/v2/strategies/RamosStrategy.sol#L209-L215", + "id": "7c31093def50156c36e632afd1bdd7b3c7f967dee0aff539f837b6a8448615ae", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "setTlcStrategy", + "source_mapping": { + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "setTlcStrategy(address)" + } + }, + { + "type": "node", + "name": "daiToken.approve(previousTrv,0)", + "source_mapping": { + "start": 16064, + "length": 32, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [394], + "starting_column": 13, + "ending_column": 45 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "setTlcStrategy", + "source_mapping": { + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "setTlcStrategy(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "daiToken.forceApprove(_trv,type()(uint256).max)", + "source_mapping": { + "start": 16307, + "length": 46, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [402], + "starting_column": 13, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "setTlcStrategy", + "source_mapping": { + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "setTlcStrategy(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TlcStrategySet(newTlcStrategy,_trv)", + "source_mapping": { + "start": 16374, + "length": 41, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [405], + "starting_column": 9, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "setTlcStrategy", + "source_mapping": { + "start": 15750, + "length": 819, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleLineOfCredit", + "source_mapping": { + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "setTlcStrategy(address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleLineOfCredit.setTlcStrategy(address) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#386-409):\n\tExternal calls:\n\t- daiToken.approve(previousTrv,0) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#394)\n\t- daiToken.forceApprove(_trv,type()(uint256).max) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#402)\n\tEvent emitted after the call(s):\n\t- TlcStrategySet(newTlcStrategy,_trv) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#405)\n", + "markdown": "Reentrancy in [TempleLineOfCredit.setTlcStrategy(address)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409):\n\tExternal calls:\n\t- [daiToken.approve(previousTrv,0)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L394)\n\t- [daiToken.forceApprove(_trv,type()(uint256).max)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L402)\n\tEvent emitted after the call(s):\n\t- [TlcStrategySet(newTlcStrategy,_trv)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L405)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L386-L409", + "id": "c39c59a77f1824a150880b6907c47e451f7784419c1b3eab509e104e0a7eba72", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "shutdown", + "source_mapping": { + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "shutdown(address)" + } + }, + { + "type": "node", + "name": "_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)", + "source_mapping": { + "start": 12500, + "length": 64, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [296], + "starting_column": 13, + "ending_column": 77 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "shutdown", + "source_mapping": { + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "shutdown(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "StrategyRemoved(strategy)", + "source_mapping": { + "start": 13163, + "length": 30, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [312], + "starting_column": 9, + "ending_column": 39 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "shutdown", + "source_mapping": { + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "shutdown(address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt})", + "source_mapping": { + "start": 12578, + "length": 231, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [297, 298, 299, 300, 301, 302], + "starting_column": 13, + "ending_column": 15 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "shutdown", + "source_mapping": { + "start": 11823, + "length": 1632, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryReservesVault", + "source_mapping": { + "start": 2151, + "length": 32023, + "filename_relative": "contracts/v2/TreasuryReservesVault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", + "filename_short": "contracts/v2/TreasuryReservesVault.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, @@ -36836,74 +43916,9578 @@ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, - 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, - 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, - 777, 778, 779 + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "shutdown(address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319):\n\tExternal calls:\n\t- _outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy) (contracts/v2/TreasuryReservesVault.sol#296)\n\tEvent emitted after the call(s):\n\t- StrategyRemoved(strategy) (contracts/v2/TreasuryReservesVault.sol#312)\n\t- StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt}) (contracts/v2/TreasuryReservesVault.sol#297-302)\n", + "markdown": "Reentrancy in [TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319):\n\tExternal calls:\n\t- [_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)](contracts/v2/TreasuryReservesVault.sol#L296)\n\tEvent emitted after the call(s):\n\t- [StrategyRemoved(strategy)](contracts/v2/TreasuryReservesVault.sol#L312)\n\t- [StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt})](contracts/v2/TreasuryReservesVault.sol#L297-L302)\n", + "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", + "id": "3770a3cd34d6db65975f14acb9170e3663edac9809964808500e613a8be2344e", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "trvWithdraw", + "source_mapping": { + "start": 10562, + "length": 947, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "trvWithdraw(uint256)" + } + }, + { + "type": "node", + "name": "(daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance()", + "source_mapping": { + "start": 11012, + "length": 86, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [264], + "starting_column": 9, + "ending_column": 95 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "trvWithdraw", + "source_mapping": { + "start": 10562, + "length": 947, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "trvWithdraw(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "chi = pot.drip()", + "source_mapping": { + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [142], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_checkpointChi", + "source_mapping": { + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [140, 141, 142, 143], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_checkpointChi()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAmount,requestedAmount)", + "source_mapping": { + "start": 11367, + "length": 45, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [273], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "trvWithdraw", + "source_mapping": { + "start": 10562, + "length": 947, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "trvWithdraw(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "pot.exit(sharesAmount)", + "source_mapping": { + "start": 11599, + "length": 22, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [279], + "starting_column": 9, + "ending_column": 31 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "daiJoin.exit(address(this),daiAmount)", + "source_mapping": { + "start": 11631, + "length": 38, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [280], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DaiWithdrawn(daiAmount)", + "source_mapping": { + "start": 11679, + "length": 28, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [281], + "starting_column": 9, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAmount,requestedAmount)", + "source_mapping": { + "start": 11367, + "length": 45, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [273], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "trvWithdraw", + "source_mapping": { + "start": 10562, + "length": 947, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "trvWithdraw(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy.trvWithdraw(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#257-276):\n\tExternal calls:\n\t- (daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#264)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAmount,requestedAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#273)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAmount,requestedAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#273)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.trvWithdraw(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L257-L276):\n\tExternal calls:\n\t- [(daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L264)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAmount,requestedAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L273)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAmount,requestedAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L273)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L257-L276", + "id": "0a4c8e86f10e88f7cdc66960b0dd281291f86c22d1d8b92e68909c1d477f23ac", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawAndRepay", + "source_mapping": { + "start": 8511, + "length": 786, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepay(uint256)" + } + }, + { + "type": "node", + "name": "(daiAvailable,chi) = _checkpointDaiBalance()", + "source_mapping": { + "start": 8692, + "length": 63, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [217], + "starting_column": 9, + "ending_column": 72 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepay", + "source_mapping": { + "start": 8511, + "length": 786, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepay(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "chi = pot.drip()", + "source_mapping": { + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [142], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_checkpointChi", + "source_mapping": { + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [140, 141, 142, 143], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_checkpointChi()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAmount,withdrawalAmount)", + "source_mapping": { + "start": 9027, + "length": 46, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [222], + "starting_column": 9, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepay", + "source_mapping": { + "start": 8511, + "length": 786, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepay(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "pot.exit(sharesAmount)", + "source_mapping": { + "start": 11599, + "length": 22, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [279], + "starting_column": 9, + "ending_column": 31 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "daiJoin.exit(address(this),daiAmount)", + "source_mapping": { + "start": 11631, + "length": 38, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [280], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DaiWithdrawn(daiAmount)", + "source_mapping": { + "start": 11679, + "length": 28, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [281], + "starting_column": 9, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAmount,withdrawalAmount)", + "source_mapping": { + "start": 9027, + "length": 46, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [222], + "starting_column": 9, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepay", + "source_mapping": { + "start": 8511, + "length": 786, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepay(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy.withdrawAndRepay(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#214-227):\n\tExternal calls:\n\t- (daiAvailable,chi) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#217)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAmount,withdrawalAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#222)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAmount,withdrawalAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#222)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.withdrawAndRepay(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L214-L227):\n\tExternal calls:\n\t- [(daiAvailable,chi) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L217)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAmount,withdrawalAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L222)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAmount,withdrawalAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L222)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L214-L227", + "id": "38cb9f382307934e51255ca3f7d7f51604f44bc46a20af75d7f155182cf9bb95", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawAndRepayAll", + "source_mapping": { + "start": 9414, + "length": 465, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepayAll()" + } + }, + { + "type": "node", + "name": "(daiAvailable,sharesAvailable) = _checkpointDaiBalance()", + "source_mapping": { + "start": 9501, + "length": 74, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [233], + "starting_column": 9, + "ending_column": 83 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepayAll", + "source_mapping": { + "start": 9414, + "length": 465, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepayAll()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "chi = pot.drip()", + "source_mapping": { + "start": 5568, + "length": 60, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [142], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_checkpointChi", + "source_mapping": { + "start": 5447, + "length": 188, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [140, 141, 142, 143], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_checkpointChi()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", + "source_mapping": { + "start": 9585, + "length": 45, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [234], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepayAll", + "source_mapping": { + "start": 9414, + "length": 465, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepayAll()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "pot.exit(sharesAmount)", + "source_mapping": { + "start": 11599, + "length": 22, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [279], + "starting_column": 9, + "ending_column": 31 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "daiJoin.exit(address(this),daiAmount)", + "source_mapping": { + "start": 11631, + "length": 38, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [280], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DaiWithdrawn(daiAmount)", + "source_mapping": { + "start": 11679, + "length": 28, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [281], + "starting_column": 9, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_dsrWithdrawal", + "source_mapping": { + "start": 11515, + "length": 199, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [278, 279, 280, 281, 282], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_dsrWithdrawal(uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", + "source_mapping": { + "start": 9585, + "length": 45, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [234], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawAndRepayAll", + "source_mapping": { + "start": 9414, + "length": 465, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DsrBaseStrategy", + "source_mapping": { + "start": 1042, + "length": 11745, + "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawAndRepayAll()" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in DsrBaseStrategy.withdrawAndRepayAll() (contracts/v2/strategies/DsrBaseStrategy.sol#232-240):\n\tExternal calls:\n\t- (daiAvailable,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#233)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#234)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#234)\n", + "markdown": "Reentrancy in [DsrBaseStrategy.withdrawAndRepayAll()](contracts/v2/strategies/DsrBaseStrategy.sol#L232-L240):\n\tExternal calls:\n\t- [(daiAvailable,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L233)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L234)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L234)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L232-L240", + "id": "4ba8e3c4596e10b0920e312a0648a8fa3ef9456ad23cffc62074dc7f78916f68", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_getReward", + "source_mapping": { + "start": 15161, + "length": 299, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [385, 386, 387, 388, 389, 390, 391, 392], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_getReward(address,address)" + } + }, + { + "type": "node", + "name": "rewardToken.safeTransfer(_to,amount)", + "source_mapping": { + "start": 15355, + "length": 37, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [389], + "starting_column": 13, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_getReward", + "source_mapping": { + "start": 15161, + "length": 299, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [385, 386, 387, 388, 389, 390, 391, 392], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_getReward(address,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RewardPaid(_staker,_to,amount)", + "source_mapping": { + "start": 15406, + "length": 37, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [390], + "starting_column": 13, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_getReward", + "source_mapping": { + "start": 15161, + "length": 299, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [385, 386, 387, 388, 389, 390, 391, 392], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_getReward(address,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleGoldStaking._getReward(address,address) (contracts/templegold/TempleGoldStaking.sol#385-392):\n\tExternal calls:\n\t- rewardToken.safeTransfer(_to,amount) (contracts/templegold/TempleGoldStaking.sol#389)\n\tEvent emitted after the call(s):\n\t- RewardPaid(_staker,_to,amount) (contracts/templegold/TempleGoldStaking.sol#390)\n", + "markdown": "Reentrancy in [TempleGoldStaking._getReward(address,address)](contracts/templegold/TempleGoldStaking.sol#L385-L392):\n\tExternal calls:\n\t- [rewardToken.safeTransfer(_to,amount)](contracts/templegold/TempleGoldStaking.sol#L389)\n\tEvent emitted after the call(s):\n\t- [RewardPaid(_staker,_to,amount)](contracts/templegold/TempleGoldStaking.sol#L390)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L385-L392", + "id": "44e692284edae15ca45380bf936c38aa49c8b3eee8049f1cc01b821dd1ca291f", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_stake", + "source_mapping": { + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_stake(address,uint256)" + } + }, + { + "type": "node", + "name": "stakingToken.safeTransferFrom(msg.sender,address(this),_amount)", + "source_mapping": { + "start": 10728, + "length": 65, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [254], + "starting_column": 9, + "ending_column": 74 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_stake", + "source_mapping": { + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_stake(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "DelegateVotesChanged(delegatee,oldVotes,newVotes)", + "source_mapping": { + "start": 20511, + "length": 56, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [523], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_writeCheckpoint", + "source_mapping": { + "start": 20002, + "length": 572, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_writeCheckpoint(address,uint256,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_moveDelegates(address(0),delegates[_for],_amount)", + "source_mapping": { + "start": 10839, + "length": 52, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [256], + "starting_column": 9, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_stake", + "source_mapping": { + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_stake(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "Staked(_for,_amount)", + "source_mapping": { + "start": 16854, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [433], + "starting_column": 9, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_applyStake", + "source_mapping": { + "start": 16652, + "length": 235, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [429, 430, 431, 432, 433, 434], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_applyStake(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + }, + { + "type": "node", + "name": "_applyStake(_for,_amount)", + "source_mapping": { + "start": 10803, + "length": 26, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [255], + "starting_column": 9, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_stake", + "source_mapping": { + "start": 10540, + "length": 358, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [250, 251, 252, 253, 254, 255, 256, 257], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_stake(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleGoldStaking._stake(address,uint256) (contracts/templegold/TempleGoldStaking.sol#250-257):\n\tExternal calls:\n\t- stakingToken.safeTransferFrom(msg.sender,address(this),_amount) (contracts/templegold/TempleGoldStaking.sol#254)\n\tEvent emitted after the call(s):\n\t- DelegateVotesChanged(delegatee,oldVotes,newVotes) (contracts/templegold/TempleGoldStaking.sol#523)\n\t\t- _moveDelegates(address(0),delegates[_for],_amount) (contracts/templegold/TempleGoldStaking.sol#256)\n\t- Staked(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#433)\n\t\t- _applyStake(_for,_amount) (contracts/templegold/TempleGoldStaking.sol#255)\n", + "markdown": "Reentrancy in [TempleGoldStaking._stake(address,uint256)](contracts/templegold/TempleGoldStaking.sol#L250-L257):\n\tExternal calls:\n\t- [stakingToken.safeTransferFrom(msg.sender,address(this),_amount)](contracts/templegold/TempleGoldStaking.sol#L254)\n\tEvent emitted after the call(s):\n\t- [DelegateVotesChanged(delegatee,oldVotes,newVotes)](contracts/templegold/TempleGoldStaking.sol#L523)\n\t\t- [_moveDelegates(address(0),delegates[_for],_amount)](contracts/templegold/TempleGoldStaking.sol#L256)\n\t- [Staked(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L433)\n\t\t- [_applyStake(_for,_amount)](contracts/templegold/TempleGoldStaking.sol#L255)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L250-L257", + "id": "dae712c5ab8a4505b11bbd7e8b0090c77da87b5608029b6f573b5df05241d4c5", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_withdrawFor", + "source_mapping": { + "start": 15466, + "length": 913, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_withdrawFor(address,address,uint256,bool,address)" + } + }, + { + "type": "node", + "name": "stakingToken.safeTransfer(_to,_amount)", + "source_mapping": { + "start": 16108, + "length": 39, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [411], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_withdrawFor", + "source_mapping": { + "start": 15466, + "length": 913, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_withdrawFor(address,address,uint256,bool,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Withdrawn(_staker,_to,_amount)", + "source_mapping": { + "start": 16157, + "length": 37, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [412], + "starting_column": 9, + "ending_column": 46 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_withdrawFor", + "source_mapping": { + "start": 15466, + "length": 913, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_withdrawFor(address,address,uint256,bool,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleGoldStaking._withdrawFor(address,address,uint256,bool,address) (contracts/templegold/TempleGoldStaking.sol#394-419):\n\tExternal calls:\n\t- stakingToken.safeTransfer(_to,_amount) (contracts/templegold/TempleGoldStaking.sol#411)\n\tEvent emitted after the call(s):\n\t- Withdrawn(_staker,_to,_amount) (contracts/templegold/TempleGoldStaking.sol#412)\n", + "markdown": "Reentrancy in [TempleGoldStaking._withdrawFor(address,address,uint256,bool,address)](contracts/templegold/TempleGoldStaking.sol#L394-L419):\n\tExternal calls:\n\t- [stakingToken.safeTransfer(_to,_amount)](contracts/templegold/TempleGoldStaking.sol#L411)\n\tEvent emitted after the call(s):\n\t- [Withdrawn(_staker,_to,_amount)](contracts/templegold/TempleGoldStaking.sol#L412)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L394-L419", + "id": "94c6fadcfde566f4c15743d2eb2607874d23af93ee5eee869314cc2c6e5f30c4", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "adhocPayment", + "source_mapping": { + "start": 2861, + "length": 284, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [83, 84, 85, 86, 87, 88], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "adhocPayment(address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(TEMPLE,_to,_amount)", + "source_mapping": { + "start": 3058, + "length": 44, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [86], + "starting_column": 9, + "ending_column": 53 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "adhocPayment", + "source_mapping": { + "start": 2861, + "length": 284, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [83, 84, 85, 86, 87, 88], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "adhocPayment(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Claimed(_to,_amount)", + "source_mapping": { + "start": 3112, + "length": 26, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [87], + "starting_column": 9, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "adhocPayment", + "source_mapping": { + "start": 2861, + "length": 284, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [83, 84, 85, 86, 87, 88], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "adhocPayment(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPayments.adhocPayment(address,uint256) (contracts/admin/TempleTeamPayments.sol#83-88):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(TEMPLE,_to,_amount) (contracts/admin/TempleTeamPayments.sol#86)\n\tEvent emitted after the call(s):\n\t- Claimed(_to,_amount) (contracts/admin/TempleTeamPayments.sol#87)\n", + "markdown": "Reentrancy in [TempleTeamPayments.adhocPayment(address,uint256)](contracts/admin/TempleTeamPayments.sol#L83-L88):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(TEMPLE,_to,_amount)](contracts/admin/TempleTeamPayments.sol#L86)\n\tEvent emitted after the call(s):\n\t- [Claimed(_to,_amount)](contracts/admin/TempleTeamPayments.sol#L87)\n", + "first_markdown_element": "contracts/admin/TempleTeamPayments.sol#L83-L88", + "id": "081d1dfdebd16cea0856cb988c13c62e2d2d6e5c3fbd25c36620643fb11a0000", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + }, + { + "type": "node", + "name": "IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)", + "source_mapping": { + "start": 11928, + "length": 65, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [239], + "starting_column": 9, + "ending_column": 74 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Deposit(msg.sender,epochId,amount)", + "source_mapping": { + "start": 12329, + "length": 41, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [246], + "starting_column": 9, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 11339, + "length": 1038, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in SpiceAuction.bid(uint256) (contracts/templegold/SpiceAuction.sol#227-247):\n\tExternal calls:\n\t- IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount) (contracts/templegold/SpiceAuction.sol#239)\n\tEvent emitted after the call(s):\n\t- Deposit(msg.sender,epochId,amount) (contracts/templegold/SpiceAuction.sol#246)\n", + "markdown": "Reentrancy in [SpiceAuction.bid(uint256)](contracts/templegold/SpiceAuction.sol#L227-L247):\n\tExternal calls:\n\t- [IERC20(bidToken).safeTransferFrom(msg.sender,_recipient,amount)](contracts/templegold/SpiceAuction.sol#L239)\n\tEvent emitted after the call(s):\n\t- [Deposit(msg.sender,epochId,amount)](contracts/templegold/SpiceAuction.sol#L246)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L227-L247", + "id": "5caf012478a5f102178d73069f94fdbcd578242496a6c7d0511a6fbe00c37b7a", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + }, + { + "type": "node", + "name": "bidToken.safeTransferFrom(msg.sender,treasury,amount)", + "source_mapping": { + "start": 6511, + "length": 55, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [141], + "starting_column": 9, + "ending_column": 64 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Deposit(msg.sender,epochIdCache,amount)", + "source_mapping": { + "start": 6781, + "length": 46, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [148], + "starting_column": 9, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "bid", + "source_mapping": { + "start": 6355, + "length": 479, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "bid(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in StableGoldAuction.bid(uint256) (contracts/templegold/StableGoldAuction.sol#138-149):\n\tExternal calls:\n\t- bidToken.safeTransferFrom(msg.sender,treasury,amount) (contracts/templegold/StableGoldAuction.sol#141)\n\tEvent emitted after the call(s):\n\t- Deposit(msg.sender,epochIdCache,amount) (contracts/templegold/StableGoldAuction.sol#148)\n", + "markdown": "Reentrancy in [StableGoldAuction.bid(uint256)](contracts/templegold/StableGoldAuction.sol#L138-L149):\n\tExternal calls:\n\t- [bidToken.safeTransferFrom(msg.sender,treasury,amount)](contracts/templegold/StableGoldAuction.sol#L141)\n\tEvent emitted after the call(s):\n\t- [Deposit(msg.sender,epochIdCache,amount)](contracts/templegold/StableGoldAuction.sol#L148)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L138-L149", + "id": "000c4c762a0614eebe58a1e6c9d4c49fe662d41f7d514a61bf3fd8c924effab7", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2500, + "length": 355, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim()" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable)", + "source_mapping": { + "start": 2750, + "length": 53, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [79], + "starting_column": 9, + "ending_column": 62 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2500, + "length": 355, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Claimed(msg.sender,claimable)", + "source_mapping": { + "start": 2813, + "length": 35, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [80], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2500, + "length": 355, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPayments", + "source_mapping": { + "start": 247, + "length": 3150, + "filename_relative": "contracts/admin/TempleTeamPayments.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPayments.sol", + "filename_short": "contracts/admin/TempleTeamPayments.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim()" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPayments.claim() (contracts/admin/TempleTeamPayments.sol#74-81):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable) (contracts/admin/TempleTeamPayments.sol#79)\n\tEvent emitted after the call(s):\n\t- Claimed(msg.sender,claimable) (contracts/admin/TempleTeamPayments.sol#80)\n", + "markdown": "Reentrancy in [TempleTeamPayments.claim()](contracts/admin/TempleTeamPayments.sol#L74-L81):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(TEMPLE,msg.sender,claimable)](contracts/admin/TempleTeamPayments.sol#L79)\n\tEvent emitted after the call(s):\n\t- [Claimed(msg.sender,claimable)](contracts/admin/TempleTeamPayments.sol#L80)\n", + "first_markdown_element": "contracts/admin/TempleTeamPayments.sol#L74-L81", + "id": "5122a045d2e21480d0560d2c58820df1a98500cfc6453d3088b53c090e7d16e3", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2491, + "length": 452, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim(uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(temple,msg.sender,_claimAmount)", + "source_mapping": { + "start": 2832, + "length": 56, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [83], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2491, + "length": 452, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Claimed(msg.sender,_claimAmount)", + "source_mapping": { + "start": 2898, + "length": 38, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [84], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 2491, + "length": 452, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPaymentsV2.claim(uint256) (contracts/admin/TempleTeamPaymentsV2.sol#74-85):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(temple,msg.sender,_claimAmount) (contracts/admin/TempleTeamPaymentsV2.sol#83)\n\tEvent emitted after the call(s):\n\t- Claimed(msg.sender,_claimAmount) (contracts/admin/TempleTeamPaymentsV2.sol#84)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsV2.claim(uint256)](contracts/admin/TempleTeamPaymentsV2.sol#L74-L85):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(temple,msg.sender,_claimAmount)](contracts/admin/TempleTeamPaymentsV2.sol#L83)\n\tEvent emitted after the call(s):\n\t- [Claimed(msg.sender,_claimAmount)](contracts/admin/TempleTeamPaymentsV2.sol#L84)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsV2.sol#L74-L85", + "id": "e805076f6ba37558b2d1e1e33a36ca2141157b088d4472056b82f8af89078bb2", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 12530, + "length": 1124, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + }, + { + "type": "node", + "name": "IERC20(auctionToken).safeTransfer(msg.sender,claimAmount)", + "source_mapping": { + "start": 13519, + "length": 58, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [270], + "starting_column": 9, + "ending_column": 67 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 12530, + "length": 1124, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Claim(msg.sender,epochId,bidTokenAmount,claimAmount)", + "source_mapping": { + "start": 13587, + "length": 60, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [271], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 12530, + "length": 1124, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in SpiceAuction.claim(uint256) (contracts/templegold/SpiceAuction.sol#253-272):\n\tExternal calls:\n\t- IERC20(auctionToken).safeTransfer(msg.sender,claimAmount) (contracts/templegold/SpiceAuction.sol#270)\n\tEvent emitted after the call(s):\n\t- Claim(msg.sender,epochId,bidTokenAmount,claimAmount) (contracts/templegold/SpiceAuction.sol#271)\n", + "markdown": "Reentrancy in [SpiceAuction.claim(uint256)](contracts/templegold/SpiceAuction.sol#L253-L272):\n\tExternal calls:\n\t- [IERC20(auctionToken).safeTransfer(msg.sender,claimAmount)](contracts/templegold/SpiceAuction.sol#L270)\n\tEvent emitted after the call(s):\n\t- [Claim(msg.sender,epochId,bidTokenAmount,claimAmount)](contracts/templegold/SpiceAuction.sol#L271)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L253-L272", + "id": "92ff4abd1d5e177ba7da4e21b3cbb5568b349c5a540742d339f98a939bac3521", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 7008, + "length": 941, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + }, + { + "type": "node", + "name": "templeGold.safeTransfer(msg.sender,claimAmount)", + "source_mapping": { + "start": 7824, + "length": 48, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [169], + "starting_column": 9, + "ending_column": 57 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 7008, + "length": 941, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Claim(msg.sender,epochId,bidTokenAmount,claimAmount)", + "source_mapping": { + "start": 7882, + "length": 60, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [170], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claim", + "source_mapping": { + "start": 7008, + "length": 941, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claim(uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in StableGoldAuction.claim(uint256) (contracts/templegold/StableGoldAuction.sol#156-171):\n\tExternal calls:\n\t- templeGold.safeTransfer(msg.sender,claimAmount) (contracts/templegold/StableGoldAuction.sol#169)\n\tEvent emitted after the call(s):\n\t- Claim(msg.sender,epochId,bidTokenAmount,claimAmount) (contracts/templegold/StableGoldAuction.sol#170)\n", + "markdown": "Reentrancy in [StableGoldAuction.claim(uint256)](contracts/templegold/StableGoldAuction.sol#L156-L171):\n\tExternal calls:\n\t- [templeGold.safeTransfer(msg.sender,claimAmount)](contracts/templegold/StableGoldAuction.sol#L169)\n\tEvent emitted after the call(s):\n\t- [Claim(msg.sender,epochId,bidTokenAmount,claimAmount)](contracts/templegold/StableGoldAuction.sol#L170)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L156-L171", + "id": "219a784337a8f7b5f487a3e90c30e118208b4d31336144b0e30fb4ace5cdd2ff", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "claimFor", + "source_mapping": { + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claimFor(address)" + } + }, + { + "type": "node", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "source_mapping": { + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [91], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claimFor", + "source_mapping": { + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claimFor(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR)", + "source_mapping": { + "start": 3280, + "length": 62, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [92], + "starting_column": 9, + "ending_column": 71 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claimFor", + "source_mapping": { + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claimFor(address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TreasuryFarmingRevenue.claimFor(address) (contracts/core/TreasuryFarmingRevenue.sol#80-93):\n\tExternal calls:\n\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#92)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.claimFor(address)](contracts/core/TreasuryFarmingRevenue.sol#L80-L93):\n\tExternal calls:\n\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [RevenueClaimed(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L92)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L80-L93", + "id": "d8563f03511a537e7bffa702571db6c52a8f76800b24690b23270dd982c4ccc2", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "createExposure", + "source_mapping": { + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createExposure(string,string,IERC20)" + } + }, + { + "type": "node", + "name": "exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)", + "source_mapping": { + "start": 1546, + "length": 81, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [51], + "starting_column": 9, + "ending_column": 90 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createExposure", + "source_mapping": { + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createExposure(string,string,IERC20)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CreateExposure(address(exposure),address(pools[revalToken]))", + "source_mapping": { + "start": 1684, + "length": 66, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [53], + "starting_column": 9, + "ending_column": 75 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createExposure", + "source_mapping": { + "start": 1342, + "length": 415, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createExposure(string,string,IERC20)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in OpsManager.createExposure(string,string,IERC20) (contracts/core/OpsManager.sol#45-54):\n\tExternal calls:\n\t- exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools) (contracts/core/OpsManager.sol#51)\n\tEvent emitted after the call(s):\n\t- CreateExposure(address(exposure),address(pools[revalToken])) (contracts/core/OpsManager.sol#53)\n", + "markdown": "Reentrancy in [OpsManager.createExposure(string,string,IERC20)](contracts/core/OpsManager.sol#L45-L54):\n\tExternal calls:\n\t- [exposure = OpsManagerLib.createExposure(name,symbol,revalToken,pools)](contracts/core/OpsManager.sol#L51)\n\tEvent emitted after the call(s):\n\t- [CreateExposure(address(exposure),address(pools[revalToken]))](contracts/core/OpsManager.sol#L53)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L45-L54", + "id": "4c0848edc4ba02c1e3d1ebe7d87498d178e87ad8a446b774ebd37d6847435833", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "createVaultInstance", + "source_mapping": { + "start": 1980, + "length": 804, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" + } + }, + { + "type": "node", + "name": "templeExposure.setMinterState(address(vault),true)", + "source_mapping": { + "start": 2676, + "length": 51, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [87], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createVaultInstance", + "source_mapping": { + "start": 1980, + "length": 804, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CreateVaultInstance(address(vault))", + "source_mapping": { + "start": 2737, + "length": 40, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [88], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createVaultInstance", + "source_mapping": { + "start": 1980, + "length": 804, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OpsManager", + "source_mapping": { + "start": 388, + "length": 6455, + "filename_relative": "contracts/core/OpsManager.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/OpsManager.sol", + "filename_short": "contracts/core/OpsManager.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createVaultInstance(string,string,uint256,uint256,Rational,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in OpsManager.createVaultInstance(string,string,uint256,uint256,Rational,uint256) (contracts/core/OpsManager.sol#63-89):\n\tExternal calls:\n\t- templeExposure.setMinterState(address(vault),true) (contracts/core/OpsManager.sol#87)\n\tEvent emitted after the call(s):\n\t- CreateVaultInstance(address(vault)) (contracts/core/OpsManager.sol#88)\n", + "markdown": "Reentrancy in [OpsManager.createVaultInstance(string,string,uint256,uint256,Rational,uint256)](contracts/core/OpsManager.sol#L63-L89):\n\tExternal calls:\n\t- [templeExposure.setMinterState(address(vault),true)](contracts/core/OpsManager.sol#L87)\n\tEvent emitted after the call(s):\n\t- [CreateVaultInstance(address(vault))](contracts/core/OpsManager.sol#L88)\n", + "first_markdown_element": "contracts/core/OpsManager.sol#L63-L89", + "id": "df955297def3da87ad4df693d7ae4b7e7f50baa97a7182d7ae0ddc97fdb09441", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "decreaseShares", + "source_mapping": { + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "decreaseShares(address,uint256)" + } + }, + { + "type": "node", + "name": "claimFor(account)", + "source_mapping": { + "start": 2461, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [70], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "decreaseShares", + "source_mapping": { + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "decreaseShares(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "source_mapping": { + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [91], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claimFor", + "source_mapping": { + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claimFor(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "DecreaseShares(account,amount)", + "source_mapping": { + "start": 2634, + "length": 36, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [76], + "starting_column": 9, + "ending_column": 45 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "decreaseShares", + "source_mapping": { + "start": 2375, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [69, 70, 71, 72, 73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "decreaseShares(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TreasuryFarmingRevenue.decreaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#69-77):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#70)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- DecreaseShares(account,amount) (contracts/core/TreasuryFarmingRevenue.sol#76)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.decreaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L69-L77):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L70)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [DecreaseShares(account,amount)](contracts/core/TreasuryFarmingRevenue.sol#L76)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L69-L77", + "id": "10f84609b6b87bcc768aa396dd6ac6045289ca78c3cb64ee97e4437cfb7c006a", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + }, + { + "type": "node", + "name": "paymentContract.initialize(_token)", + "source_mapping": { + "start": 3294, + "length": 34, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [89], + "starting_column": 9, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "paymentContract.setAllocations(_dests,_allocations)", + "source_mapping": { + "start": 3338, + "length": 52, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [90], + "starting_column": 9, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "paymentContract.transferOwnership(msg.sender)", + "source_mapping": { + "start": 3401, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [92], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)", + "source_mapping": { + "start": 3493, + "length": 165, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [95, 96, 97, 98, 99, 100], + "starting_column": 13, + "ending_column": 14 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract))", + "source_mapping": { + "start": 3735, + "length": 141, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [104, 105, 106, 107, 108, 109], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "deployPayouts", + "source_mapping": { + "start": 2838, + "length": 1078, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "deployPayouts(IERC20,address[],uint256[],uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#79-112):\n\tExternal calls:\n\t- paymentContract.initialize(_token) (contracts/admin/TempleTeamPaymentsFactory.sol#89)\n\t- paymentContract.setAllocations(_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#90)\n\t- paymentContract.transferOwnership(msg.sender) (contracts/admin/TempleTeamPaymentsFactory.sol#92)\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding) (contracts/admin/TempleTeamPaymentsFactory.sol#95-100)\n\tEvent emitted after the call(s):\n\t- FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract)) (contracts/admin/TempleTeamPaymentsFactory.sol#104-109)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.deployPayouts(IERC20,address[],uint256[],uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112):\n\tExternal calls:\n\t- [paymentContract.initialize(_token)](contracts/admin/TempleTeamPaymentsFactory.sol#L89)\n\t- [paymentContract.setAllocations(_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L90)\n\t- [paymentContract.transferOwnership(msg.sender)](contracts/admin/TempleTeamPaymentsFactory.sol#L92)\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,address(paymentContract),_totalFunding)](contracts/admin/TempleTeamPaymentsFactory.sol#L95-L100)\n\tEvent emitted after the call(s):\n\t- [FundingDeployed(lastPaidEpoch,_dests,_allocations,address(paymentContract))](contracts/admin/TempleTeamPaymentsFactory.sol#L104-L109)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L79-L112", + "id": "e09076945359fed962d2ff6dfd37bfd369cd1b53e0192377da32895ae9a9f829", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "depositFor", + "source_mapping": { + "start": 6905, + "length": 773, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "depositFor(address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount)", + "source_mapping": { + "start": 7461, + "length": 82, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [187], + "starting_column": 13, + "ending_column": 95 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositFor", + "source_mapping": { + "start": 6905, + "length": 773, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "depositFor(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "templeExposureToken.mint(address(this),_amount)", + "source_mapping": { + "start": 7557, + "length": 48, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [188], + "starting_column": 13, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositFor", + "source_mapping": { + "start": 6905, + "length": 773, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "depositFor(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Deposit(_account,_amount,amountStaked)", + "source_mapping": { + "start": 7626, + "length": 45, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [191], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "depositFor", + "source_mapping": { + "start": 6905, + "length": 773, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "depositFor(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Vault.depositFor(address,uint256) (contracts/core/Vault.sol#176-192):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount) (contracts/core/Vault.sol#187)\n\t- templeExposureToken.mint(address(this),_amount) (contracts/core/Vault.sol#188)\n\tEvent emitted after the call(s):\n\t- Deposit(_account,_amount,amountStaked) (contracts/core/Vault.sol#191)\n", + "markdown": "Reentrancy in [Vault.depositFor(address,uint256)](contracts/core/Vault.sol#L176-L192):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(templeToken,msg.sender,vaultedTempleAccount,_amount)](contracts/core/Vault.sol#L187)\n\t- [templeExposureToken.mint(address(this),_amount)](contracts/core/Vault.sol#L188)\n\tEvent emitted after the call(s):\n\t- [Deposit(_account,_amount,amountStaked)](contracts/core/Vault.sol#L191)\n", + "first_markdown_element": "contracts/core/Vault.sol#L176-L192", + "id": "9b7f364b05b547bddc816a0d5b06d8980808dad51839e6d4b0a54fad3ee65e71", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "directPayouts", + "source_mapping": { + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "directPayouts(IERC20,address[],uint256[])" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)", + "source_mapping": { + "start": 4662, + "length": 59, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [133], + "starting_column": 13, + "ending_column": 72 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "directPayouts", + "source_mapping": { + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "directPayouts(IERC20,address[],uint256[])" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "FundingPaid(lastPaidEpoch,_dests,_allocations)", + "source_mapping": { + "start": 4890, + "length": 53, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [142], + "starting_column": 9, + "ending_column": 62 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "directPayouts", + "source_mapping": { + "start": 4121, + "length": 829, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "directPayouts(IERC20,address[],uint256[])" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[]) (contracts/admin/TempleTeamPaymentsFactory.sol#119-143):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(_token,msg.sender,dest,value) (contracts/admin/TempleTeamPaymentsFactory.sol#133)\n\tEvent emitted after the call(s):\n\t- FundingPaid(lastPaidEpoch,_dests,_allocations) (contracts/admin/TempleTeamPaymentsFactory.sol#142)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.directPayouts(IERC20,address[],uint256[])](contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(_token,msg.sender,dest,value)](contracts/admin/TempleTeamPaymentsFactory.sol#L133)\n\tEvent emitted after the call(s):\n\t- [FundingPaid(lastPaidEpoch,_dests,_allocations)](contracts/admin/TempleTeamPaymentsFactory.sol#L142)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L119-L143", + "id": "6c80a1f2386bfefc5e825932ef0f67802c5f2af3857235cf886592ad9e720a6d", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "increaseShares", + "source_mapping": { + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "increaseShares(address,uint256)" + } + }, + { + "type": "node", + "name": "claimFor(account)", + "source_mapping": { + "start": 2093, + "length": 17, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [57], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "increaseShares", + "source_mapping": { + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "increaseShares(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "exposure.mint(account,unclaimedScaled / SCALING_FACTOR)", + "source_mapping": { + "start": 3214, + "length": 56, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [91], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "claimFor", + "source_mapping": { + "start": 2738, + "length": 611, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "claimFor(address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "IncreaseShares(account,amount)", + "source_mapping": { + "start": 2266, + "length": 36, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [63], + "starting_column": 9, + "ending_column": 45 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "increaseShares", + "source_mapping": { + "start": 2007, + "length": 302, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [56, 57, 58, 59, 60, 61, 62, 63, 64], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryFarmingRevenue", + "source_mapping": { + "start": 547, + "length": 3079, + "filename_relative": "contracts/core/TreasuryFarmingRevenue.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TreasuryFarmingRevenue.sol", + "filename_short": "contracts/core/TreasuryFarmingRevenue.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "increaseShares(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TreasuryFarmingRevenue.increaseShares(address,uint256) (contracts/core/TreasuryFarmingRevenue.sol#56-64):\n\tExternal calls:\n\t- claimFor(account) (contracts/core/TreasuryFarmingRevenue.sol#57)\n\t\t- exposure.mint(account,unclaimedScaled / SCALING_FACTOR) (contracts/core/TreasuryFarmingRevenue.sol#91)\n\tEvent emitted after the call(s):\n\t- IncreaseShares(account,amount) (contracts/core/TreasuryFarmingRevenue.sol#63)\n", + "markdown": "Reentrancy in [TreasuryFarmingRevenue.increaseShares(address,uint256)](contracts/core/TreasuryFarmingRevenue.sol#L56-L64):\n\tExternal calls:\n\t- [claimFor(account)](contracts/core/TreasuryFarmingRevenue.sol#L57)\n\t\t- [exposure.mint(account,unclaimedScaled / SCALING_FACTOR)](contracts/core/TreasuryFarmingRevenue.sol#L91)\n\tEvent emitted after the call(s):\n\t- [IncreaseShares(account,amount)](contracts/core/TreasuryFarmingRevenue.sol#L63)\n", + "first_markdown_element": "contracts/core/TreasuryFarmingRevenue.sol#L56-L64", + "id": "d4561252e63b6b2b82404c62a37f3524f0af810644056f99e52c4028a071621f", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "lockFor", + "source_mapping": { + "start": 943, + "length": 494, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "lockFor(address,uint256,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple)", + "source_mapping": { + "start": 1247, + "length": 111, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [46, 47, 48, 49, 50, 51], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "lockFor", + "source_mapping": { + "start": 943, + "length": 494, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "lockFor(address,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp)", + "source_mapping": { + "start": 1364, + "length": 68, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [52], + "starting_column": 5, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "lockFor", + "source_mapping": { + "start": 943, + "length": 494, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "lockFor(address,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in LockedOGTemple.lockFor(address,uint256,uint256) (contracts/deprecated/LockedOGTemple.sol#35-53):\n\tExternal calls:\n\t- SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple) (contracts/deprecated/LockedOGTemple.sol#46-51)\n\tEvent emitted after the call(s):\n\t- OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp) (contracts/deprecated/LockedOGTemple.sol#52)\n", + "markdown": "Reentrancy in [LockedOGTemple.lockFor(address,uint256,uint256)](contracts/deprecated/LockedOGTemple.sol#L35-L53):\n\tExternal calls:\n\t- [SafeERC20.safeTransferFrom(OG_TEMPLE,msg.sender,address(this),_amountOGTemple)](contracts/deprecated/LockedOGTemple.sol#L46-L51)\n\tEvent emitted after the call(s):\n\t- [OGTempleLocked(_staker,_amountOGTemple,_lockedUntilTimestamp)](contracts/deprecated/LockedOGTemple.sol#L52)\n", + "first_markdown_element": "contracts/deprecated/LockedOGTemple.sol#L35-L53", + "id": "4230808e1cd7a4f58313604bd2841ce355116b1beb66b33f45e8990f931fb60f", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2543, + "length": 244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(token).safeTransfer(to,amount)", + "source_mapping": { + "start": 2694, + "length": 38, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [75], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2543, + "length": 244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TokenRecovered(token,to,amount)", + "source_mapping": { + "start": 2742, + "length": 38, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [76], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 2543, + "length": 244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [73, 74, 75, 76, 77], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in VaultEarlyWithdraw.recoverToken(address,address,uint256) (contracts/core/VaultEarlyWithdraw.sol#73-77):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/core/VaultEarlyWithdraw.sol#75)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(token,to,amount) (contracts/core/VaultEarlyWithdraw.sol#76)\n", + "markdown": "Reentrancy in [VaultEarlyWithdraw.recoverToken(address,address,uint256)](contracts/core/VaultEarlyWithdraw.sol#L73-L77):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/core/VaultEarlyWithdraw.sol#L75)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(token,to,amount)](contracts/core/VaultEarlyWithdraw.sol#L76)\n", + "first_markdown_element": "contracts/core/VaultEarlyWithdraw.sol#L73-L77", + "id": "1c3c00beda0eb4b0661cc31987f0cf4c864705a836f5da0004529d20a3b860b8", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 14479, + "length": 1577, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(token).safeTransfer(to,amount)", + "source_mapping": { + "start": 15940, + "length": 38, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [329], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 14479, + "length": 1577, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CommonEventsAndErrors.TokenRecovered(to,token,amount)", + "source_mapping": { + "start": 15989, + "length": 60, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [331], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 14479, + "length": 1577, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in SpiceAuction.recoverToken(address,address,uint256) (contracts/templegold/SpiceAuction.sol#298-332):\n\tExternal calls:\n\t- IERC20(token).safeTransfer(to,amount) (contracts/templegold/SpiceAuction.sol#329)\n\tEvent emitted after the call(s):\n\t- CommonEventsAndErrors.TokenRecovered(to,token,amount) (contracts/templegold/SpiceAuction.sol#331)\n", + "markdown": "Reentrancy in [SpiceAuction.recoverToken(address,address,uint256)](contracts/templegold/SpiceAuction.sol#L298-L332):\n\tExternal calls:\n\t- [IERC20(token).safeTransfer(to,amount)](contracts/templegold/SpiceAuction.sol#L329)\n\tEvent emitted after the call(s):\n\t- [CommonEventsAndErrors.TokenRecovered(to,token,amount)](contracts/templegold/SpiceAuction.sol#L331)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L298-L332", + "id": "5542de464a84295fc82ba35ea06f33756f7428321f28112cf253169059762b95", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 13598, + "length": 381, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [341, 342, 343, 344, 345, 346, 347], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(_token).safeTransfer(_to,_amount)", + "source_mapping": { + "start": 13858, + "length": 41, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [345], + "starting_column": 9, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 13598, + "length": 381, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [341, 342, 343, 344, 345, 346, 347], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "CommonEventsAndErrors.TokenRecovered(_to,_token,_amount)", + "source_mapping": { + "start": 13909, + "length": 63, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [346], + "starting_column": 9, + "ending_column": 72 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "recoverToken", + "source_mapping": { + "start": 13598, + "length": 381, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [341, 342, 343, 344, 345, 346, 347], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "recoverToken(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleGoldStaking.recoverToken(address,address,uint256) (contracts/templegold/TempleGoldStaking.sol#341-347):\n\tExternal calls:\n\t- IERC20(_token).safeTransfer(_to,_amount) (contracts/templegold/TempleGoldStaking.sol#345)\n\tEvent emitted after the call(s):\n\t- CommonEventsAndErrors.TokenRecovered(_to,_token,_amount) (contracts/templegold/TempleGoldStaking.sol#346)\n", + "markdown": "Reentrancy in [TempleGoldStaking.recoverToken(address,address,uint256)](contracts/templegold/TempleGoldStaking.sol#L341-L347):\n\tExternal calls:\n\t- [IERC20(_token).safeTransfer(_to,_amount)](contracts/templegold/TempleGoldStaking.sol#L345)\n\tEvent emitted after the call(s):\n\t- [CommonEventsAndErrors.TokenRecovered(_to,_token,_amount)](contracts/templegold/TempleGoldStaking.sol#L346)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L341-L347", + "id": "00f90fbe8810e2b48dca5e6a26316c07f74ad377236a61c062e6f1a21990e108", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "redeemAmount", + "source_mapping": { + "start": 3080, + "length": 296, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Exposure", + "source_mapping": { + "start": 362, + "length": 3840, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "redeemAmount(uint256,address)" + } + }, + { + "type": "node", + "name": "liquidator.toTemple(amount,to)", + "source_mapping": { + "start": 3261, + "length": 31, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [109], + "starting_column": 13, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "redeemAmount", + "source_mapping": { + "start": 3080, + "length": 296, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Exposure", + "source_mapping": { + "start": 362, + "length": 3840, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "redeemAmount(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Redeem(address(revalToken),msg.sender,to,amount)", + "source_mapping": { + "start": 3313, + "length": 56, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [112], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "redeemAmount", + "source_mapping": { + "start": 3080, + "length": 296, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [104, 105, 106, 107, 108, 109, 110, 111, 112, 113], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Exposure", + "source_mapping": { + "start": 362, + "length": 3840, + "filename_relative": "contracts/core/Exposure.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Exposure.sol", + "filename_short": "contracts/core/Exposure.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "redeemAmount(uint256,address)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Exposure.redeemAmount(uint256,address) (contracts/core/Exposure.sol#104-113):\n\tExternal calls:\n\t- liquidator.toTemple(amount,to) (contracts/core/Exposure.sol#109)\n\tEvent emitted after the call(s):\n\t- Redeem(address(revalToken),msg.sender,to,amount) (contracts/core/Exposure.sol#112)\n", + "markdown": "Reentrancy in [Exposure.redeemAmount(uint256,address)](contracts/core/Exposure.sol#L104-L113):\n\tExternal calls:\n\t- [liquidator.toTemple(amount,to)](contracts/core/Exposure.sol#L109)\n\tEvent emitted after the call(s):\n\t- [Redeem(address(revalToken),msg.sender,to,amount)](contracts/core/Exposure.sol#L112)\n", + "first_markdown_element": "contracts/core/Exposure.sol#L104-L113", + "id": "5c348eea3fa61ccb6c1609a61dfbf2ea3d76c031d344e46e4a98a0d17d2298c4", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "setVestingFactor", + "source_mapping": { + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [131, 132, 133, 134, 135, 136, 137, 138], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "setVestingFactor(ITempleGold.VestingFactor)" + } + }, + { + "type": "node", + "name": "mint()", + "source_mapping": { + "start": 6565, + "length": 6, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [135], + "starting_column": 16, + "ending_column": 22 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "setVestingFactor", + "source_mapping": { + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [131, 132, 133, 134, 135, 136, 137, 138], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "setVestingFactor(ITempleGold.VestingFactor)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "staking.notifyDistribution(stakingAmount)", + "source_mapping": { + "start": 10748, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [240], + "starting_column": 13, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_distribute", + "source_mapping": { + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "auction.notifyDistribution(auctionAmount)", + "source_mapping": { + "start": 11012, + "length": 41, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [246], + "starting_column": 13, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_distribute", + "source_mapping": { + "start": 10452, + "length": 1041, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "_distribute(ITempleGold.DistributionParams,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "VestingFactorSet(_factor.value,_factor.weekMultiplier)", + "source_mapping": { + "start": 6616, + "length": 60, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [137], + "starting_column": 9, + "ending_column": 69 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "setVestingFactor", + "source_mapping": { + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [131, 132, 133, 134, 135, 136, 137, 138], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGold", + "source_mapping": { + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, + "ending_column": 0 + } + }, + "signature": "setVestingFactor(ITempleGold.VestingFactor)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleGold.setVestingFactor(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#131-138):\n\tExternal calls:\n\t- mint() (contracts/templegold/TempleGold.sol#135)\n\t\t- staking.notifyDistribution(stakingAmount) (contracts/templegold/TempleGold.sol#240)\n\t\t- auction.notifyDistribution(auctionAmount) (contracts/templegold/TempleGold.sol#246)\n\tEvent emitted after the call(s):\n\t- VestingFactorSet(_factor.value,_factor.weekMultiplier) (contracts/templegold/TempleGold.sol#137)\n", + "markdown": "Reentrancy in [TempleGold.setVestingFactor(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L131-L138):\n\tExternal calls:\n\t- [mint()](contracts/templegold/TempleGold.sol#L135)\n\t\t- [staking.notifyDistribution(stakingAmount)](contracts/templegold/TempleGold.sol#L240)\n\t\t- [auction.notifyDistribution(auctionAmount)](contracts/templegold/TempleGold.sol#L246)\n\tEvent emitted after the call(s):\n\t- [VestingFactorSet(_factor.value,_factor.weekMultiplier)](contracts/templegold/TempleGold.sol#L137)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L131-L138", + "id": "4392f0b9eee97adcff84e8256927966c319bab900b3e37bbe38d4ad65b290bc5", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "startAuction", + "source_mapping": { + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" + } + }, + { + "type": "node", + "name": "_distributeGold()", + "source_mapping": { + "start": 5535, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [119], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "startAuction", + "source_mapping": { + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "templeGold.mint()", + "source_mapping": { + "start": 14719, + "length": 17, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [335], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_distributeGold", + "source_mapping": { + "start": 14614, + "length": 129, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [333, 334, 335, 336], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_distributeGold()" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "AuctionStarted(epochId,msg.sender,startTime,endTime,totalGoldAmount)", + "source_mapping": { + "start": 6126, + "length": 77, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [131], + "starting_column": 9, + "ending_column": 86 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "startAuction", + "source_mapping": { + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "StableGoldAuction", + "source_mapping": { + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", + "is_dependency": false, + "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132):\n\tExternal calls:\n\t- _distributeGold() (contracts/templegold/StableGoldAuction.sol#119)\n\t\t- templeGold.mint() (contracts/templegold/StableGoldAuction.sol#335)\n\tEvent emitted after the call(s):\n\t- AuctionStarted(epochId,msg.sender,startTime,endTime,totalGoldAmount) (contracts/templegold/StableGoldAuction.sol#131)\n", + "markdown": "Reentrancy in [StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132):\n\tExternal calls:\n\t- [_distributeGold()](contracts/templegold/StableGoldAuction.sol#L119)\n\t\t- [templeGold.mint()](contracts/templegold/StableGoldAuction.sol#L335)\n\tEvent emitted after the call(s):\n\t- [AuctionStarted(epochId,msg.sender,startTime,endTime,totalGoldAmount)](contracts/templegold/StableGoldAuction.sol#L131)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L107-L132", + "id": "66af89ae08ef0320032692cd0247cf5af8e193c212c1483715e8ae2159008785", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "teleport", + "source_mapping": { + "start": 1844, + "length": 715, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeleporter", + "source_mapping": { + "start": 962, + "length": 3792, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "teleport(uint32,address,uint256,bytes)" + } + }, + { + "type": "node", + "name": "temple.burnFrom(msg.sender,amount)", + "source_mapping": { + "start": 2350, + "length": 35, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [54], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "teleport", + "source_mapping": { + "start": 1844, + "length": 715, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeleporter", + "source_mapping": { + "start": 962, + "length": 3792, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "teleport(uint32,address,uint256,bytes)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TempleTeleported(dstEid,msg.sender,to,amount)", + "source_mapping": { + "start": 2395, + "length": 53, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [55], + "starting_column": 9, + "ending_column": 62 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "teleport", + "source_mapping": { + "start": 1844, + "length": 715, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeleporter", + "source_mapping": { + "start": 962, + "length": 3792, + "filename_relative": "contracts/templegold/TempleTeleporter.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleTeleporter.sol", + "filename_short": "contracts/templegold/TempleTeleporter.sol", + "is_dependency": false, + "lines": [ + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "teleport(uint32,address,uint256,bytes)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeleporter.teleport(uint32,address,uint256,bytes) (contracts/templegold/TempleTeleporter.sol#43-58):\n\tExternal calls:\n\t- temple.burnFrom(msg.sender,amount) (contracts/templegold/TempleTeleporter.sol#54)\n\tEvent emitted after the call(s):\n\t- TempleTeleported(dstEid,msg.sender,to,amount) (contracts/templegold/TempleTeleporter.sol#55)\n", + "markdown": "Reentrancy in [TempleTeleporter.teleport(uint32,address,uint256,bytes)](contracts/templegold/TempleTeleporter.sol#L43-L58):\n\tExternal calls:\n\t- [temple.burnFrom(msg.sender,amount)](contracts/templegold/TempleTeleporter.sol#L54)\n\tEvent emitted after the call(s):\n\t- [TempleTeleported(dstEid,msg.sender,to,amount)](contracts/templegold/TempleTeleporter.sol#L55)\n", + "first_markdown_element": "contracts/templegold/TempleTeleporter.sol#L43-L58", + "id": "2fa3a4eaa19262921076fec1f72521c6ff330950939635d62563a9776dc62a35", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdraw", + "source_mapping": { + "start": 1887, + "length": 562, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdraw(address,uint256)" + } + }, + { + "type": "node", + "name": "IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount)", + "source_mapping": { + "start": 2179, + "length": 67, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [62], + "starting_column": 9, + "ending_column": 76 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdraw", + "source_mapping": { + "start": 1887, + "length": 562, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdraw(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "templeToken.safeTransfer(msg.sender,_templeAmount)", + "source_mapping": { + "start": 2335, + "length": 51, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [65], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdraw", + "source_mapping": { + "start": 1887, + "length": 562, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdraw(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "EarlyWithdraw(msg.sender,_templeAmount)", + "source_mapping": { + "start": 2397, + "length": 45, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [67], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdraw", + "source_mapping": { + "start": 1887, + "length": 562, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "VaultEarlyWithdraw", + "source_mapping": { + "start": 545, + "length": 2244, + "filename_relative": "contracts/core/VaultEarlyWithdraw.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/VaultEarlyWithdraw.sol", + "filename_short": "contracts/core/VaultEarlyWithdraw.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdraw(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in VaultEarlyWithdraw.withdraw(address,uint256) (contracts/core/VaultEarlyWithdraw.sol#57-68):\n\tExternal calls:\n\t- IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#62)\n\t- templeToken.safeTransfer(msg.sender,_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#65)\n\tEvent emitted after the call(s):\n\t- EarlyWithdraw(msg.sender,_templeAmount) (contracts/core/VaultEarlyWithdraw.sol#67)\n", + "markdown": "Reentrancy in [VaultEarlyWithdraw.withdraw(address,uint256)](contracts/core/VaultEarlyWithdraw.sol#L57-L68):\n\tExternal calls:\n\t- [IERC20(_vault).safeTransferFrom(msg.sender,owner(),_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L62)\n\t- [templeToken.safeTransfer(msg.sender,_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L65)\n\tEvent emitted after the call(s):\n\t- [EarlyWithdraw(msg.sender,_templeAmount)](contracts/core/VaultEarlyWithdraw.sol#L67)\n", + "first_markdown_element": "contracts/core/VaultEarlyWithdraw.sol#L57-L68", + "id": "7a41d062356aa90302a9b5d0829abad146259b6d909dd1702764a586f2839691", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 8002, + "length": 349, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,address,uint256)" + } + }, + { + "type": "node", + "name": "templeExposureToken.redeemAmount(_amount,_to)", + "source_mapping": { + "start": 8256, + "length": 46, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [207], + "starting_column": 9, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 8002, + "length": 349, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "Withdraw(_account,_amount)", + "source_mapping": { + "start": 8312, + "length": 32, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [208], + "starting_column": 9, + "ending_column": 41 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 8002, + "length": 349, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [200, 201, 202, 203, 204, 205, 206, 207, 208, 209], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Vault", + "source_mapping": { + "start": 1182, + "length": 7299, + "filename_relative": "contracts/core/Vault.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/Vault.sol", + "filename_short": "contracts/core/Vault.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in Vault.withdrawFor(address,address,uint256) (contracts/core/Vault.sol#200-209):\n\tExternal calls:\n\t- templeExposureToken.redeemAmount(_amount,_to) (contracts/core/Vault.sol#207)\n\tEvent emitted after the call(s):\n\t- Withdraw(_account,_amount) (contracts/core/Vault.sol#208)\n", + "markdown": "Reentrancy in [Vault.withdrawFor(address,address,uint256)](contracts/core/Vault.sol#L200-L209):\n\tExternal calls:\n\t- [templeExposureToken.redeemAmount(_amount,_to)](contracts/core/Vault.sol#L207)\n\tEvent emitted after the call(s):\n\t- [Withdraw(_account,_amount)](contracts/core/Vault.sol#L208)\n", + "first_markdown_element": "contracts/core/Vault.sol#L200-L209", + "id": "2ff96324c82420cceeabf74c571ad57f47606117de95c992bffac11206a305e2", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 1642, + "length": 627, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple)", + "source_mapping": { + "start": 2140, + "length": 65, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [79], + "starting_column": 5, + "ending_column": 70 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 1642, + "length": 627, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "OGTempleWithdraw(_staker,entry.BalanceOGTemple)", + "source_mapping": { + "start": 2211, + "length": 53, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [80], + "starting_column": 5, + "ending_column": 58 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawFor", + "source_mapping": { + "start": 1642, + "length": 627, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81 + ], + "starting_column": 3, + "ending_column": 4 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "LockedOGTemple", + "source_mapping": { + "start": 213, + "length": 2143, + "filename_relative": "contracts/deprecated/LockedOGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/LockedOGTemple.sol", + "filename_short": "contracts/deprecated/LockedOGTemple.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawFor(address,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in LockedOGTemple.withdrawFor(address,uint256) (contracts/deprecated/LockedOGTemple.sol#62-81):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple) (contracts/deprecated/LockedOGTemple.sol#79)\n\tEvent emitted after the call(s):\n\t- OGTempleWithdraw(_staker,entry.BalanceOGTemple) (contracts/deprecated/LockedOGTemple.sol#80)\n", + "markdown": "Reentrancy in [LockedOGTemple.withdrawFor(address,uint256)](contracts/deprecated/LockedOGTemple.sol#L62-L81):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(OG_TEMPLE,_staker,entry.BalanceOGTemple)](contracts/deprecated/LockedOGTemple.sol#L79)\n\tEvent emitted after the call(s):\n\t- [OGTempleWithdraw(_staker,entry.BalanceOGTemple)](contracts/deprecated/LockedOGTemple.sol#L80)\n", + "first_markdown_element": "contracts/deprecated/LockedOGTemple.sol#L62-L81", + "id": "1121dbdb9cb432f782fa1dcd86b226568d78c9cf57bb807ccdc10360eed217f4", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1801, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [58, 59, 60, 61, 62], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(_token,msg.sender,_amount)", + "source_mapping": { + "start": 1936, + "length": 51, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [60], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1801, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [58, 59, 60, 61, 62], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TokenRecovered(address(_token),_amount)", + "source_mapping": { + "start": 1997, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [61], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1801, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [58, 59, 60, 61, 62], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsFactory", + "source_mapping": { + "start": 279, + "length": 4673, + "filename_relative": "contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsFactory.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsFactory.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPaymentsFactory.withdrawToken(IERC20,uint256) (contracts/admin/TempleTeamPaymentsFactory.sol#58-62):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(_token,msg.sender,_amount) (contracts/admin/TempleTeamPaymentsFactory.sol#60)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(address(_token),_amount) (contracts/admin/TempleTeamPaymentsFactory.sol#61)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsFactory.withdrawToken(IERC20,uint256)](contracts/admin/TempleTeamPaymentsFactory.sol#L58-L62):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(_token,msg.sender,_amount)](contracts/admin/TempleTeamPaymentsFactory.sol#L60)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(address(_token),_amount)](contracts/admin/TempleTeamPaymentsFactory.sol#L61)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsFactory.sol#L58-L62", + "id": "953d8875749802563ce4b05772559dd5c6f58bf7e3ad4f1c24b9968cf0977dca", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1920, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [59, 60, 61, 62, 63], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + }, + { + "type": "node", + "name": "SafeERC20.safeTransfer(_token,msg.sender,_amount)", + "source_mapping": { + "start": 2055, + "length": 51, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [61], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1920, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [59, 60, 61, 62, 63], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "TokenRecovered(address(_token),_amount)", + "source_mapping": { + "start": 2116, + "length": 45, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [62], + "starting_column": 9, + "ending_column": 54 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawToken", + "source_mapping": { + "start": 1920, + "length": 248, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [59, 60, 61, 62, 63], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleTeamPaymentsV2", + "source_mapping": { + "start": 346, + "length": 2599, + "filename_relative": "contracts/admin/TempleTeamPaymentsV2.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/admin/TempleTeamPaymentsV2.sol", + "filename_short": "contracts/admin/TempleTeamPaymentsV2.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawToken(IERC20,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "event" } + } + ], + "description": "Reentrancy in TempleTeamPaymentsV2.withdrawToken(IERC20,uint256) (contracts/admin/TempleTeamPaymentsV2.sol#59-63):\n\tExternal calls:\n\t- SafeERC20.safeTransfer(_token,msg.sender,_amount) (contracts/admin/TempleTeamPaymentsV2.sol#61)\n\tEvent emitted after the call(s):\n\t- TokenRecovered(address(_token),_amount) (contracts/admin/TempleTeamPaymentsV2.sol#62)\n", + "markdown": "Reentrancy in [TempleTeamPaymentsV2.withdrawToken(IERC20,uint256)](contracts/admin/TempleTeamPaymentsV2.sol#L59-L63):\n\tExternal calls:\n\t- [SafeERC20.safeTransfer(_token,msg.sender,_amount)](contracts/admin/TempleTeamPaymentsV2.sol#L61)\n\tEvent emitted after the call(s):\n\t- [TokenRecovered(address(_token),_amount)](contracts/admin/TempleTeamPaymentsV2.sol#L62)\n", + "first_markdown_element": "contracts/admin/TempleTeamPaymentsV2.sol#L59-L63", + "id": "1448ab1692e2240869b3f86449f76a8cb3919b98c18052b582afb147fffce7f0", + "check": "reentrancy-events", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_update", + "source_mapping": { + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_update(uint256,uint256,uint112,uint112)" + } + }, + { + "type": "node", + "name": "timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0", + "source_mapping": { + "start": 3460, + "length": 51, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [84], + "starting_column": 13, + "ending_column": 64 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_update", + "source_mapping": { + "start": 3107, + "length": 847, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleUniswapV2Pair", + "source_mapping": { + "start": 440, + "length": 8733, + "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", + "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_update(uint256,uint256,uint112,uint112)" + } + } + } + } + ], + "description": "TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0 (contracts/amm/TempleUniswapV2Pair.sol#84)\n", + "markdown": "[TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0](contracts/amm/TempleUniswapV2Pair.sol#L84)\n", + "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L80-L93", + "id": "3e4c1fb2f0df938570805f2a5513be58a1af7dd63232a6822178ed2775dc9957", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_initBaseCache", + "source_mapping": { + "start": 26081, + "length": 748, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", + "is_dependency": false, + "lines": [ + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleDebtToken", + "source_mapping": { + "start": 2214, + "length": 30237, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", + "is_dependency": false, + "lines": [ + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_initBaseCache(TempleDebtToken.BaseCache)" + } + }, + { + "type": "node", + "name": "_timeElapsed > 0", + "source_mapping": { + "start": 26467, + "length": 16, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", + "is_dependency": false, + "lines": [607], + "starting_column": 13, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_initBaseCache", + "source_mapping": { + "start": 26081, + "length": 748, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", + "is_dependency": false, + "lines": [ + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleDebtToken", + "source_mapping": { + "start": 2214, + "length": 30237, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", + "is_dependency": false, + "lines": [ + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, + 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "shutdown(address)" + "signature": "_initBaseCache(TempleDebtToken.BaseCache)" } } - }, - "additional_fields": { "underlying_type": "event" } + } } ], - "description": "Reentrancy in TreasuryReservesVault.shutdown(address) (contracts/v2/TreasuryReservesVault.sol#283-319):\n\tExternal calls:\n\t- _outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy) (contracts/v2/TreasuryReservesVault.sol#296)\n\tEvent emitted after the call(s):\n\t- StrategyRemoved(strategy) (contracts/v2/TreasuryReservesVault.sol#312)\n\t- StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt}) (contracts/v2/TreasuryReservesVault.sol#297-302)\n", - "markdown": "Reentrancy in [TreasuryReservesVault.shutdown(address)](contracts/v2/TreasuryReservesVault.sol#L283-L319):\n\tExternal calls:\n\t- [_outstandingDebt = borrowTokens[_token].dToken.burnAll(strategy)](contracts/v2/TreasuryReservesVault.sol#L296)\n\tEvent emitted after the call(s):\n\t- [StrategyRemoved(strategy)](contracts/v2/TreasuryReservesVault.sol#L312)\n\t- [StrategyShutdownCreditAndDebt({strategy:strategy,token:address(_token),outstandingCredit:credits[_token],outstandingDebt:_outstandingDebt})](contracts/v2/TreasuryReservesVault.sol#L297-L302)\n", - "first_markdown_element": "contracts/v2/TreasuryReservesVault.sol#L283-L319", - "id": "3770a3cd34d6db65975f14acb9170e3663edac9809964808500e613a8be2344e", - "check": "reentrancy-events", + "description": "TempleDebtToken._initBaseCache(TempleDebtToken.BaseCache) (contracts/v2/TempleDebtToken.sol#597-617) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/TempleDebtToken.sol#607)\n", + "markdown": "[TempleDebtToken._initBaseCache(TempleDebtToken.BaseCache)](contracts/v2/TempleDebtToken.sol#L597-L617) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/TempleDebtToken.sol#L607)\n", + "first_markdown_element": "contracts/v2/TempleDebtToken.sol#L597-L617", + "id": "31468fb88b544bfa40953f9c670145ae2d6cc30a857f141027542b78efe5314e", + "check": "timestamp", "impact": "Low", "confidence": "Medium" }, @@ -36911,17 +53495,20 @@ "elements": [ { "type": "function", - "name": "trvWithdraw", + "name": "_initDebtorCache", "source_mapping": { - "start": 10561, - "length": 947, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 28539, + "length": 2281, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", "is_dependency": false, "lines": [ - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727 ], "starting_column": 5, "ending_column": 6 @@ -36929,72 +53516,110 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleDebtToken", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2214, + "length": 30237, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "trvWithdraw(uint256)" + "signature": "_initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)" } }, { "type": "node", - "name": "(daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance()", + "name": "_timeElapsed > 0", "source_mapping": { - "start": 11011, - "length": 86, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 29699, + "length": 16, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", "is_dependency": false, - "lines": [264], - "starting_column": 9, - "ending_column": 95 + "lines": [703], + "starting_column": 13, + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "trvWithdraw", + "name": "_initDebtorCache", "source_mapping": { - "start": 10561, - "length": 947, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 28539, + "length": 2281, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", "is_dependency": false, "lines": [ - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727 ], "starting_column": 5, "ending_column": 6 @@ -37002,455 +53627,490 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleDebtToken", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 2214, + "length": 30237, + "filename_relative": "contracts/v2/TempleDebtToken.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", + "filename_short": "contracts/v2/TempleDebtToken.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, + 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "trvWithdraw(uint256)" + "signature": "_initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)" } } + } + } + ], + "description": "TempleDebtToken._initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool) (contracts/v2/TempleDebtToken.sol#672-727) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/TempleDebtToken.sol#703)\n", + "markdown": "[TempleDebtToken._initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)](contracts/v2/TempleDebtToken.sol#L672-L727) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/TempleDebtToken.sol#L703)\n", + "first_markdown_element": "contracts/v2/TempleDebtToken.sol#L672-L727", + "id": "a6d589cd4caf5ac6f228dd6218ef29c77e92ed66db618140855c2644b3b2cb10", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "treasuryPriceIndex", + "source_mapping": { + "start": 3361, + "length": 506, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "is_dependency": false, + "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102], + "starting_column": 5, + "ending_column": 7 }, - "additional_fields": { "underlying_type": "external_calls" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TreasuryPriceIndexOracle", + "source_mapping": { + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "treasuryPriceIndex()" + } }, { "type": "node", - "name": "chi = pot.drip()", + "name": "_now >= tpiData.targetTime", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3490, + "length": 26, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [142], - "starting_column": 9, - "ending_column": 69 + "lines": [93], + "starting_column": 13, + "ending_column": 39 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "treasuryPriceIndex", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3361, + "length": 506, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102], "starting_column": 5, - "ending_column": 6 + "ending_column": 7 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_checkpointChi()" + "signature": "treasuryPriceIndex()" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "TreasuryPriceIndexOracle.treasuryPriceIndex() (contracts/v2/TreasuryPriceIndexOracle.sol#91-102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _now >= tpiData.targetTime (contracts/v2/TreasuryPriceIndexOracle.sol#93)\n", + "markdown": "[TreasuryPriceIndexOracle.treasuryPriceIndex()](contracts/v2/TreasuryPriceIndexOracle.sol#L91-L102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_now >= tpiData.targetTime](contracts/v2/TreasuryPriceIndexOracle.sol#L93)\n", + "first_markdown_element": "contracts/v2/TreasuryPriceIndexOracle.sol#L91-L102", + "id": "dcebf3facc4c98e108c10f0f26715243d17dae7f03135b42c4924ec730f84c8a", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "_dsrWithdrawal(sharesAmount,requestedAmount)", + "type": "function", + "name": "setTreasuryPriceIndexAt", "source_mapping": { - "start": 11366, - "length": 45, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5558, + "length": 1362, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [273], - "starting_column": 9, - "ending_column": 54 + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "trvWithdraw", + "type": "contract", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 10561, - "length": 947, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "trvWithdraw(uint256)" + "starting_column": 1, + "ending_column": 0 } - } - }, - "additional_fields": { "underlying_type": "external_calls" } + }, + "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + } }, { "type": "node", - "name": "pot.exit(sharesAmount)", + "name": "targetTime < _now + minTreasuryPriceIndexTargetTimeDelta", "source_mapping": { - "start": 11598, - "length": 22, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5930, + "length": 56, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [279], - "starting_column": 9, - "ending_column": 31 + "lines": [147], + "starting_column": 13, + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "setTreasuryPriceIndexAt", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5558, + "length": 1362, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "setTreasuryPriceIndexAt(uint96,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "daiJoin.exit(address(this),daiAmount)", + "name": "_absDelta > maxTreasuryPriceIndexDelta", "source_mapping": { - "start": 11630, + "start": 6272, "length": 38, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [280], - "starting_column": 9, - "ending_column": 47 + "lines": [152], + "starting_column": 13, + "ending_column": 51 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "setTreasuryPriceIndexAt", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5558, + "length": 1362, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "setTreasuryPriceIndexAt(uint96,uint32)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "_absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange", "source_mapping": { - "start": 11678, - "length": 28, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6462, + "length": 55, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [281], - "starting_column": 9, - "ending_column": 37 + "lines": [154], + "starting_column": 13, + "ending_column": 68 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "setTreasuryPriceIndexAt", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5558, + "length": 1362, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "setTreasuryPriceIndexAt(uint96,uint32)" } } - }, - "additional_fields": { "underlying_type": "event" } + } }, { "type": "node", - "name": "_dsrWithdrawal(sharesAmount,requestedAmount)", + "name": "_tpiDelta < 0", "source_mapping": { - "start": 11366, - "length": 45, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6181, + "length": 77, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, - "lines": [273], + "lines": [151], "starting_column": 9, - "ending_column": 54 + "ending_column": 86 }, "type_specific_fields": { "parent": { "type": "function", - "name": "trvWithdraw", + "name": "setTreasuryPriceIndexAt", "source_mapping": { - "start": 10561, - "length": 947, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5558, + "length": 1362, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276 + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 ], "starting_column": 5, "ending_column": 6 @@ -37458,55 +54118,43 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TreasuryPriceIndexOracle", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 557, + "length": 6366, + "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", + "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "trvWithdraw(uint256)" + "signature": "setTreasuryPriceIndexAt(uint96,uint32)" } } - }, - "additional_fields": { "underlying_type": "event" } + } } ], - "description": "Reentrancy in DsrBaseStrategy.trvWithdraw(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#257-276):\n\tExternal calls:\n\t- (daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#264)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAmount,requestedAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#273)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAmount,requestedAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#273)\n", - "markdown": "Reentrancy in [DsrBaseStrategy.trvWithdraw(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L257-L276):\n\tExternal calls:\n\t- [(daiAvailable,chi,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L264)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAmount,requestedAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L273)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAmount,requestedAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L273)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L257-L276", - "id": "0a4c8e86f10e88f7cdc66960b0dd281291f86c22d1d8b92e68909c1d477f23ac", - "check": "reentrancy-events", + "description": "TreasuryPriceIndexOracle.setTreasuryPriceIndexAt(uint96,uint32) (contracts/v2/TreasuryPriceIndexOracle.sol#141-165) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- targetTime < _now + minTreasuryPriceIndexTargetTimeDelta (contracts/v2/TreasuryPriceIndexOracle.sol#147)\n\t- _absDelta > maxTreasuryPriceIndexDelta (contracts/v2/TreasuryPriceIndexOracle.sol#152)\n\t- _absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange (contracts/v2/TreasuryPriceIndexOracle.sol#154)\n\t- _tpiDelta < 0 (contracts/v2/TreasuryPriceIndexOracle.sol#151)\n", + "markdown": "[TreasuryPriceIndexOracle.setTreasuryPriceIndexAt(uint96,uint32)](contracts/v2/TreasuryPriceIndexOracle.sol#L141-L165) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [targetTime < _now + minTreasuryPriceIndexTargetTimeDelta](contracts/v2/TreasuryPriceIndexOracle.sol#L147)\n\t- [_absDelta > maxTreasuryPriceIndexDelta](contracts/v2/TreasuryPriceIndexOracle.sol#L152)\n\t- [_absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange](contracts/v2/TreasuryPriceIndexOracle.sol#L154)\n\t- [_tpiDelta < 0](contracts/v2/TreasuryPriceIndexOracle.sol#L151)\n", + "first_markdown_element": "contracts/v2/TreasuryPriceIndexOracle.sol#L141-L165", + "id": "82ebcf3bc2dce9c3d152ebad5a046d541a691e4433e02c30cdf82fd82beef3d7", + "check": "timestamp", "impact": "Low", "confidence": "Medium" }, @@ -37514,16 +54162,17 @@ "elements": [ { "type": "function", - "name": "withdrawAndRepay", + "name": "preCheck", "source_mapping": { - "start": 8510, - "length": 786, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3552, + "length": 1277, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227 + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 ], "starting_column": 5, "ending_column": 6 @@ -37531,225 +54180,134 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "withdrawAndRepay(uint256)" - } - }, - { - "type": "node", - "name": "(daiAvailable,chi) = _checkpointDaiBalance()", - "source_mapping": { - "start": 8691, - "length": 63, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [217], - "starting_column": 9, - "ending_column": 72 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "withdrawAndRepay", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 8510, - "length": 786, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "withdrawAndRepay(uint256)" + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205 + ], + "starting_column": 1, + "ending_column": 2 } - } - }, - "additional_fields": { "underlying_type": "external_calls" } + }, + "signature": "preCheck(address,uint256)" + } }, { "type": "node", - "name": "chi = pot.drip()", + "name": "_nextBucketIndex != _currentBucketIndex", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3972, + "length": 39, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [142], - "starting_column": 9, - "ending_column": 69 + "lines": [96], + "starting_column": 13, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "preCheck", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3552, + "length": 1277, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [ + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_checkpointChi()" + "signature": "preCheck(address,uint256)" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + } }, { "type": "node", - "name": "_dsrWithdrawal(sharesAmount,withdrawalAmount)", + "name": "_minBucketResetIndex < _nextBucketIndex", "source_mapping": { - "start": 9026, - "length": 46, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 4181, + "length": 39, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [222], - "starting_column": 9, - "ending_column": 55 + "lines": [100], + "starting_column": 24, + "ending_column": 63 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawAndRepay", + "name": "preCheck", "source_mapping": { - "start": 8510, - "length": 786, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 3552, + "length": 1277, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227 + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117 ], "starting_column": 5, "ending_column": 6 @@ -37757,302 +54315,319 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "withdrawAndRepay(uint256)" + "signature": "preCheck(address,uint256)" } } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, + } + } + ], + "description": "TempleCircuitBreakerAllUsersPerPeriod.preCheck(address,uint256) (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#89-117) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _nextBucketIndex != _currentBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#96)\n\t- _minBucketResetIndex < _nextBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#100)\n", + "markdown": "[TempleCircuitBreakerAllUsersPerPeriod.preCheck(address,uint256)](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L89-L117) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_nextBucketIndex != _currentBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L96)\n\t- [_minBucketResetIndex < _nextBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L100)\n", + "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L89-L117", + "id": "080fc01692d6234533b35c64ebb6efb9506e8defa98bc2809f7c873c4c084550", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "pot.exit(sharesAmount)", + "type": "function", + "name": "_getMinBucketResetIndex", "source_mapping": { - "start": 11598, - "length": 22, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5648, + "length": 406, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [279], - "starting_column": 9, - "ending_column": 31 + "lines": [140, 141, 142, 143, 144, 145], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "_dsrWithdrawal", + "type": "contract", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205 + ], + "starting_column": 1, + "ending_column": 2 } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + "signature": "_getMinBucketResetIndex(uint32,uint32,uint32)" + } }, { "type": "node", - "name": "daiJoin.exit(address(this),daiAmount)", + "name": "_currentBucketIndex < _oneperiodDurationAgoIndex", "source_mapping": { - "start": 11630, - "length": 38, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5916, + "length": 121, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [280], - "starting_column": 9, - "ending_column": 47 + "lines": [143], + "starting_column": 13, + "ending_column": 134 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "_getMinBucketResetIndex", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 5648, + "length": 406, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [140, 141, 142, 143, 144, 145], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "_getMinBucketResetIndex(uint32,uint32,uint32)" } } + } + } + ], + "description": "TempleCircuitBreakerAllUsersPerPeriod._getMinBucketResetIndex(uint32,uint32,uint32) (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#140-145) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _currentBucketIndex < _oneperiodDurationAgoIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#143)\n", + "markdown": "[TempleCircuitBreakerAllUsersPerPeriod._getMinBucketResetIndex(uint32,uint32,uint32)](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L140-L145) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_currentBucketIndex < _oneperiodDurationAgoIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L143)\n", + "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L140-L145", + "id": "62847204845cb0c8231dae0ccd651ab847da9f27624c490709e49b40f8c0793c", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "currentUtilisation", + "source_mapping": { + "start": 6153, + "length": 910, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "is_dependency": false, + "lines": [ + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169 + ], + "starting_column": 5, + "ending_column": 6 }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleCircuitBreakerAllUsersPerPeriod", + "source_mapping": { + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentUtilisation()" + } }, { "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "name": "_nextBucketIndex != _currentBucketIndex", "source_mapping": { - "start": 11678, - "length": 28, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6626, + "length": 39, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [281], - "starting_column": 9, - "ending_column": 37 + "lines": [159], + "starting_column": 13, + "ending_column": 52 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "currentUtilisation", "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6153, + "length": 910, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [ + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "currentUtilisation()" } } - }, - "additional_fields": { "underlying_type": "event" } + } }, { "type": "node", - "name": "_dsrWithdrawal(sharesAmount,withdrawalAmount)", + "name": "_minBucketResetIndex < _nextBucketIndex", "source_mapping": { - "start": 9026, - "length": 46, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6834, + "length": 39, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, - "lines": [222], - "starting_column": 9, - "ending_column": 55 + "lines": [162], + "starting_column": 24, + "ending_column": 63 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawAndRepay", + "name": "currentUtilisation", "source_mapping": { - "start": 8510, - "length": 786, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 6153, + "length": 910, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227 + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169 ], "starting_column": 5, "ending_column": 6 @@ -38060,55 +54635,45 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleCircuitBreakerAllUsersPerPeriod", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1480, + "length": 6866, + "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205 ], "starting_column": 1, - "ending_column": 0 + "ending_column": 2 } }, - "signature": "withdrawAndRepay(uint256)" + "signature": "currentUtilisation()" } } - }, - "additional_fields": { "underlying_type": "event" } + } } ], - "description": "Reentrancy in DsrBaseStrategy.withdrawAndRepay(uint256) (contracts/v2/strategies/DsrBaseStrategy.sol#214-227):\n\tExternal calls:\n\t- (daiAvailable,chi) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#217)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAmount,withdrawalAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#222)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAmount,withdrawalAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#222)\n", - "markdown": "Reentrancy in [DsrBaseStrategy.withdrawAndRepay(uint256)](contracts/v2/strategies/DsrBaseStrategy.sol#L214-L227):\n\tExternal calls:\n\t- [(daiAvailable,chi) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L217)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAmount,withdrawalAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L222)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAmount,withdrawalAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L222)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L214-L227", - "id": "38cb9f382307934e51255ca3f7d7f51604f44bc46a20af75d7f155182cf9bb95", - "check": "reentrancy-events", + "description": "TempleCircuitBreakerAllUsersPerPeriod.currentUtilisation() (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#150-169) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _nextBucketIndex != _currentBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#159)\n\t- _minBucketResetIndex < _nextBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#162)\n", + "markdown": "[TempleCircuitBreakerAllUsersPerPeriod.currentUtilisation()](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L150-L169) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_nextBucketIndex != _currentBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L159)\n\t- [_minBucketResetIndex < _nextBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L162)\n", + "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L150-L169", + "id": "824d28da623fc8596a1354a4d1ea1765d521fc6a1fdeae63acbc756dfbc451ed", + "check": "timestamp", "impact": "Low", "confidence": "Medium" }, @@ -38116,15 +54681,15 @@ "elements": [ { "type": "function", - "name": "withdrawAndRepayAll", + "name": "latestDsrBalance", "source_mapping": { - "start": 9413, - "length": 465, + "start": 4931, + "length": 510, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "lines": [129, 130, 131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, "ending_column": 6 }, @@ -38133,7 +54698,7 @@ "type": "contract", "name": "DsrBaseStrategy", "source_mapping": { - "start": 1041, + "start": 1042, "length": 11745, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", @@ -38166,335 +54731,35 @@ "ending_column": 0 } }, - "signature": "withdrawAndRepayAll()" + "signature": "latestDsrBalance()" } }, { "type": "node", - "name": "(daiAvailable,sharesAvailable) = _checkpointDaiBalance()", - "source_mapping": { - "start": 9500, - "length": 74, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [233], - "starting_column": 9, - "ending_column": 83 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "withdrawAndRepayAll", - "source_mapping": { - "start": 9413, - "length": 465, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "withdrawAndRepayAll()" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "chi = pot.drip()", - "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [142], - "starting_column": 9, - "ending_column": 69 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "_checkpointChi", - "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [140, 141, 142, 143], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_checkpointChi()" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { - "type": "node", - "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", - "source_mapping": { - "start": 9584, - "length": 45, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [234], - "starting_column": 9, - "ending_column": 54 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "withdrawAndRepayAll", - "source_mapping": { - "start": 9413, - "length": 465, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "withdrawAndRepayAll()" - } - } - }, - "additional_fields": { "underlying_type": "external_calls" } - }, - { - "type": "node", - "name": "pot.exit(sharesAmount)", - "source_mapping": { - "start": 11598, - "length": 22, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [279], - "starting_column": 9, - "ending_column": 31 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "_dsrWithdrawal", - "source_mapping": { - "start": 11514, - "length": 199, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [278, 279, 280, 281, 282], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_dsrWithdrawal(uint256,uint256)" - } - } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, - { - "type": "node", - "name": "daiJoin.exit(address(this),daiAmount)", + "name": "(block.timestamp > rho)", "source_mapping": { - "start": 11630, - "length": 38, + "start": 5274, + "length": 109, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [280], + "lines": [136], "starting_column": 9, - "ending_column": 47 + "ending_column": 118 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_dsrWithdrawal", + "name": "latestDsrBalance", "source_mapping": { - "start": 11514, - "length": 199, + "start": 4931, + "length": 510, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], + "lines": [129, 130, 131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, "ending_column": 6 }, @@ -38503,7 +54768,7 @@ "type": "contract", "name": "DsrBaseStrategy", "source_mapping": { - "start": 1041, + "start": 1042, "length": 11745, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", @@ -38538,113 +54803,103 @@ "ending_column": 0 } }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "signature": "latestDsrBalance()" } } - }, - "additional_fields": { "underlying_type": "external_calls_sending_eth" } - }, + } + } + ], + "description": "DsrBaseStrategy.latestDsrBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#129-138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- (block.timestamp > rho) (contracts/v2/strategies/DsrBaseStrategy.sol#136)\n", + "markdown": "[DsrBaseStrategy.latestDsrBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L129-L138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [(block.timestamp > rho)](contracts/v2/strategies/DsrBaseStrategy.sol#L136)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L129-L138", + "id": "5d10ceb2f5b13a3f1d386bd3ffb62d9e64d57500eb9ce74496832fa8d54f7c5e", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "DaiWithdrawn(daiAmount)", + "type": "function", + "name": "_checkpointChi", "source_mapping": { - "start": 11678, - "length": 28, + "start": 5447, + "length": 188, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [281], - "starting_column": 9, - "ending_column": 37 + "lines": [140, 141, 142, 143], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "_dsrWithdrawal", + "type": "contract", + "name": "DsrBaseStrategy", "source_mapping": { - "start": 11514, - "length": 199, + "start": 1042, + "length": 11745, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [278, 279, 280, 281, 282], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "DsrBaseStrategy", - "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", - "is_dependency": false, - "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "_dsrWithdrawal(uint256,uint256)" + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + ], + "starting_column": 1, + "ending_column": 0 } - } - }, - "additional_fields": { "underlying_type": "event" } + }, + "signature": "_checkpointChi()" + } }, { "type": "node", - "name": "_dsrWithdrawal(sharesAvailable,daiAvailable)", + "name": "(block.timestamp > pot.rho())", "source_mapping": { - "start": 9584, - "length": 45, + "start": 5568, + "length": 60, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [234], + "lines": [142], "starting_column": 9, - "ending_column": 54 + "ending_column": 69 }, "type_specific_fields": { "parent": { "type": "function", - "name": "withdrawAndRepayAll", + "name": "_checkpointChi", "source_mapping": { - "start": 9413, - "length": 465, + "start": 5447, + "length": 188, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", "is_dependency": false, - "lines": [232, 233, 234, 235, 236, 237, 238, 239, 240], + "lines": [140, 141, 142, 143], "starting_column": 5, "ending_column": 6 }, @@ -38653,7 +54908,7 @@ "type": "contract", "name": "DsrBaseStrategy", "source_mapping": { - "start": 1041, + "start": 1042, "length": 11745, "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", @@ -38688,18 +54943,17 @@ "ending_column": 0 } }, - "signature": "withdrawAndRepayAll()" + "signature": "_checkpointChi()" } } - }, - "additional_fields": { "underlying_type": "event" } + } } ], - "description": "Reentrancy in DsrBaseStrategy.withdrawAndRepayAll() (contracts/v2/strategies/DsrBaseStrategy.sol#232-240):\n\tExternal calls:\n\t- (daiAvailable,sharesAvailable) = _checkpointDaiBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#233)\n\t\t- chi = pot.drip() (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#234)\n\t\t- pot.exit(sharesAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#279)\n\t\t- daiJoin.exit(address(this),daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#280)\n\tEvent emitted after the call(s):\n\t- DaiWithdrawn(daiAmount) (contracts/v2/strategies/DsrBaseStrategy.sol#281)\n\t\t- _dsrWithdrawal(sharesAvailable,daiAvailable) (contracts/v2/strategies/DsrBaseStrategy.sol#234)\n", - "markdown": "Reentrancy in [DsrBaseStrategy.withdrawAndRepayAll()](contracts/v2/strategies/DsrBaseStrategy.sol#L232-L240):\n\tExternal calls:\n\t- [(daiAvailable,sharesAvailable) = _checkpointDaiBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L233)\n\t\t- [chi = pot.drip()](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L234)\n\t\t- [pot.exit(sharesAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L279)\n\t\t- [daiJoin.exit(address(this),daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L280)\n\tEvent emitted after the call(s):\n\t- [DaiWithdrawn(daiAmount)](contracts/v2/strategies/DsrBaseStrategy.sol#L281)\n\t\t- [_dsrWithdrawal(sharesAvailable,daiAvailable)](contracts/v2/strategies/DsrBaseStrategy.sol#L234)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L232-L240", - "id": "4ba8e3c4596e10b0920e312a0648a8fa3ef9456ad23cffc62074dc7f78916f68", - "check": "reentrancy-events", + "description": "DsrBaseStrategy._checkpointChi() (contracts/v2/strategies/DsrBaseStrategy.sol#140-143) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- (block.timestamp > pot.rho()) (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n", + "markdown": "[DsrBaseStrategy._checkpointChi()](contracts/v2/strategies/DsrBaseStrategy.sol#L140-L143) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [(block.timestamp > pot.rho())](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n", + "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L140-L143", + "id": "5cfe72c68305dea88c7c4193956094120fcd3b9c0b3634e1ae80f5a9b13cb40e", + "check": "timestamp", "impact": "Low", "confidence": "Medium" }, @@ -38707,121 +54961,237 @@ "elements": [ { "type": "function", - "name": "_update", + "name": "_initDebtTokenCache", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 24265, + "length": 1450, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "_initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)" } }, { "type": "node", - "name": "timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0", + "name": "_timeElapsed > 0", "source_mapping": { - "start": 3460, - "length": 51, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 25127, + "length": 16, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [84], + "lines": [640], "starting_column": 13, - "ending_column": 64 + "ending_column": 29 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_update", + "name": "_initDebtTokenCache", "source_mapping": { - "start": 3107, - "length": 847, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 24265, + "length": 1450, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], + "lines": [ + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleUniswapV2Pair", + "name": "TempleLineOfCredit", "source_mapping": { - "start": 440, - "length": 8733, - "filename_relative": "contracts/amm/TempleUniswapV2Pair.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/amm/TempleUniswapV2Pair.sol", - "filename_short": "contracts/amm/TempleUniswapV2Pair.sol", + "start": 1495, + "length": 31267, + "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_update(uint256,uint256,uint112,uint112)" + "signature": "_initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)" } } } } ], - "description": "TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112) (contracts/amm/TempleUniswapV2Pair.sol#80-93) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0 (contracts/amm/TempleUniswapV2Pair.sol#84)\n", - "markdown": "[TempleUniswapV2Pair._update(uint256,uint256,uint112,uint112)](contracts/amm/TempleUniswapV2Pair.sol#L80-L93) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0](contracts/amm/TempleUniswapV2Pair.sol#L84)\n", - "first_markdown_element": "contracts/amm/TempleUniswapV2Pair.sol#L80-L93", - "id": "3e4c1fb2f0df938570805f2a5513be58a1af7dd63232a6822178ed2775dc9957", + "description": "TempleLineOfCredit._initDebtTokenCache(TempleLineOfCredit.DebtTokenCache) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#618-657) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#640)\n", + "markdown": "[TempleLineOfCredit._initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L618-L657) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L640)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L618-L657", + "id": "195556f3bab1a462672097b00cd1340a45349779f22a9600cb865337be81d49e", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -39603,127 +55973,496 @@ { "elements": [ { - "type": "function", - "name": "_initBaseCache", + "type": "function", + "name": "isActive", + "source_mapping": { + "start": 214, + "length": 175, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [9, 10, 11], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "isActive(IAuctionBase.EpochInfo)" + } + }, + { + "type": "node", + "name": "info.startTime <= block.timestamp && block.timestamp < info.endTime", + "source_mapping": { + "start": 308, + "length": 74, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [10], + "starting_column": 9, + "ending_column": 83 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "isActive", + "source_mapping": { + "start": 214, + "length": 175, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [9, 10, 11], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "isActive(IAuctionBase.EpochInfo)" + } + } + } + } + ], + "description": "EpochLib.isActive(IAuctionBase.EpochInfo) (contracts/templegold/EpochLib.sol#9-11) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- info.startTime <= block.timestamp && block.timestamp < info.endTime (contracts/templegold/EpochLib.sol#10)\n", + "markdown": "[EpochLib.isActive(IAuctionBase.EpochInfo)](contracts/templegold/EpochLib.sol#L9-L11) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [info.startTime <= block.timestamp && block.timestamp < info.endTime](contracts/templegold/EpochLib.sol#L10)\n", + "first_markdown_element": "contracts/templegold/EpochLib.sol#L9-L11", + "id": "276ab90114ccc0d856596b1ea4cb36eb0cf9d74e0c9ae647c97c73909cd5dda1", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "hasEnded", + "source_mapping": { + "start": 395, + "length": 139, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [13, 14, 15], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "hasEnded(IAuctionBase.EpochInfo)" + } + }, + { + "type": "node", + "name": "info.endTime <= block.timestamp", + "source_mapping": { + "start": 489, + "length": 38, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [14], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "hasEnded", + "source_mapping": { + "start": 395, + "length": 139, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [13, 14, 15], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "hasEnded(IAuctionBase.EpochInfo)" + } + } + } + } + ], + "description": "EpochLib.hasEnded(IAuctionBase.EpochInfo) (contracts/templegold/EpochLib.sol#13-15) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- info.endTime <= block.timestamp (contracts/templegold/EpochLib.sol#14)\n", + "markdown": "[EpochLib.hasEnded(IAuctionBase.EpochInfo)](contracts/templegold/EpochLib.sol#L13-L15) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [info.endTime <= block.timestamp](contracts/templegold/EpochLib.sol#L14)\n", + "first_markdown_element": "contracts/templegold/EpochLib.sol#L13-L15", + "id": "ad6abd64d8f30eb7f4e33b363faebd97d24ec0270c175fbb20072019c8a6cf52", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "hasStarted", + "source_mapping": { + "start": 540, + "length": 165, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [17, 18, 19], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "hasStarted(IAuctionBase.EpochInfo)" + } + }, + { + "type": "node", + "name": "info.startTime > 0 && block.timestamp >= info.startTime", + "source_mapping": { + "start": 636, + "length": 62, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [18], + "starting_column": 9, + "ending_column": 71 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "hasStarted", + "source_mapping": { + "start": 540, + "length": 165, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [17, 18, 19], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "EpochLib", + "source_mapping": { + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "hasStarted(IAuctionBase.EpochInfo)" + } + } + } + } + ], + "description": "EpochLib.hasStarted(IAuctionBase.EpochInfo) (contracts/templegold/EpochLib.sol#17-19) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- info.startTime > 0 && block.timestamp >= info.startTime (contracts/templegold/EpochLib.sol#18)\n", + "markdown": "[EpochLib.hasStarted(IAuctionBase.EpochInfo)](contracts/templegold/EpochLib.sol#L17-L19) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [info.startTime > 0 && block.timestamp >= info.startTime](contracts/templegold/EpochLib.sol#L18)\n", + "first_markdown_element": "contracts/templegold/EpochLib.sol#L17-L19", + "id": "f05c09bd9883269e1488898e38308ab560cda285a5755a59bc7299943ddcf3c1", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "startAuction", + "source_mapping": { + "start": 8763, + "length": 2370, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" + } + }, + { + "type": "node", + "name": "lastEpochInfo.endTime + _waitPeriod > block.timestamp", "source_mapping": { - "start": 26049, - "length": 748, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 9638, + "length": 53, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [ - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 617 - ], - "starting_column": 5, - "ending_column": 6 + "lines": [198], + "starting_column": 17, + "ending_column": 70 }, "type_specific_fields": { "parent": { - "type": "contract", - "name": "TempleDebtToken", + "type": "function", + "name": "startAuction", "source_mapping": { - "start": 2202, - "length": 30641, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 8763, + "length": 2370, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, - 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, - 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, - 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, - 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, - 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782 + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220 ], - "starting_column": 1, - "ending_column": 2 + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "startAuction()" } - }, - "signature": "_initBaseCache(TempleDebtToken.BaseCache)" + } } }, { "type": "node", - "name": "_timeElapsed > 0", + "name": "_deployTimestamp + config.waitPeriod > block.timestamp", "source_mapping": { - "start": 26435, - "length": 16, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 9793, + "length": 54, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, - "lines": [607], - "starting_column": 13, - "ending_column": 29 + "lines": [201], + "starting_column": 17, + "ending_column": 71 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_initBaseCache", + "name": "startAuction", "source_mapping": { - "start": 26049, - "length": 748, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 8763, + "length": 2370, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 617 + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220 ], "starting_column": 5, "ending_column": 6 @@ -39731,91 +56470,69 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleDebtToken", + "name": "SpiceAuction", "source_mapping": { - "start": 2202, - "length": 30641, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", "is_dependency": false, "lines": [ - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, - 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, - 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, - 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, - 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, - 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782 + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_initBaseCache(TempleDebtToken.BaseCache)" + "signature": "startAuction()" } } } } ], - "description": "TempleDebtToken._initBaseCache(TempleDebtToken.BaseCache) (contracts/v2/TempleDebtToken.sol#597-617) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/TempleDebtToken.sol#607)\n", - "markdown": "[TempleDebtToken._initBaseCache(TempleDebtToken.BaseCache)](contracts/v2/TempleDebtToken.sol#L597-L617) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/TempleDebtToken.sol#L607)\n", - "first_markdown_element": "contracts/v2/TempleDebtToken.sol#L597-L617", - "id": "31468fb88b544bfa40953f9c670145ae2d6cc30a857f141027542b78efe5314e", + "description": "SpiceAuction.startAuction() (contracts/templegold/SpiceAuction.sol#184-220) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- lastEpochInfo.endTime + _waitPeriod > block.timestamp (contracts/templegold/SpiceAuction.sol#198)\n\t- _deployTimestamp + config.waitPeriod > block.timestamp (contracts/templegold/SpiceAuction.sol#201)\n", + "markdown": "[SpiceAuction.startAuction()](contracts/templegold/SpiceAuction.sol#L184-L220) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [lastEpochInfo.endTime + _waitPeriod > block.timestamp](contracts/templegold/SpiceAuction.sol#L198)\n\t- [_deployTimestamp + config.waitPeriod > block.timestamp](contracts/templegold/SpiceAuction.sol#L201)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L184-L220", + "id": "f871fc30e4756d5a5186c9ba80d6f47e25a4516706d987c89d53be0047ceb802", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -39824,20 +56541,17 @@ "elements": [ { "type": "function", - "name": "_initDebtorCache", + "name": "startAuction", "source_mapping": { - "start": 28507, - "length": 2281, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, - 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727 + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 ], "starting_column": 5, "ending_column": 6 @@ -39845,111 +56559,75 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleDebtToken", + "name": "StableGoldAuction", "source_mapping": { - "start": 2202, - "length": 30641, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, - 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, - 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, - 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, - 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, - 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782 + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)" + "signature": "startAuction()" } }, { "type": "node", - "name": "_timeElapsed > 0", + "name": "currentEpochCache > 0 && (prevAuctionInfo.endTime + config.auctionsTimeDiff > block.timestamp)", "source_mapping": { - "start": 29667, - "length": 16, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 5271, + "length": 94, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, - "lines": [703], + "lines": [115], "starting_column": 13, - "ending_column": 29 + "ending_column": 107 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_initDebtorCache", + "name": "startAuction", "source_mapping": { - "start": 28507, - "length": 2281, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 4772, + "length": 1438, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ - 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, - 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727 + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 ], "starting_column": 5, "ending_column": 6 @@ -39957,15 +56635,16 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleDebtToken", + "name": "StableGoldAuction", "source_mapping": { - "start": 2202, - "length": 30641, - "filename_relative": "contracts/v2/TempleDebtToken.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TempleDebtToken.sol", - "filename_short": "contracts/v2/TempleDebtToken.sol", + "start": 1304, + "length": 13566, + "filename_relative": "contracts/templegold/StableGoldAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/StableGoldAuction.sol", + "filename_short": "contracts/templegold/StableGoldAuction.sol", "is_dependency": false, "lines": [ + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, @@ -39990,58 +56669,22 @@ 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, - 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, - 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, - 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, - 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, - 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, - 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, - 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782 + 339, 340, 341, 342, 343 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)" + "signature": "startAuction()" } } } } ], - "description": "TempleDebtToken._initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool) (contracts/v2/TempleDebtToken.sol#672-727) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/TempleDebtToken.sol#703)\n", - "markdown": "[TempleDebtToken._initDebtorCache(TempleDebtToken.BaseCache,ITempleDebtToken.Debtor,TempleDebtToken.DebtorCache,bool)](contracts/v2/TempleDebtToken.sol#L672-L727) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/TempleDebtToken.sol#L703)\n", - "first_markdown_element": "contracts/v2/TempleDebtToken.sol#L672-L727", - "id": "a6d589cd4caf5ac6f228dd6218ef29c77e92ed66db618140855c2644b3b2cb10", + "description": "StableGoldAuction.startAuction() (contracts/templegold/StableGoldAuction.sol#107-132) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- currentEpochCache > 0 && (prevAuctionInfo.endTime + config.auctionsTimeDiff > block.timestamp) (contracts/templegold/StableGoldAuction.sol#115)\n", + "markdown": "[StableGoldAuction.startAuction()](contracts/templegold/StableGoldAuction.sol#L107-L132) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [currentEpochCache > 0 && (prevAuctionInfo.endTime + config.auctionsTimeDiff > block.timestamp)](contracts/templegold/StableGoldAuction.sol#L115)\n", + "first_markdown_element": "contracts/templegold/StableGoldAuction.sol#L107-L132", + "id": "4d4d9095c46a15e281b7ddf30d05686a1a3217e61cbec65c35017cc9aca4f96b", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -40050,117 +56693,150 @@ "elements": [ { "type": "function", - "name": "treasuryPriceIndex", + "name": "setVestingFactor", "source_mapping": { - "start": 3360, - "length": 506, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102], + "lines": [131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, - "ending_column": 7 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGold", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168 - ], - "starting_column": 1, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, "ending_column": 0 } }, - "signature": "treasuryPriceIndex()" + "signature": "setVestingFactor(ITempleGold.VestingFactor)" } }, { "type": "node", - "name": "_now >= tpiData.targetTime", + "name": "lastMintTimestamp == 0", "source_mapping": { - "start": 3489, - "length": 26, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 6477, + "length": 22, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [93], + "lines": [134], "starting_column": 13, - "ending_column": 39 + "ending_column": 35 }, "type_specific_fields": { "parent": { "type": "function", - "name": "treasuryPriceIndex", + "name": "setVestingFactor", "source_mapping": { - "start": 3360, - "length": 506, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 6218, + "length": 465, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102], + "lines": [131, 132, 133, 134, 135, 136, 137, 138], "starting_column": 5, - "ending_column": 7 + "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGold", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", - "is_dependency": false, - "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168 + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "treasuryPriceIndex()" + "signature": "setVestingFactor(ITempleGold.VestingFactor)" } } } } ], - "description": "TreasuryPriceIndexOracle.treasuryPriceIndex() (contracts/v2/TreasuryPriceIndexOracle.sol#91-102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _now >= tpiData.targetTime (contracts/v2/TreasuryPriceIndexOracle.sol#93)\n", - "markdown": "[TreasuryPriceIndexOracle.treasuryPriceIndex()](contracts/v2/TreasuryPriceIndexOracle.sol#L91-L102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_now >= tpiData.targetTime](contracts/v2/TreasuryPriceIndexOracle.sol#L93)\n", - "first_markdown_element": "contracts/v2/TreasuryPriceIndexOracle.sol#L91-L102", - "id": "dcebf3facc4c98e108c10f0f26715243d17dae7f03135b42c4924ec730f84c8a", + "description": "TempleGold.setVestingFactor(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#131-138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- lastMintTimestamp == 0 (contracts/templegold/TempleGold.sol#134)\n", + "markdown": "[TempleGold.setVestingFactor(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L131-L138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [lastMintTimestamp == 0](contracts/templegold/TempleGold.sol#L134)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L131-L138", + "id": "3c0f2bee01d5f58473ddd92820fd422e50e8d0fa6dbca41fdb0a15d943a42ae7", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -40169,17 +56845,17 @@ "elements": [ { "type": "function", - "name": "setTreasuryPriceIndexAt", + "name": "_getMintAmount", "source_mapping": { - "start": 5557, - "length": 1362, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 11499, + "length": 895, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274 ], "starting_column": 5, "ending_column": 6 @@ -40187,62 +56863,78 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGold", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168 - ], - "starting_column": 1, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 + ], + "starting_column": 2, "ending_column": 0 } }, - "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + "signature": "_getMintAmount(ITempleGold.VestingFactor)" } }, { "type": "node", - "name": "targetTime < _now + minTreasuryPriceIndexTargetTimeDelta", + "name": "_lastMintTimestamp == 0", "source_mapping": { - "start": 5929, - "length": 56, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 11787, + "length": 23, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [147], + "lines": [262], "starting_column": 13, - "ending_column": 69 + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTreasuryPriceIndexAt", + "name": "_getMintAmount", "source_mapping": { - "start": 5557, - "length": 1362, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 11499, + "length": 895, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274 ], "starting_column": 5, "ending_column": 6 @@ -40250,65 +56942,82 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGold", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + "signature": "_getMintAmount(ITempleGold.VestingFactor)" } } } }, { "type": "node", - "name": "_absDelta > maxTreasuryPriceIndexDelta", + "name": "circulatingSupplyCache + mintAmount > MAX_CIRCULATING_SUPPLY", "source_mapping": { - "start": 6271, - "length": 38, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 12199, + "length": 60, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, - "lines": [152], + "lines": [269], "starting_column": 13, - "ending_column": 51 + "ending_column": 73 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTreasuryPriceIndexAt", + "name": "_getMintAmount", "source_mapping": { - "start": 5557, - "length": 1362, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 11499, + "length": 895, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274 ], "starting_column": 5, "ending_column": 6 @@ -40316,174 +57025,238 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGold", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1890, + "length": 16064, + "filename_relative": "contracts/templegold/TempleGold.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGold.sol", + "filename_short": "contracts/templegold/TempleGold.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168 + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388 ], - "starting_column": 1, + "starting_column": 2, "ending_column": 0 } }, - "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + "signature": "_getMintAmount(ITempleGold.VestingFactor)" } } } - }, + } + ], + "description": "TempleGold._getMintAmount(ITempleGold.VestingFactor) (contracts/templegold/TempleGold.sol#259-274) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _lastMintTimestamp == 0 (contracts/templegold/TempleGold.sol#262)\n\t- circulatingSupplyCache + mintAmount > MAX_CIRCULATING_SUPPLY (contracts/templegold/TempleGold.sol#269)\n", + "markdown": "[TempleGold._getMintAmount(ITempleGold.VestingFactor)](contracts/templegold/TempleGold.sol#L259-L274) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_lastMintTimestamp == 0](contracts/templegold/TempleGold.sol#L262)\n\t- [circulatingSupplyCache + mintAmount > MAX_CIRCULATING_SUPPLY](contracts/templegold/TempleGold.sol#L269)\n", + "first_markdown_element": "contracts/templegold/TempleGold.sol#L259-L274", + "id": "48aa8084dbb411d6e790f65366cf669856bd3c50453587995695cf1abcaac5ca", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "_absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange", + "type": "function", + "name": "setRewardDuration", "source_mapping": { - "start": 6461, - "length": 55, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 4189, + "length": 424, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [154], - "starting_column": 13, - "ending_column": 68 + "lines": [95, 96, 97, 98, 99, 100, 101, 102], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "setTreasuryPriceIndexAt", + "type": "contract", + "name": "TempleGoldStaking", "source_mapping": { - "start": 5557, - "length": 1362, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TreasuryPriceIndexOracle", - "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", - "is_dependency": false, - "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "setRewardDuration(uint256)" } }, { "type": "node", - "name": "_tpiDelta < 0", + "name": "rewardData.periodFinish >= block.timestamp", "source_mapping": { - "start": 6180, - "length": 77, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 4454, + "length": 42, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [151], - "starting_column": 9, - "ending_column": 86 + "lines": [99], + "starting_column": 13, + "ending_column": 55 }, "type_specific_fields": { "parent": { "type": "function", - "name": "setTreasuryPriceIndexAt", + "name": "setRewardDuration", "source_mapping": { - "start": 5557, - "length": 1362, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 4189, + "length": 424, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 - ], + "lines": [95, 96, 97, 98, 99, 100, 101, 102], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TreasuryPriceIndexOracle", + "name": "TempleGoldStaking", "source_mapping": { - "start": 556, - "length": 6366, - "filename_relative": "contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryPriceIndexOracle.sol", - "filename_short": "contracts/v2/TreasuryPriceIndexOracle.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "setTreasuryPriceIndexAt(uint96,uint32)" + "signature": "setRewardDuration(uint256)" } } } } ], - "description": "TreasuryPriceIndexOracle.setTreasuryPriceIndexAt(uint96,uint32) (contracts/v2/TreasuryPriceIndexOracle.sol#141-165) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- targetTime < _now + minTreasuryPriceIndexTargetTimeDelta (contracts/v2/TreasuryPriceIndexOracle.sol#147)\n\t- _absDelta > maxTreasuryPriceIndexDelta (contracts/v2/TreasuryPriceIndexOracle.sol#152)\n\t- _absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange (contracts/v2/TreasuryPriceIndexOracle.sol#154)\n\t- _tpiDelta < 0 (contracts/v2/TreasuryPriceIndexOracle.sol#151)\n", - "markdown": "[TreasuryPriceIndexOracle.setTreasuryPriceIndexAt(uint96,uint32)](contracts/v2/TreasuryPriceIndexOracle.sol#L141-L165) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [targetTime < _now + minTreasuryPriceIndexTargetTimeDelta](contracts/v2/TreasuryPriceIndexOracle.sol#L147)\n\t- [_absDelta > maxTreasuryPriceIndexDelta](contracts/v2/TreasuryPriceIndexOracle.sol#L152)\n\t- [_absRateOfChange > maxAbsTreasuryPriceIndexRateOfChange](contracts/v2/TreasuryPriceIndexOracle.sol#L154)\n\t- [_tpiDelta < 0](contracts/v2/TreasuryPriceIndexOracle.sol#L151)\n", - "first_markdown_element": "contracts/v2/TreasuryPriceIndexOracle.sol#L141-L165", - "id": "82ebcf3bc2dce9c3d152ebad5a046d541a691e4433e02c30cdf82fd82beef3d7", + "description": "TempleGoldStaking.setRewardDuration(uint256) (contracts/templegold/TempleGoldStaking.sol#95-102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- rewardData.periodFinish >= block.timestamp (contracts/templegold/TempleGoldStaking.sol#99)\n", + "markdown": "[TempleGoldStaking.setRewardDuration(uint256)](contracts/templegold/TempleGoldStaking.sol#L95-L102) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [rewardData.periodFinish >= block.timestamp](contracts/templegold/TempleGoldStaking.sol#L99)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L95-L102", + "id": "f49e9adf9dac0bd97461926dad31baadd48572a9e25a0efbe33e8ceefaeaa254", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -40492,17 +57265,16 @@ "elements": [ { "type": "function", - "name": "preCheck", + "name": "distributeRewards", "source_mapping": { - "start": 3551, - "length": 1277, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 ], "starting_column": 5, "ending_column": 6 @@ -40510,179 +57282,343 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "preCheck(address,uint256)" + "signature": "distributeRewards()" } }, { "type": "node", - "name": "_nextBucketIndex != _currentBucketIndex", + "name": "lastRewardNotificationTimestamp + rewardDistributionCoolDown > block.timestamp", "source_mapping": { - "start": 3971, - "length": 39, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 7658, + "length": 78, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [96], + "lines": [176], "starting_column": 13, - "ending_column": 52 + "ending_column": 91 }, "type_specific_fields": { "parent": { "type": "function", - "name": "preCheck", + "name": "distributeRewards", "source_mapping": { - "start": 3551, - "length": 1277, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 7353, + "length": 765, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117 + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "distributeRewards()" + } + } + } + } + ], + "description": "TempleGoldStaking.distributeRewards() (contracts/templegold/TempleGoldStaking.sol#172-184) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- lastRewardNotificationTimestamp + rewardDistributionCoolDown > block.timestamp (contracts/templegold/TempleGoldStaking.sol#176)\n", + "markdown": "[TempleGoldStaking.distributeRewards()](contracts/templegold/TempleGoldStaking.sol#L172-L184) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [lastRewardNotificationTimestamp + rewardDistributionCoolDown > block.timestamp](contracts/templegold/TempleGoldStaking.sol#L176)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L172-L184", + "id": "1af5702027c6b1d58aa6c5dc7b81d764340862ef56f9cbdea4471eea7c820c7a", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "withdraw", + "source_mapping": { + "start": 11050, + "length": 427, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [264, 265, 266, 267, 268, 269], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", - "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "is_dependency": false, - "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "preCheck(address,uint256)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "withdraw(uint256,bool)" } }, { "type": "node", - "name": "_minBucketResetIndex < _nextBucketIndex", + "name": "unstakeTime > block.timestamp", "source_mapping": { - "start": 4180, - "length": 39, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 11303, + "length": 29, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [100], - "starting_column": 24, - "ending_column": 63 + "lines": [267], + "starting_column": 13, + "ending_column": 42 }, "type_specific_fields": { "parent": { "type": "function", - "name": "preCheck", + "name": "withdraw", "source_mapping": { - "start": 3551, - "length": 1277, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 11050, + "length": 427, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117 - ], + "lines": [264, 265, 266, 267, 268, 269], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "preCheck(address,uint256)" + "signature": "withdraw(uint256,bool)" } } } } ], - "description": "TempleCircuitBreakerAllUsersPerPeriod.preCheck(address,uint256) (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#89-117) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _nextBucketIndex != _currentBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#96)\n\t- _minBucketResetIndex < _nextBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#100)\n", - "markdown": "[TempleCircuitBreakerAllUsersPerPeriod.preCheck(address,uint256)](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L89-L117) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_nextBucketIndex != _currentBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L96)\n\t- [_minBucketResetIndex < _nextBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L100)\n", - "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L89-L117", - "id": "080fc01692d6234533b35c64ebb6efb9506e8defa98bc2809f7c873c4c084550", + "description": "TempleGoldStaking.withdraw(uint256,bool) (contracts/templegold/TempleGoldStaking.sol#264-269) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- unstakeTime > block.timestamp (contracts/templegold/TempleGoldStaking.sol#267)\n", + "markdown": "[TempleGoldStaking.withdraw(uint256,bool)](contracts/templegold/TempleGoldStaking.sol#L264-L269) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [unstakeTime > block.timestamp](contracts/templegold/TempleGoldStaking.sol#L267)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L264-L269", + "id": "9975c7ce2d79c86ed5e3df740636ad07134167978139e35124787f6d6afc3e8c", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -40691,121 +57627,177 @@ "elements": [ { "type": "function", - "name": "_getMinBucketResetIndex", + "name": "getAccountUnstakeTime", "source_mapping": { - "start": 5647, - "length": 406, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 13201, + "length": 181, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [140, 141, 142, 143, 144, 145], + "lines": [331, 332, 333], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_getMinBucketResetIndex(uint32,uint32,uint32)" + "signature": "getAccountUnstakeTime(address)" } }, { "type": "node", - "name": "_currentBucketIndex < _oneperiodDurationAgoIndex", + "name": "stakeTimes[account] == 0", "source_mapping": { - "start": 5915, - "length": 121, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 13300, + "length": 75, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [143], - "starting_column": 13, - "ending_column": 134 + "lines": [332], + "starting_column": 9, + "ending_column": 84 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_getMinBucketResetIndex", + "name": "getAccountUnstakeTime", "source_mapping": { - "start": 5647, - "length": 406, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 13201, + "length": 181, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [140, 141, 142, 143, 144, 145], + "lines": [331, 332, 333], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "_getMinBucketResetIndex(uint32,uint32,uint32)" + "signature": "getAccountUnstakeTime(address)" } } } } ], - "description": "TempleCircuitBreakerAllUsersPerPeriod._getMinBucketResetIndex(uint32,uint32,uint32) (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#140-145) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _currentBucketIndex < _oneperiodDurationAgoIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#143)\n", - "markdown": "[TempleCircuitBreakerAllUsersPerPeriod._getMinBucketResetIndex(uint32,uint32,uint32)](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L140-L145) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_currentBucketIndex < _oneperiodDurationAgoIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L143)\n", - "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L140-L145", - "id": "62847204845cb0c8231dae0ccd651ab847da9f27624c490709e49b40f8c0793c", + "description": "TempleGoldStaking.getAccountUnstakeTime(address) (contracts/templegold/TempleGoldStaking.sol#331-333) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- stakeTimes[account] == 0 (contracts/templegold/TempleGoldStaking.sol#332)\n", + "markdown": "[TempleGoldStaking.getAccountUnstakeTime(address)](contracts/templegold/TempleGoldStaking.sol#L331-L333) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [stakeTimes[account] == 0](contracts/templegold/TempleGoldStaking.sol#L332)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L331-L333", + "id": "e7db295cd12b2f387a0fa3e4735ed290b2d7382690eecafafdef35e10d430467", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -40814,82 +57806,105 @@ "elements": [ { "type": "function", - "name": "currentUtilisation", + "name": "_rewardPerToken", "source_mapping": { - "start": 6152, - "length": 910, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 16893, + "length": 469, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [ - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169 - ], + "lines": [436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "currentUtilisation()" + "signature": "_rewardPerToken()" } }, { "type": "node", - "name": "_nextBucketIndex != _currentBucketIndex", + "name": "totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish", "source_mapping": { - "start": 6625, - "length": 39, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 16966, + "length": 72, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [159], + "lines": [437], "starting_column": 13, - "ending_column": 52 + "ending_column": 85 }, "type_specific_fields": { "parent": { "type": "function", - "name": "currentUtilisation", + "name": "_rewardPerToken", "source_mapping": { - "start": 6152, - "length": 910, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 16893, + "length": 469, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169 + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447 ], "starting_column": 5, "ending_column": 6 @@ -40897,67 +57912,184 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "currentUtilisation()" + "signature": "_rewardPerToken()" } } } + } + ], + "description": "TempleGoldStaking._rewardPerToken() (contracts/templegold/TempleGoldStaking.sol#436-447) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish (contracts/templegold/TempleGoldStaking.sol#437)\n", + "markdown": "[TempleGoldStaking._rewardPerToken()](contracts/templegold/TempleGoldStaking.sol#L436-L447) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [totalSupply == 0 || rewardData.lastUpdateTime == rewardData.periodFinish](contracts/templegold/TempleGoldStaking.sol#L437)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L436-L447", + "id": "f8d17a564dab09edb071f1ed59e182d6f794f667d7c180fc12619353bbaeb9b7", + "check": "timestamp", + "impact": "Low", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_notifyReward", + "source_mapping": { + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "TempleGoldStaking", + "source_mapping": { + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_notifyReward(uint256)" + } }, { "type": "node", - "name": "_minBucketResetIndex < _nextBucketIndex", + "name": "block.timestamp >= rewardData.periodFinish", "source_mapping": { - "start": 6833, - "length": 39, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 17483, + "length": 42, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [162], - "starting_column": 24, - "ending_column": 63 + "lines": [451], + "starting_column": 13, + "ending_column": 55 }, "type_specific_fields": { "parent": { "type": "function", - "name": "currentUtilisation", + "name": "_notifyReward", "source_mapping": { - "start": 6152, - "length": 910, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 17368, + "length": 1006, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169 + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466 ], "starting_column": 5, "ending_column": 6 @@ -40965,44 +58097,73 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleCircuitBreakerAllUsersPerPeriod", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1479, - "length": 6866, - "filename_relative": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", - "filename_short": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, - "ending_column": 2 + "ending_column": 0 } }, - "signature": "currentUtilisation()" + "signature": "_notifyReward(uint256)" } } } } ], - "description": "TempleCircuitBreakerAllUsersPerPeriod.currentUtilisation() (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#150-169) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _nextBucketIndex != _currentBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#159)\n\t- _minBucketResetIndex < _nextBucketIndex (contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#162)\n", - "markdown": "[TempleCircuitBreakerAllUsersPerPeriod.currentUtilisation()](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L150-L169) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_nextBucketIndex != _currentBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L159)\n\t- [_minBucketResetIndex < _nextBucketIndex](contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L162)\n", - "first_markdown_element": "contracts/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.sol#L150-L169", - "id": "824d28da623fc8596a1354a4d1ea1765d521fc6a1fdeae63acbc756dfbc451ed", + "description": "TempleGoldStaking._notifyReward(uint256) (contracts/templegold/TempleGoldStaking.sol#449-466) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- block.timestamp >= rewardData.periodFinish (contracts/templegold/TempleGoldStaking.sol#451)\n", + "markdown": "[TempleGoldStaking._notifyReward(uint256)](contracts/templegold/TempleGoldStaking.sol#L449-L466) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [block.timestamp >= rewardData.periodFinish](contracts/templegold/TempleGoldStaking.sol#L451)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L449-L466", + "id": "15b1ded14ad429d52c15c22f90c83b0b65e0aa71abf0723f9a6cafc62450532b", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -41011,138 +58172,177 @@ "elements": [ { "type": "function", - "name": "latestDsrBalance", + "name": "_lastTimeRewardApplicable", "source_mapping": { - "start": 4930, - "length": 510, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 18380, + "length": 214, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [129, 130, 131, 132, 133, 134, 135, 136, 137, 138], + "lines": [468, 469, 470, 471, 472, 473], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "latestDsrBalance()" + "signature": "_lastTimeRewardApplicable(uint256)" } }, { "type": "node", - "name": "(block.timestamp > rho)", + "name": "_finishTime < block.timestamp", "source_mapping": { - "start": 5273, - "length": 109, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 18482, + "length": 29, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [136], - "starting_column": 9, - "ending_column": 118 + "lines": [469], + "starting_column": 13, + "ending_column": 42 }, "type_specific_fields": { "parent": { "type": "function", - "name": "latestDsrBalance", + "name": "_lastTimeRewardApplicable", "source_mapping": { - "start": 4930, - "length": 510, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 18380, + "length": 214, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, - "lines": [129, 130, 131, 132, 133, 134, 135, 136, 137, 138], + "lines": [468, 469, 470, 471, 472, 473], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "TempleGoldStaking", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1040, + "length": 20507, + "filename_relative": "contracts/templegold/TempleGoldStaking.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldStaking.sol", + "filename_short": "contracts/templegold/TempleGoldStaking.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "latestDsrBalance()" + "signature": "_lastTimeRewardApplicable(uint256)" } } } } ], - "description": "DsrBaseStrategy.latestDsrBalance() (contracts/v2/strategies/DsrBaseStrategy.sol#129-138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- (block.timestamp > rho) (contracts/v2/strategies/DsrBaseStrategy.sol#136)\n", - "markdown": "[DsrBaseStrategy.latestDsrBalance()](contracts/v2/strategies/DsrBaseStrategy.sol#L129-L138) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [(block.timestamp > rho)](contracts/v2/strategies/DsrBaseStrategy.sol#L136)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L129-L138", - "id": "5d10ceb2f5b13a3f1d386bd3ffb62d9e64d57500eb9ce74496832fa8d54f7c5e", + "description": "TempleGoldStaking._lastTimeRewardApplicable(uint256) (contracts/templegold/TempleGoldStaking.sol#468-473) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _finishTime < block.timestamp (contracts/templegold/TempleGoldStaking.sol#469)\n", + "markdown": "[TempleGoldStaking._lastTimeRewardApplicable(uint256)](contracts/templegold/TempleGoldStaking.sol#L468-L473) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_finishTime < block.timestamp](contracts/templegold/TempleGoldStaking.sol#L469)\n", + "first_markdown_element": "contracts/templegold/TempleGoldStaking.sol#L468-L473", + "id": "428ca377314108696abd526537c67da8589396aef47e52bb36265187fc881ab3", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -41151,158 +58351,139 @@ "elements": [ { "type": "function", - "name": "_checkpointChi", + "name": "signatureSplit", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1241, + "length": 959, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SafeForked", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 463, + "length": 6708, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_checkpointChi()" + "signature": "signatureSplit(bytes,uint256)" } }, { "type": "node", - "name": "(block.timestamp > pot.rho())", + "name": "", "source_mapping": { - "start": 5567, - "length": 60, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1655, + "length": 539, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, - "lines": [142], + "lines": [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], "starting_column": 9, - "ending_column": 69 + "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_checkpointChi", + "name": "signatureSplit", "source_mapping": { - "start": 5446, - "length": 188, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 1241, + "length": 959, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, - "lines": [140, 141, 142, 143], + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "DsrBaseStrategy", + "name": "SafeForked", "source_mapping": { - "start": 1041, - "length": 11745, - "filename_relative": "contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/strategies/DsrBaseStrategy.sol", - "filename_short": "contracts/v2/strategies/DsrBaseStrategy.sol", + "start": 463, + "length": 6708, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_checkpointChi()" + "signature": "signatureSplit(bytes,uint256)" } } } } ], - "description": "DsrBaseStrategy._checkpointChi() (contracts/v2/strategies/DsrBaseStrategy.sol#140-143) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- (block.timestamp > pot.rho()) (contracts/v2/strategies/DsrBaseStrategy.sol#142)\n", - "markdown": "[DsrBaseStrategy._checkpointChi()](contracts/v2/strategies/DsrBaseStrategy.sol#L140-L143) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [(block.timestamp > pot.rho())](contracts/v2/strategies/DsrBaseStrategy.sol#L142)\n", - "first_markdown_element": "contracts/v2/strategies/DsrBaseStrategy.sol#L140-L143", - "id": "5cfe72c68305dea88c7c4193956094120fcd3b9c0b3634e1ae80f5a9b13cb40e", - "check": "timestamp", - "impact": "Low", - "confidence": "Medium" + "description": "SafeForked.signatureSplit(bytes,uint256) (contracts/v2/safeGuards/SafeForked.sol#22-46) uses assembly\n\t- INLINE ASM (contracts/v2/safeGuards/SafeForked.sol#35-45)\n", + "markdown": "[SafeForked.signatureSplit(bytes,uint256)](contracts/v2/safeGuards/SafeForked.sol#L22-L46) uses assembly\n\t- [INLINE ASM](contracts/v2/safeGuards/SafeForked.sol#L35-L45)\n", + "first_markdown_element": "contracts/v2/safeGuards/SafeForked.sol#L22-L46", + "id": "3ae97a7384e3769435f8b201c1864a124173df742b9300bf25e8a1a702a86371", + "check": "assembly", + "impact": "Informational", + "confidence": "High" }, { "elements": [ { "type": "function", - "name": "_initDebtTokenCache", + "name": "batchLiquidate", "source_mapping": { - "start": 24203, - "length": 1450, + "start": 13070, + "length": 1632, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657 + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359 ], "starting_column": 5, "ending_column": 6 @@ -41312,8 +58493,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -41382,46 +58563,45 @@ 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)" + "signature": "batchLiquidate(address[])" } }, { "type": "node", - "name": "_timeElapsed > 0", + "name": "delete allAccountsData[_account]", "source_mapping": { - "start": 25065, - "length": 16, + "start": 14085, + "length": 32, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, - "lines": [640], - "starting_column": 13, - "ending_column": 29 + "lines": [344], + "starting_column": 17, + "ending_column": 49 }, "type_specific_fields": { "parent": { "type": "function", - "name": "_initDebtTokenCache", + "name": "batchLiquidate", "source_mapping": { - "start": 24203, - "length": 1450, + "start": 13070, + "length": 1632, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "is_dependency": false, "lines": [ - 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657 + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359 ], "starting_column": 5, "ending_column": 6 @@ -41431,8 +58611,8 @@ "type": "contract", "name": "TempleLineOfCredit", "source_mapping": { - "start": 1433, - "length": 31697, + "start": 1495, + "length": 31267, "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", @@ -41507,164 +58687,231 @@ 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 + 871, 872, 873 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "_initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)" + "signature": "batchLiquidate(address[])" } } } } ], - "description": "TempleLineOfCredit._initDebtTokenCache(TempleLineOfCredit.DebtTokenCache) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#618-657) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- _timeElapsed > 0 (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#640)\n", - "markdown": "[TempleLineOfCredit._initDebtTokenCache(TempleLineOfCredit.DebtTokenCache)](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L618-L657) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [_timeElapsed > 0](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L640)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L618-L657", - "id": "195556f3bab1a462672097b00cd1340a45349779f22a9600cb865337be81d49e", - "check": "timestamp", - "impact": "Low", + "description": "TempleLineOfCredit.batchLiquidate(address[]) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#318-359) has costly operations inside a loop:\n\t- delete allAccountsData[_account] (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#344)\n", + "markdown": "[TempleLineOfCredit.batchLiquidate(address[])](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L318-L359) has costly operations inside a loop:\n\t- [delete allAccountsData[_account]](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L344)\n", + "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L318-L359", + "id": "a95c0c9dfeb348e0fd86f2f14090e1fbee931ec14c7a4d06443de73a63f4c257", + "check": "costly-loop", + "impact": "Informational", "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "signatureSplit", + "name": "continuouslyCompounded", "source_mapping": { - "start": 1240, - "length": 959, - "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", - "filename_short": "contracts/v2/safeGuards/SafeForked.sol", + "start": 558, + "length": 307, + "filename_relative": "contracts/v2/interestRate/CompoundedInterest.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/interestRate/CompoundedInterest.sol", + "filename_short": "contracts/v2/interestRate/CompoundedInterest.sol", "is_dependency": false, - "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46 - ], + "lines": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "SafeForked", + "name": "CompoundedInterest", "source_mapping": { - "start": 462, - "length": 6708, - "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", - "filename_short": "contracts/v2/safeGuards/SafeForked.sol", + "start": 240, + "length": 627, + "filename_relative": "contracts/v2/interestRate/CompoundedInterest.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/interestRate/CompoundedInterest.sol", + "filename_short": "contracts/v2/interestRate/CompoundedInterest.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "continuouslyCompounded(uint256,uint256,uint96)" + } + } + ], + "description": "CompoundedInterest.continuouslyCompounded(uint256,uint256,uint96) (contracts/v2/interestRate/CompoundedInterest.sol#17-26) is never used and should be removed\n", + "markdown": "[CompoundedInterest.continuouslyCompounded(uint256,uint256,uint96)](contracts/v2/interestRate/CompoundedInterest.sol#L17-L26) is never used and should be removed\n", + "first_markdown_element": "contracts/v2/interestRate/CompoundedInterest.sol#L17-L26", + "id": "4d6714c7a46524c31b4a35cfa63df84bbc5eb96e796397ea43be0e78632478c1", + "check": "dead-code", + "impact": "Informational", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_init", + "source_mapping": { + "start": 830, + "length": 249, + "filename_relative": "contracts/common/access/ElevatedAccess.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/common/access/ElevatedAccess.sol", + "filename_short": "contracts/common/access/ElevatedAccess.sol", + "is_dependency": false, + "lines": [26, 27, 28, 29, 30], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ElevatedAccess", + "source_mapping": { + "start": 364, + "length": 2934, + "filename_relative": "contracts/common/access/ElevatedAccess.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/common/access/ElevatedAccess.sol", + "filename_short": "contracts/common/access/ElevatedAccess.sol", "is_dependency": false, "lines": [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131 + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "signatureSplit(bytes,uint256)" + "signature": "_init(address)" } - }, + } + ], + "description": "ElevatedAccess._init(address) (contracts/common/access/ElevatedAccess.sol#26-30) is never used and should be removed\n", + "markdown": "[ElevatedAccess._init(address)](contracts/common/access/ElevatedAccess.sol#L26-L30) is never used and should be removed\n", + "first_markdown_element": "contracts/common/access/ElevatedAccess.sol#L26-L30", + "id": "e4a0096ef0b73339a838ec2b2ff15114d73b6016dd43a9ccf132649c13f9b11d", + "check": "dead-code", + "impact": "Informational", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "", + "type": "function", + "name": "hasStarted", "source_mapping": { - "start": 1654, - "length": 539, - "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", - "filename_short": "contracts/v2/safeGuards/SafeForked.sol", + "start": 540, + "length": 165, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", "is_dependency": false, - "lines": [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], - "starting_column": 9, - "ending_column": 10 + "lines": [17, 18, 19], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "signatureSplit", + "type": "contract", + "name": "EpochLib", "source_mapping": { - "start": 1240, - "length": 959, - "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", - "filename_short": "contracts/v2/safeGuards/SafeForked.sol", + "start": 190, + "length": 517, + "filename_relative": "contracts/templegold/EpochLib.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/EpochLib.sol", + "filename_short": "contracts/templegold/EpochLib.sol", "is_dependency": false, "lines": [ - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46 + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "SafeForked", - "source_mapping": { - "start": 462, - "length": 6708, - "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", - "filename_short": "contracts/v2/safeGuards/SafeForked.sol", - "is_dependency": false, - "lines": [ - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "signatureSplit(bytes,uint256)" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "hasStarted(IAuctionBase.EpochInfo)" } } ], - "description": "SafeForked.signatureSplit(bytes,uint256) (contracts/v2/safeGuards/SafeForked.sol#22-46) uses assembly\n\t- INLINE ASM (contracts/v2/safeGuards/SafeForked.sol#35-45)\n", - "markdown": "[SafeForked.signatureSplit(bytes,uint256)](contracts/v2/safeGuards/SafeForked.sol#L22-L46) uses assembly\n\t- [INLINE ASM](contracts/v2/safeGuards/SafeForked.sol#L35-L45)\n", - "first_markdown_element": "contracts/v2/safeGuards/SafeForked.sol#L22-L46", - "id": "3ae97a7384e3769435f8b201c1864a124173df742b9300bf25e8a1a702a86371", - "check": "assembly", + "description": "EpochLib.hasStarted(IAuctionBase.EpochInfo) (contracts/templegold/EpochLib.sol#17-19) is never used and should be removed\n", + "markdown": "[EpochLib.hasStarted(IAuctionBase.EpochInfo)](contracts/templegold/EpochLib.sol#L17-L19) is never used and should be removed\n", + "first_markdown_element": "contracts/templegold/EpochLib.sol#L17-L19", + "id": "805297020649b131e794b52f4d3ca09d820df9b6a259445c0d532f6a88e13ea4", + "check": "dead-code", "impact": "Informational", - "confidence": "High" + "confidence": "Medium" }, { "elements": [ { "type": "function", - "name": "batchLiquidate", + "name": "encodeUInt128", "source_mapping": { - "start": 13008, - "length": 1632, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 164, + "length": 199, + "filename_relative": "contracts/common/SafeCast.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/common/SafeCast.sol", + "filename_short": "contracts/common/SafeCast.sol", + "is_dependency": false, + "lines": [8, 9, 10, 11, 12, 13], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SafeCast", + "source_mapping": { + "start": 104, + "length": 261, + "filename_relative": "contracts/common/SafeCast.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/common/SafeCast.sol", + "filename_short": "contracts/common/SafeCast.sol", + "is_dependency": false, + "lines": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "encodeUInt128(uint256)" + } + } + ], + "description": "SafeCast.encodeUInt128(uint256) (contracts/common/SafeCast.sol#8-13) is never used and should be removed\n", + "markdown": "[SafeCast.encodeUInt128(uint256)](contracts/common/SafeCast.sol#L8-L13) is never used and should be removed\n", + "first_markdown_element": "contracts/common/SafeCast.sol#L8-L13", + "id": "289847a9a488ea94caf6e4208c7d0a20206702605f67c7767181980fa0511e88", + "check": "dead-code", + "impact": "Informational", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "checkNSignatures", + "source_mapping": { + "start": 3139, + "length": 4030, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, "lines": [ - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359 + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129 ], "starting_column": 5, "ending_column": 6 @@ -41672,221 +58919,95 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "TempleLineOfCredit", + "name": "SafeForked", "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, - 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, - 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + "start": 463, + "length": 6708, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131 ], "starting_column": 1, "ending_column": 0 } }, - "signature": "batchLiquidate(address[])" + "signature": "checkNSignatures(address,GnosisSafe,bytes32,bytes,bytes,uint256)" } - }, + } + ], + "description": "SafeForked.checkNSignatures(address,GnosisSafe,bytes32,bytes,bytes,uint256) (contracts/v2/safeGuards/SafeForked.sol#59-129) is never used and should be removed\n", + "markdown": "[SafeForked.checkNSignatures(address,GnosisSafe,bytes32,bytes,bytes,uint256)](contracts/v2/safeGuards/SafeForked.sol#L59-L129) is never used and should be removed\n", + "first_markdown_element": "contracts/v2/safeGuards/SafeForked.sol#L59-L129", + "id": "da52ad35746c39d7fedfdb625bbd6faafa394b15ee3fdaad7186a862a4e7b641", + "check": "dead-code", + "impact": "Informational", + "confidence": "Medium" + }, + { + "elements": [ { - "type": "node", - "name": "delete allAccountsData[_account]", + "type": "function", + "name": "signatureSplit", "source_mapping": { - "start": 14023, - "length": 32, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 1241, + "length": 959, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, - "lines": [344], - "starting_column": 17, - "ending_column": 49 + "lines": [ + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46 + ], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "batchLiquidate", + "type": "contract", + "name": "SafeForked", "source_mapping": { - "start": 13008, - "length": 1632, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", + "start": 463, + "length": 6708, + "filename_relative": "contracts/v2/safeGuards/SafeForked.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/safeGuards/SafeForked.sol", + "filename_short": "contracts/v2/safeGuards/SafeForked.sol", "is_dependency": false, "lines": [ - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131 ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "TempleLineOfCredit", - "source_mapping": { - "start": 1433, - "length": 31697, - "filename_relative": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "filename_short": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol", - "is_dependency": false, - "lines": [ - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, - 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, - 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884 - ], - "starting_column": 1, - "ending_column": 0 - } - }, - "signature": "batchLiquidate(address[])" + "starting_column": 1, + "ending_column": 0 } - } + }, + "signature": "signatureSplit(bytes,uint256)" } } ], - "description": "TempleLineOfCredit.batchLiquidate(address[]) (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#318-359) has costly operations inside a loop:\n\t- delete allAccountsData[_account] (contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#344)\n", - "markdown": "[TempleLineOfCredit.batchLiquidate(address[])](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L318-L359) has costly operations inside a loop:\n\t- [delete allAccountsData[_account]](contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L344)\n", - "first_markdown_element": "contracts/v2/templeLineOfCredit/TempleLineOfCredit.sol#L318-L359", - "id": "a95c0c9dfeb348e0fd86f2f14090e1fbee931ec14c7a4d06443de73a63f4c257", - "check": "costly-loop", + "description": "SafeForked.signatureSplit(bytes,uint256) (contracts/v2/safeGuards/SafeForked.sol#22-46) is never used and should be removed\n", + "markdown": "[SafeForked.signatureSplit(bytes,uint256)](contracts/v2/safeGuards/SafeForked.sol#L22-L46) is never used and should be removed\n", + "first_markdown_element": "contracts/v2/safeGuards/SafeForked.sol#L22-L46", + "id": "e1f743bab5368b426d718f25fb8bde402eb0ae259388bccfc9764e1a01fa3cd6", + "check": "dead-code", "impact": "Informational", "confidence": "Medium" }, @@ -42242,13 +59363,504 @@ "impact": "Informational", "confidence": "High" }, + { + "elements": [ + { + "type": "function", + "name": "withdrawEth", + "source_mapping": { + "start": 17360, + "length": 555, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [361, 362, 363, 364, 365, 366, 367, 368, 369], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawEth(address,uint256)" + } + }, + { + "type": "node", + "name": "(success) = _to.call{value: _amount}()", + "source_mapping": { + "start": 17801, + "length": 49, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [367], + "starting_column": 9, + "ending_column": 58 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "withdrawEth", + "source_mapping": { + "start": 17360, + "length": 555, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [361, 362, 363, 364, 365, 366, 367, 368, 369], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "withdrawEth(address,uint256)" + } + } + } + } + ], + "description": "Low level call in SpiceAuction.withdrawEth(address,uint256) (contracts/templegold/SpiceAuction.sol#361-369):\n\t- (success) = _to.call{value: _amount}() (contracts/templegold/SpiceAuction.sol#367)\n", + "markdown": "Low level call in [SpiceAuction.withdrawEth(address,uint256)](contracts/templegold/SpiceAuction.sol#L361-L369):\n\t- [(success) = _to.call{value: _amount}()](contracts/templegold/SpiceAuction.sol#L367)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L361-L369", + "id": "c0d5b3e65194ffa6d91cccc574d67c248e5bd2584d02be66cec2e151f2a23d66", + "check": "low-level-calls", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "_burnAndNotify", + "source_mapping": { + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_burnAndNotify(uint256,address,bool)" + } + }, + { + "type": "node", + "name": "(success) = address(msg.sender).call{value: leftover}()", + "source_mapping": { + "start": 22867, + "length": 65, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [482], + "starting_column": 17, + "ending_column": 82 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_burnAndNotify", + "source_mapping": { + "start": 21228, + "length": 1802, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SpiceAuction", + "source_mapping": { + "start": 1761, + "length": 21731, + "filename_relative": "contracts/templegold/SpiceAuction.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/SpiceAuction.sol", + "filename_short": "contracts/templegold/SpiceAuction.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + "signature": "_burnAndNotify(uint256,address,bool)" + } + } + } + } + ], + "description": "Low level call in SpiceAuction._burnAndNotify(uint256,address,bool) (contracts/templegold/SpiceAuction.sol#451-486):\n\t- (success) = address(msg.sender).call{value: leftover}() (contracts/templegold/SpiceAuction.sol#482)\n", + "markdown": "Low level call in [SpiceAuction._burnAndNotify(uint256,address,bool)](contracts/templegold/SpiceAuction.sol#L451-L486):\n\t- [(success) = address(msg.sender).call{value: leftover}()](contracts/templegold/SpiceAuction.sol#L482)\n", + "first_markdown_element": "contracts/templegold/SpiceAuction.sol#L451-L486", + "id": "6758fd3af6f9372889bcf3ea61b344b352f1f9a497c9890c37145e6a1d73e99d", + "check": "low-level-calls", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "contract", + "name": "TempleERC20Token", + "source_mapping": { + "start": 425, + "length": 634, + "filename_relative": "contracts/core/TempleERC20Token.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/core/TempleERC20Token.sol", + "filename_short": "contracts/core/TempleERC20Token.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ITempleERC20Token", + "source_mapping": { + "start": 196, + "length": 611, + "filename_relative": "contracts/interfaces/core/ITempleERC20Token.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/core/ITempleERC20Token.sol", + "filename_short": "contracts/interfaces/core/ITempleERC20Token.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30 + ], + "starting_column": 1, + "ending_column": 0 + } + } + ], + "description": "TempleERC20Token (contracts/core/TempleERC20Token.sol#11-31) should inherit from ITempleERC20Token (contracts/interfaces/core/ITempleERC20Token.sol#7-30)\n", + "markdown": "[TempleERC20Token](contracts/core/TempleERC20Token.sol#L11-L31) should inherit from [ITempleERC20Token](contracts/interfaces/core/ITempleERC20Token.sol#L7-L30)\n", + "first_markdown_element": "contracts/core/TempleERC20Token.sol#L11-L31", + "id": "1012fc2683a6f016ab688afd7c9d40e0a123132cb6ea9676b420d4c39ed23cd9", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "contract", + "name": "OGTemple", + "source_mapping": { + "start": 537, + "length": 225, + "filename_relative": "contracts/deprecated/OGTemple.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/deprecated/OGTemple.sol", + "filename_short": "contracts/deprecated/OGTemple.sol", + "is_dependency": false, + "lines": [16, 17, 18, 19, 20, 21, 22, 23], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "ITempleERC20Token", + "source_mapping": { + "start": 196, + "length": 611, + "filename_relative": "contracts/interfaces/core/ITempleERC20Token.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/core/ITempleERC20Token.sol", + "filename_short": "contracts/interfaces/core/ITempleERC20Token.sol", + "is_dependency": false, + "lines": [ + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30 + ], + "starting_column": 1, + "ending_column": 0 + } + } + ], + "description": "OGTemple (contracts/deprecated/OGTemple.sol#16-23) should inherit from ITempleERC20Token (contracts/interfaces/core/ITempleERC20Token.sol#7-30)\n", + "markdown": "[OGTemple](contracts/deprecated/OGTemple.sol#L16-L23) should inherit from [ITempleERC20Token](contracts/interfaces/core/ITempleERC20Token.sol#L7-L30)\n", + "first_markdown_element": "contracts/deprecated/OGTemple.sol#L16-L23", + "id": "d796780be51036fc47b271e699d52424bbe664783a4a7b47c3984deb2cce03bb", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "contract", + "name": "TempleGoldAdmin", + "source_mapping": { + "start": 1031, + "length": 4931, + "filename_relative": "contracts/templegold/TempleGoldAdmin.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/templegold/TempleGoldAdmin.sol", + "filename_short": "contracts/templegold/TempleGoldAdmin.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 + ], + "starting_column": 1, + "ending_column": 0 + } + }, + { + "type": "contract", + "name": "IOFTCore", + "source_mapping": { + "start": 325, + "length": 426, + "filename_relative": "contracts/interfaces/templegold/ITempleGoldAdmin.sol", + "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/interfaces/templegold/ITempleGoldAdmin.sol", + "filename_short": "contracts/interfaces/templegold/ITempleGoldAdmin.sol", + "is_dependency": false, + "lines": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18], + "starting_column": 1, + "ending_column": 2 + } + } + ], + "description": "TempleGoldAdmin (contracts/templegold/TempleGoldAdmin.sol#20-139) should inherit from IOFTCore (contracts/interfaces/templegold/ITempleGoldAdmin.sol#9-18)\n", + "markdown": "[TempleGoldAdmin](contracts/templegold/TempleGoldAdmin.sol#L20-L139) should inherit from [IOFTCore](contracts/interfaces/templegold/ITempleGoldAdmin.sol#L9-L18)\n", + "first_markdown_element": "contracts/templegold/TempleGoldAdmin.sol#L20-L139", + "id": "b49b3ae8e0299412d2775b662dbfbd317830a84fe671fa57f3907f49cc3ae41b", + "check": "missing-inheritance", + "impact": "Informational", + "confidence": "High" + }, { "elements": [ { "type": "contract", "name": "TreasuryReservesVault", "source_mapping": { - "start": 2150, + "start": 2151, "length": 32023, "filename_relative": "contracts/v2/TreasuryReservesVault.sol", "filename_absolute": "/Users/frontier/git/temple-2/protocol/contracts/v2/TreasuryReservesVault.sol", diff --git a/protocol/test/forge/invariant/templegold/AuctionInvariant.t.sol b/protocol/test/forge/invariant/templegold/AuctionInvariant.t.sol new file mode 100644 index 000000000..1ea5cdb52 --- /dev/null +++ b/protocol/test/forge/invariant/templegold/AuctionInvariant.t.sol @@ -0,0 +1,155 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/AuctionInvariant.t.sol) + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { BaseInvariantTest } from "./BaseInvariant.t.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { GoldAuctionHandler } from "./handlers/GoldAuctionHandler.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { console } from "forge-std/console.sol"; + +contract AuctionInvariantTest is BaseInvariantTest { + GoldAuctionHandler public handler; + + TempleGold public templeGold; + StableGoldAuction public auction; + IERC20 public bidToken; + FakeERC20 public templeToken; + TempleGoldStaking public staking; + + uint256 public arbitrumOneForkId; + + uint64 public constant AUCTION_DURATION = 1 weeks; + uint32 public constant AUCTIONS_TIME_DIFF_ONE = 2 weeks; + uint32 public constant AUCTIONS_START_COOLDOWN_ONE = 1 hours; + uint192 public constant AUCTION_MIN_DISTRIBUTED_GOLD_ONE = 1_000; + + function setUp() public override { + BaseInvariantTest.setUp(); + arbitrumOneForkId = fork("arbitrum_one"); + + // templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + templeGold = new TempleGold(initArgs); + bidToken = IERC20(daiToken); + auction = new StableGoldAuction( + address(templeGold), + address(bidToken), + treasury, + rescuer, + executor, + executor + ); + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + staking = new TempleGoldStaking(rescuer, executor, address(templeToken), address(templeGold)); + _configureTempleGold(); + _startAuction(); + handler = new GoldAuctionHandler( + timestampStore, stateStore, + address(auction), address(daiToken), + address(templeGold) + ); + vm.label({ account: address(handler), newLabel: "AuctionHandler" }); + + bytes4[] memory fnSelectors = new bytes4[](1); + fnSelectors[0] = GoldAuctionHandler.bid.selector; + // fnSelectors[1] = StakingHandler.claim.selector; + targetSelectors( + address(handler), + fnSelectors + ); + + targetSender(alice); + } + + function _getAuctionConfig() internal pure returns (IStableGoldAuction.AuctionConfig memory config) { + config.auctionsTimeDiff = AUCTIONS_TIME_DIFF_ONE; + config.auctionStartCooldown = AUCTIONS_START_COOLDOWN_ONE; + config.auctionMinimumDistributedGold = AUCTION_MIN_DISTRIBUTED_GOLD_ONE; + } + + function _configureTempleGold() private { + vm.startPrank(executor); + templeGold.setStableGoldAuction(address(auction)); + ITempleGold.DistributionParams memory params; + params.auction = 70 ether; + params.gnosis = 15 ether; + params.staking = 15 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 35; + factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(factor); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(teamGnosis); + // whitelist + templeGold.authorizeContract(address(auction), true); + templeGold.authorizeContract(address(staking), true); + templeGold.authorizeContract(teamGnosis, true); + vm.stopPrank(); + } + + function _startAuction() internal { + vm.startPrank(executor); + uint256 currentEpoch = auction.currentEpoch(); + IStableGoldAuction.AuctionConfig memory config = auction.getAuctionConfig(); + IAuctionBase.EpochInfo memory info; + if (currentEpoch == 0) { + vm.warp(block.timestamp + 1 weeks); + } else { + info = auction.getEpochInfo(currentEpoch); + vm.warp(info.endTime + config.auctionsTimeDiff); + } + // set auction config if not set + if (config.auctionMinimumDistributedGold == 0) { + auction.setAuctionConfig(_getAuctionConfig()); + } + templeGold.mint(); + auction.setAuctionStarter(address(0)); + auction.startAuction(); + info = auction.getEpochInfo(auction.currentEpoch()); + vm.warp(info.startTime); + vm.stopPrank(); + } + + function invariant_total_bids() public { + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + // checking recipient address of bids + uint256 balance = bidToken.balanceOf(auction.treasury()); + assertEq( + info.totalBidTokenAmount, + balance, + "Invariant violation: Bid token amount not equal to balance" + ); + } + + // function invariant_total_claims() public { + // uint256 currentEpoch = auction.currentEpoch(); + // IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + // uint256 aliceBalance = templeGold.balanceOf(alice); + // if (!auction.claimed(msg.sender, currentEpoch)) { + // assertGt( + // templeGold.balanceOf(address(auction)), + // aliceBalance, + // "Invariant Violation" + // ); + // } + // assertEq( + // aliceBalance, + // info.totalAuctionTokenAmount, + // "Invariant Violation: wrong claim balance" + // ); + // } + + function afterInvariant() external view { + console.log("totalCalls: gold auction handler:", handler.totalCalls()); + console.log("\tauctionHandler.bid:", handler.calls(GoldAuctionHandler.bid.selector)); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/BaseInvariant.t.sol b/protocol/test/forge/invariant/templegold/BaseInvariant.t.sol new file mode 100644 index 000000000..3957c1125 --- /dev/null +++ b/protocol/test/forge/invariant/templegold/BaseInvariant.t.sol @@ -0,0 +1,58 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/BaseInvariant.t.sol) + +import { StdInvariant } from "forge-std/StdInvariant.sol"; +import { TempleGoldCommon } from "../../unit/templegold/TempleGoldCommon.t.sol"; +import { TimestampStore } from "test/forge/invariant/templegold/stores/TimestampStore.sol"; +import { StateStore } from "test/forge/invariant/templegold/stores/StateStore.sol"; + +abstract contract BaseInvariantTest is StdInvariant, TempleGoldCommon { + + TimestampStore internal timestampStore; + StateStore internal stateStore; + + // function setUp() public virtual { + // vm.label({ account: address(this), newLabel: "ThisTestContract" }); + // excludeSender(address(this)); + + // } + + function setUp() public virtual { + timestampStore = new TimestampStore(); + vm.label({ account: address(timestampStore), newLabel: "TimestampStore" }); + excludeSender(address(timestampStore)); + + stateStore = new StateStore(); + vm.label({ account: address(stateStore), newLabel: "StateStore" }); + excludeSender(address(stateStore)); + } + + function targetSelectors(address addr, bytes4[] memory fnSelectors) internal { + targetContract(addr); + targetSelector( + StdInvariant.FuzzSelector({ + addr: addr, + selectors: fnSelectors + }) + ); + } + + function doMint( + address _token, + address _recipient, + uint256 _amount + ) internal { + deal(_token, _recipient, _amount); + } + + function mkArray( + bytes4 i1, + bytes4 i2, + bytes4 i3, + bytes4 i4 + ) internal pure returns (bytes4[] memory arr) { + arr = new bytes4[](4); + (arr[0], arr[1], arr[2], arr[3]) = (i1, i2, i3, i4); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/StakingInvariant.t.sol b/protocol/test/forge/invariant/templegold/StakingInvariant.t.sol new file mode 100644 index 000000000..00ac3df6b --- /dev/null +++ b/protocol/test/forge/invariant/templegold/StakingInvariant.t.sol @@ -0,0 +1,157 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/StakingInvariant.t.sol) + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { BaseInvariantTest } from "./BaseInvariant.t.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { StakingHandler } from "./handlers/StakingHandler.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { console } from "forge-std/console.sol"; + + +contract StakingInvariantTest is BaseInvariantTest { + StakingHandler internal stakingHandler; + + TempleGoldStaking public staking; + TempleGold public templeGold; + FakeERC20 public templeToken; + StableGoldAuction public auction; + IERC20 public bidToken; + + uint256 public arbitrumOneForkId; + uint256 public rewardAmount; + + function setUp() public override { + BaseInvariantTest.setUp(); + arbitrumOneForkId = fork("arbitrum_one"); + + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + templeGold = new TempleGold(initArgs); + bidToken = IERC20(daiToken); + auction = new StableGoldAuction( + address(templeGold), + address(bidToken), + treasury, + rescuer, + executor, + executor + ); + staking = new TempleGoldStaking( + rescuer, + executor, + address(templeToken), + address(templeGold) + ); + vm.startPrank(executor); + _configureTempleGold(); + _configureStaking(); + _skipAndMint(2 weeks); + // stake so we can distribute rewards + doMint(address(templeToken), executor, 1 ether); + _approve(address(templeToken), address(staking), 1 ether); + staking.stake(1); + rewardAmount = _distributeRewards(); + stakingHandler = new StakingHandler( + timestampStore, stateStore, + address(staking), address(templeToken), + staking.totalSupply(), + rewardAmount + ); + vm.label({ account: address(stakingHandler), newLabel: "StakingHandler" }); + + bytes4[] memory fnSelectors = new bytes4[](3); + fnSelectors[0] = StakingHandler.stake.selector; + fnSelectors[1] = StakingHandler.claim.selector; + fnSelectors[2] = StakingHandler.withdraw.selector; + targetSelectors( + address(stakingHandler), + fnSelectors + ); + + targetSender(alice); + } + + function _distributeRewards() private returns (uint256 rewards) { + staking.distributeRewards(); + ITempleGoldStaking.Reward memory rData = staking.getRewardData(); + rewards = rData.rewardRate * staking.rewardDuration(); + } + + function _configureStaking() private { + staking.setDistributionStarter(executor); + staking.setRewardDuration(7 days); + } + + function _configureTempleGold() private { + templeGold.setStableGoldAuction(address(auction)); + ITempleGold.DistributionParams memory params; + params.auction = 60 ether; + params.gnosis = 10 ether; + params.staking = 30 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 35; + factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(factor); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(teamGnosis); + // whitelist + templeGold.authorizeContract(address(auction), true); + templeGold.authorizeContract(address(staking), true); + templeGold.authorizeContract(teamGnosis, true); + } + + function _skipAndMint(uint256 skipTime) private { + skip(skipTime); + templeGold.mint(); + } + + /// @dev total amount staked matches total supply and total balance + function invariant_total_supply_balance() external { + uint256 balance = templeToken.balanceOf(address(staking)); + uint256 totalSupply = staking.totalSupply(); + assertEq( + balance, + totalSupply, + "Invariant violation: balance must be equal to total supply" + ); + } + + function invariant_claim() external { + ITempleGoldStaking.Reward memory rData = staking.getRewardData(); + uint256 warpTime = rData.periodFinish > block.timestamp ? rData.periodFinish : block.timestamp; + vm.warp(warpTime+1); + staking.getReward(alice); + staking.getReward(executor); + if (staking.earned(alice) == 0) { + assertLt(templeGold.balanceOf(alice), rewardAmount, "Invarant Violation: Alice reward must be less than total rewards"); + return; + } + assertEq( + templeGold.balanceOf(alice)+templeGold.balanceOf(executor), + rewardAmount, + "Invariant Violation: Total rewards" + ); + } + + /** + @dev Dump out the number of function calls made + */ + function invariant_logCalls() external view { + console.log("totalCalls: stakingHandler:", stakingHandler.totalCalls()); + console.log("\tstakingHandler.stake:", stakingHandler.calls(StakingHandler.stake.selector)); + console.log("\tstakingHandler.claim:", stakingHandler.calls(StakingHandler.claim.selector)); + console.log("\tstakingHandler.withdraw:", stakingHandler.calls(StakingHandler.withdraw.selector)); + } + + function afterInvariant() external view { + // console.log("totalCalls: stakingHandler:", stakingHandler.totalCalls()); + // console.log("\tstakingcHandler.stake:", stakingHandler.calls(StakingHandler.stake.selector)); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/handlers/BaseHandler.sol b/protocol/test/forge/invariant/templegold/handlers/BaseHandler.sol new file mode 100644 index 000000000..700e74f0d --- /dev/null +++ b/protocol/test/forge/invariant/templegold/handlers/BaseHandler.sol @@ -0,0 +1,70 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/BaseHandler.sol) + +import { Test } from "forge-std/Test.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { TimestampStore } from "test/forge/invariant/templegold/stores/TimestampStore.sol"; +import { StateStore } from "test/forge/invariant/templegold/stores/StateStore.sol"; + +abstract contract BaseHandler is Test { + address[] public actors; + address internal currentActor; + + /// @dev Reference to the timestamp store, which is needed for simulating the passage of time. + TimestampStore public timestampStore; + + /// @dev Reference which action has just run. + StateStore public stateStore; + + /// @dev Maps function names to the number of times they have been called. + mapping(bytes4 func => uint256 calls) public calls; + + /// @dev The total number of calls made to this contract. + uint256 public totalCalls; + + constructor(TimestampStore timestampStore_, StateStore stateStore_) { + timestampStore = timestampStore_; + stateStore = stateStore_; + } + + modifier useActor(uint256 actorIndexSeed) { + currentActor = actors[bound(actorIndexSeed, 0, actors.length - 1)]; + vm.startPrank(currentActor); + _; + vm.stopPrank(); + } + + modifier useSender() { + vm.startPrank(msg.sender); + _; + vm.stopPrank(); + } + + /// @dev Simulates the passage of time. The time jump is upper bounded by time around rewards ending + /// See https://github.com/foundry-rs/foundry/issues/4994. + /// @param timeJumpSeed A fuzzed value needed for generating random time warps. + modifier adjustTimestamp(uint256 timeJumpSeed) { + uint256 timeJump = _bound(timeJumpSeed, 0, 7 days); + timestampStore.increaseCurrentTimestamp(timeJump); + vm.warp(timestampStore.currentTimestamp()); + _; + } + + /// @dev Records a function call for instrumentation purposes, and also + /// sets the state of the function which is running now + modifier instrument() { + calls[msg.sig]++; + totalCalls++; + stateStore.set(address(this), msg.sig); + _; + } + + function doMint(address token, address account, uint256 amount) internal { + deal(token, account, IERC20(token).balanceOf(account) + amount, true); + } + + function approve(address _token, address _spender, uint256 _amount) internal { + IERC20(_token).approve(_spender, _amount); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/handlers/GoldAuctionHandler.sol b/protocol/test/forge/invariant/templegold/handlers/GoldAuctionHandler.sol new file mode 100644 index 000000000..d30a1e83e --- /dev/null +++ b/protocol/test/forge/invariant/templegold/handlers/GoldAuctionHandler.sol @@ -0,0 +1,62 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/GoldAuctionHandler.sol) + +import { BaseHandler } from "./BaseHandler.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { TimestampStore } from "test/forge/invariant/templegold/stores/TimestampStore.sol"; +import { StateStore } from "test/forge/invariant/templegold/stores/StateStore.sol"; + + +contract GoldAuctionHandler is BaseHandler { + IStableGoldAuction public auction; + IERC20 public templeGold; + IERC20 public stableToken; + uint256 public totalBids; + + constructor( + TimestampStore timestampStore_, + StateStore stateStore_, + address _auction, + address _stableToken, + address _templeGold + ) BaseHandler(timestampStore_, stateStore_) { + auction = IStableGoldAuction(_auction); + stableToken = IERC20(_stableToken); + templeGold = IERC20(_templeGold); + } + + function bid(uint256 amount) external instrument useSender { + amount = _bound(amount, 0, 10_000 ether); + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + uint256 bidsBefore = info.totalBidTokenAmount; + deal(address(stableToken), msg.sender, amount, true); + approve(address(stableToken), address(auction), amount); + auction.bid(amount); + totalBids += amount; + assertGe( + totalBids, + bidsBefore, + "Invariant violation: totalBids" + ); + } + + function claim(uint256 jumpTime) external instrument useSender { + // jump time + vm.warp(block.timestamp+_bound(jumpTime, 0, 1 days)); + if (!auction.isCurrentEpochEnded()) { + stateStore.setFinishedEarly(); + return; + } + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + assertEq( + info.totalAuctionTokenAmount, + templeGold.balanceOf(msg.sender), + "Invariant violation: claim" + ); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/handlers/StakingHandler.sol b/protocol/test/forge/invariant/templegold/handlers/StakingHandler.sol new file mode 100644 index 000000000..71d03c55b --- /dev/null +++ b/protocol/test/forge/invariant/templegold/handlers/StakingHandler.sol @@ -0,0 +1,85 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/StakingHandler.sol) + +import { BaseHandler } from "./BaseHandler.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { TimestampStore } from "test/forge/invariant/templegold/stores/TimestampStore.sol"; +import { StateStore } from "test/forge/invariant/templegold/stores/StateStore.sol"; + +contract StakingHandler is BaseHandler { + + ITempleGoldStaking public staking; + IERC20 public templeToken; + uint256 public totalStakes; + uint256 public totalWithdraws; + uint256 public totalRewards; + uint256 public collectedRewards; + mapping(address account => uint256 amount) public rewards; + + constructor( + TimestampStore timestampStore_, + StateStore stateStore_, + address _staking, + address _templeToken, + uint256 _initialSupply, + uint256 _totalRewards + ) BaseHandler(timestampStore_, stateStore_) { + staking = ITempleGoldStaking(_staking); + templeToken = IERC20(_templeToken); + totalStakes = _initialSupply; + totalRewards = _totalRewards; + } + + function stake(uint256 _amount) public instrument useSender { + uint256 totalStakeBefore = staking.totalSupply(); + // _amount = _bound(_amount, 0, 10_000 ether); + // approve and stake + { + deal(address(templeToken), msg.sender, _amount, true); + approve(address(templeToken), address(staking), _amount); + + staking.stake(_amount); + } + totalStakes += _amount; + assertGe(totalStakes, totalStakeBefore, "Invariant violation: total staked should be higher after stake"); + } + + function claim(uint256 timeJumpSeed) public instrument useSender adjustTimestamp(timeJumpSeed) { + // vm.warp(block.timestamp+_bound(timeJumpSeed, 0, 7 days)); + uint256 rewardAmount = staking.earned(msg.sender); + if (rewardAmount == 0) { + stateStore.setFinishedEarly(); + return; + } + staking.getReward(msg.sender); + rewards[msg.sender] += rewardAmount; + collectedRewards += rewardAmount; + assertGe( + totalRewards, + collectedRewards, + "Invariant violation: total rewards should be higher than collected rewards" + ); + } + + function withdraw(uint256 amount) public instrument useSender returns (uint256 withdrawAmount) { + uint256 totalStake = staking.balanceOf(msg.sender); + amount = _bound(amount, 0, totalStake); + if (amount == 0) { + stateStore.setFinishedEarly(); + return 0; + } + // avoid early withdrawal. withdraw end of period finish + ITempleGoldStaking.Reward memory rData = staking.getRewardData(); + if (block.timestamp < rData.periodFinish) { + stateStore.setFinishedEarly(); + return 0; + } + uint256 withdrawsCache = totalWithdraws; + staking.withdraw(amount, false); + withdrawAmount = amount; + totalWithdraws += amount; + assertGt(totalWithdraws, withdrawsCache, "Invariant violation: total withdraws should be higher after withdraw"); + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/stores/StateStore.sol b/protocol/test/forge/invariant/templegold/stores/StateStore.sol new file mode 100644 index 000000000..4ae02e703 --- /dev/null +++ b/protocol/test/forge/invariant/templegold/stores/StateStore.sol @@ -0,0 +1,33 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/stores/StateStore.sol) + +/// @dev Because Foundry does not commit the state changes between invariant runs, we need to +/// save the latest state in a contract with persistent storage. +contract StateStore { + address public latestHandler; + bytes4 public latestSig; + bool public finishedEarly; + + bool public cappedRebalanceDown; + + function set(address handler, bytes4 sig) external { + latestHandler = handler; + latestSig = sig; + finishedEarly = false; + } + + function pop() external returns (address handler_, bytes4 sig_, bool finishedEarly_) { + handler_ = latestHandler; + sig_ = latestSig; + finishedEarly_ = finishedEarly; + + latestHandler = address(0); + latestSig = bytes4(0); + finishedEarly = false; + } + + function setFinishedEarly() external { + finishedEarly = true; + } +} \ No newline at end of file diff --git a/protocol/test/forge/invariant/templegold/stores/TimestampStore.sol b/protocol/test/forge/invariant/templegold/stores/TimestampStore.sol new file mode 100644 index 000000000..c45aa3e16 --- /dev/null +++ b/protocol/test/forge/invariant/templegold/stores/TimestampStore.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/invariant/stores/StateStore.sol) + +/// @dev Because Foundry does not commit the state changes between invariant runs, we need to +/// save the current timestamp in a contract with persistent storage. +contract TimestampStore { + uint256 public currentTimestamp; + + constructor() {} + + function increaseCurrentTimestamp(uint256 timeJump) external { + currentTimestamp = block.timestamp + timeJump; + } +} \ No newline at end of file diff --git a/protocol/test/forge/lz-devtools/README.md b/protocol/test/forge/lz-devtools/README.md new file mode 100644 index 000000000..ca4846c34 --- /dev/null +++ b/protocol/test/forge/lz-devtools/README.md @@ -0,0 +1,7 @@ +# LayerZero DevTools (forked) + +`TestHelperOz5.sol` and other contracts forked from [LayerZero-Labs/devtools](https://github.com/LayerZero-Labs/devtools/tree/14d414c74d1bf75c0e5a9da5bd248c319f248762/packages/test-devtools-evm-foundry) + +The LZ contracts include a [MessagingComposer::lzComposeAlert()](https://github.com/LayerZero-Labs/LayerZero-v2/blob/1fde89479fdc68b1a54cda7f19efa84483fcacc4/protocol/contracts/MessagingComposer.sol#L67) function and event emit with a tonne of parameters - causing solc to stack too deep when running `forge coverage` + +This function is not required in tests - so the devtools was forked to be the same but with that function commented out. diff --git a/protocol/test/forge/lz-devtools/TestHelperOz5.sol b/protocol/test/forge/lz-devtools/TestHelperOz5.sol new file mode 100644 index 000000000..f40e413a7 --- /dev/null +++ b/protocol/test/forge/lz-devtools/TestHelperOz5.sol @@ -0,0 +1,500 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.18; + +// Forge +import { Test } from "forge-std/Test.sol"; + +// Oz +import { DoubleEndedQueue } from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; + +// Msg Lib +import { UlnConfig, SetDefaultUlnConfigParam } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import { SetDefaultExecutorConfigParam, ExecutorConfig } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; + +// Protocol +import { IMessageLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; +import { ExecutorOptions } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/ExecutorOptions.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; + +// @dev oz4/5 breaking change... +import { ReceiveUln302Mock as ReceiveUln302, IReceiveUlnE2 } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/ReceiveUln302Mock.sol"; +import { DVNMock as DVN, ExecuteParam, IDVN } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/DVNMock.sol"; +import { DVNFeeLibMock as DVNFeeLib } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/DVNFeeLibMock.sol"; +import { ExecutorMock as Executor, IExecutor } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/ExecutorMock.sol"; +import { PriceFeedMock as PriceFeed, ILayerZeroPriceFeed } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/PriceFeedMock.sol"; + +// @note Needs to use the local TestHelperOz5 for stack too deep +import { EndpointV2Mock as EndpointV2 } from "./mocks/EndpointV2Mock.sol"; + +// OApp +import { OApp } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; + +// Misc. Mocks +import { OptionsHelper } from "@layerzerolabs/test-devtools-evm-foundry/contracts/OptionsHelper.sol"; + +// @note Needs to use the local TestHelperOz5 for stack too deep +import { SendUln302Mock as SendUln302 } from "./mocks/SendUln302Mock.sol"; // Needs to use the local TestHelperOz5 +import { SimpleMessageLibMock } from "./mocks/SimpleMessageLibMock.sol"; // Needs to use the local TestHelperOz5 +import { ExecutorFeeLibMock as ExecutorFeeLib } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/ExecutorFeeLibMock.sol"; + +/** + * @title TestHelperOz5 + * @notice Helper contract for setting up and managing LayerZero test environments. + * @dev Extends Foundry's Test contract and provides utility functions for setting up mock endpoints and OApps. + */ +contract TestHelperOz5 is Test, OptionsHelper { + using OptionsBuilder for bytes; + + enum LibraryType { + UltraLightNode, + SimpleMessageLib + } + + using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; + using PacketV1Codec for bytes; + + mapping(uint32 => mapping(bytes32 => DoubleEndedQueue.Bytes32Deque)) packetsQueue; // dstEid => dstUA => guids queue + mapping(bytes32 => bytes) packets; // guid => packet bytes + mapping(bytes32 => bytes) optionsLookup; // guid => options + + mapping(uint32 => address) endpoints; // eid => endpoint + + uint256 public constant TREASURY_GAS_CAP = 1000000000000; + uint256 public constant TREASURY_GAS_FOR_FEE_CAP = 100000; + + uint128 public executorValueCap = 0.1 ether; + + /// @dev Initializes test environment setup, to be overridden by specific tests. + function setUp() public virtual {} + + /** + * @dev set executorValueCap if more than 0.1 ether is necessary + * @dev this must be called prior to setUpEndpoints() if the value is to be used + * @param _valueCap amount executor can pass as msg.value to lzReceive() + */ + function setExecutorValueCap(uint128 _valueCap) public { + executorValueCap = _valueCap; + } + + /** + * @notice Sets up endpoints for testing. + * @param _endpointNum The number of endpoints to create. + * @param _libraryType The type of message library to use (UltraLightNode or SimpleMessageLib). + */ + function setUpEndpoints(uint8 _endpointNum, LibraryType _libraryType) public { + EndpointV2[] memory endpointList = new EndpointV2[](_endpointNum); + uint32[] memory eidList = new uint32[](_endpointNum); + + // deploy _excludedContracts + for (uint8 i = 0; i < _endpointNum; i++) { + uint32 eid = i + 1; + eidList[i] = eid; + endpointList[i] = new EndpointV2(eid, address(this)); + registerEndpoint(endpointList[i]); + } + + // deploy + address[] memory sendLibs = new address[](_endpointNum); + address[] memory receiveLibs = new address[](_endpointNum); + + address[] memory signers = new address[](1); + signers[0] = vm.addr(1); + + // @dev oz4/5 breaking change... constructor init + PriceFeed priceFeed = new PriceFeed(address(this)); + + for (uint8 i = 0; i < _endpointNum; i++) { + if (_libraryType == LibraryType.UltraLightNode) { + address endpointAddr = address(endpointList[i]); + + SendUln302 sendUln; + ReceiveUln302 receiveUln; + { + sendUln = new SendUln302(payable(this), endpointAddr, TREASURY_GAS_CAP, TREASURY_GAS_FOR_FEE_CAP); + receiveUln = new ReceiveUln302(endpointAddr); + endpointList[i].registerLibrary(address(sendUln)); + endpointList[i].registerLibrary(address(receiveUln)); + sendLibs[i] = address(sendUln); + receiveLibs[i] = address(receiveUln); + } + + Executor executor; + DVN dvn; + { + address[] memory admins = new address[](1); + admins[0] = address(this); + + address[] memory messageLibs = new address[](2); + messageLibs[0] = address(sendUln); + messageLibs[1] = address(receiveUln); + executor = new Executor( + endpointAddr, + address(0x0), + messageLibs, + address(priceFeed), + address(this), + admins + ); + + ExecutorFeeLib executorLib = new ExecutorFeeLib(); + executor.setWorkerFeeLib(address(executorLib)); + + dvn = new DVN(i + 1, messageLibs, address(priceFeed), signers, 1, admins); + DVNFeeLib dvnLib = new DVNFeeLib(1e18); + dvn.setWorkerFeeLib(address(dvnLib)); + } + + uint32 endpointNum = _endpointNum; + IExecutor.DstConfigParam[] memory dstConfigParams = new IExecutor.DstConfigParam[](endpointNum); + IDVN.DstConfigParam[] memory dvnConfigParams = new IDVN.DstConfigParam[](endpointNum); + for (uint8 j = 0; j < endpointNum; j++) { + if (i == j) continue; + uint32 dstEid = j + 1; + + address[] memory defaultDVNs = new address[](1); + address[] memory optionalDVNs = new address[](0); + defaultDVNs[0] = address(dvn); + + { + SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); + UlnConfig memory ulnConfig = UlnConfig( + 100, + uint8(defaultDVNs.length), + uint8(optionalDVNs.length), + 0, + defaultDVNs, + optionalDVNs + ); + params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); + sendUln.setDefaultUlnConfigs(params); + } + + { + SetDefaultExecutorConfigParam[] memory params = new SetDefaultExecutorConfigParam[](1); + ExecutorConfig memory executorConfig = ExecutorConfig(10000, address(executor)); + params[0] = SetDefaultExecutorConfigParam(dstEid, executorConfig); + sendUln.setDefaultExecutorConfigs(params); + } + + { + SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); + UlnConfig memory ulnConfig = UlnConfig( + 100, + uint8(defaultDVNs.length), + uint8(optionalDVNs.length), + 0, + defaultDVNs, + optionalDVNs + ); + params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); + receiveUln.setDefaultUlnConfigs(params); + } + + // executor config + dstConfigParams[j] = IExecutor.DstConfigParam({ + dstEid: dstEid, + lzReceiveBaseGas: 5000, + lzComposeBaseGas: 5000, + multiplierBps: 10000, + floorMarginUSD: 1e10, + nativeCap: executorValueCap + }); + + // dvn config + dvnConfigParams[j] = IDVN.DstConfigParam({ + dstEid: dstEid, + gas: 5000, + multiplierBps: 10000, + floorMarginUSD: 1e10 + }); + + uint128 denominator = priceFeed.getPriceRatioDenominator(); + ILayerZeroPriceFeed.UpdatePrice[] memory prices = new ILayerZeroPriceFeed.UpdatePrice[](1); + prices[0] = ILayerZeroPriceFeed.UpdatePrice( + dstEid, + ILayerZeroPriceFeed.Price(1 * denominator, 1, 1) + ); + priceFeed.setPrice(prices); + } + executor.setDstConfig(dstConfigParams); + dvn.setDstConfig(dvnConfigParams); + } else if (_libraryType == LibraryType.SimpleMessageLib) { + SimpleMessageLibMock messageLib = new SimpleMessageLibMock(payable(this), address(endpointList[i])); + endpointList[i].registerLibrary(address(messageLib)); + sendLibs[i] = address(messageLib); + receiveLibs[i] = address(messageLib); + } else { + revert("invalid library type"); + } + } + + // config up + for (uint8 i = 0; i < _endpointNum; i++) { + EndpointV2 endpoint = endpointList[i]; + for (uint8 j = 0; j < _endpointNum; j++) { + if (i == j) continue; + endpoint.setDefaultSendLibrary(j + 1, sendLibs[i]); + endpoint.setDefaultReceiveLibrary(j + 1, receiveLibs[i], 0); + } + } + } + + /** + * @notice Sets up mock OApp contracts for testing. + * @param _oappCreationCode The bytecode for creating OApp contracts. + * @param _startEid The starting endpoint ID for OApp setup. + * @param _oappNum The number of OApps to set up. + * @return oapps An array of addresses for the deployed OApps. + */ + function setupOApps( + bytes memory _oappCreationCode, + uint8 _startEid, + uint8 _oappNum + ) public returns (address[] memory oapps) { + oapps = new address[](_oappNum); + for (uint8 eid = _startEid; eid < _startEid + _oappNum; eid++) { + address oapp = _deployOApp(_oappCreationCode, abi.encode(address(endpoints[eid]), address(this), true)); + oapps[eid - _startEid] = oapp; + } + // config + wireOApps(oapps); + } + + /** + * @notice Configures the peers between multiple OApp instances. + * @dev Sets each OApp as a peer to every other OApp in the provided array, except itself. + * @param oapps An array of addresses representing the deployed OApp instances. + */ + function wireOApps(address[] memory oapps) public { + uint256 size = oapps.length; + for (uint256 i = 0; i < size; i++) { + OApp localOApp = OApp(payable(oapps[i])); + for (uint256 j = 0; j < size; j++) { + if (i == j) continue; + OApp remoteOApp = OApp(payable(oapps[j])); + uint32 remoteEid = (remoteOApp.endpoint()).eid(); + localOApp.setPeer(remoteEid, addressToBytes32(address(remoteOApp))); + } + } + } + + /** + * @notice Deploys an OApp contract using provided bytecode and constructor arguments. + * @dev This internal function uses low-level `create` for deploying a new contract. + * @param _oappBytecode The bytecode of the OApp contract to be deployed. + * @param _constructorArgs The encoded constructor arguments for the OApp contract. + * @return addr The address of the newly deployed OApp contract. + */ + function _deployOApp(bytes memory _oappBytecode, bytes memory _constructorArgs) internal returns (address addr) { + bytes memory bytecode = bytes.concat(abi.encodePacked(_oappBytecode), _constructorArgs); + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + } + + /** + * @notice Schedules a packet for delivery, storing it in the packets queue. + * @dev Adds the packet to the front of the queue and stores its options for later retrieval. + * @param _packetBytes The packet data to be scheduled. + * @param _options The options associated with the packet, used during delivery. + */ + function schedulePacket(bytes calldata _packetBytes, bytes calldata _options) public { + uint32 dstEid = _packetBytes.dstEid(); + bytes32 dstAddress = _packetBytes.receiver(); + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[dstEid][dstAddress]; + // front in, back out + bytes32 guid = _packetBytes.guid(); + queue.pushFront(guid); + packets[guid] = _packetBytes; + optionsLookup[guid] = _options; + } + + /** + * @notice Verifies and processes packets destined for a specific chain and user address. + * @dev Calls an overloaded version of verifyPackets with default values for packet amount and composer address. + * @param _dstEid The destination chain's endpoint ID. + * @param _dstAddress The destination address in bytes32 format. + */ + function verifyPackets(uint32 _dstEid, bytes32 _dstAddress) public { + verifyPackets(_dstEid, _dstAddress, 0, address(0x0)); + } + + /** + * @dev verify packets to destination chain's OApp address. + * @param _dstEid The destination endpoint ID. + * @param _dstAddress The destination address. + */ + function verifyPackets(uint32 _dstEid, address _dstAddress) public { + verifyPackets(_dstEid, bytes32(uint256(uint160(_dstAddress))), 0, address(0x0)); + } + + /** + * @dev dst UA receive/execute packets + * @dev will NOT work calling this directly with composer IF the composed payload is different from the lzReceive msg payload + */ + function verifyPackets(uint32 _dstEid, bytes32 _dstAddress, uint256 _packetAmount, address _composer) public { + require(endpoints[_dstEid] != address(0), "endpoint not yet registered"); + + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + uint256 pendingPacketsSize = queue.length(); + uint256 numberOfPackets; + if (_packetAmount == 0) { + numberOfPackets = queue.length(); + } else { + numberOfPackets = pendingPacketsSize > _packetAmount ? _packetAmount : pendingPacketsSize; + } + while (numberOfPackets > 0) { + numberOfPackets--; + // front in, back out + bytes32 guid = queue.popBack(); + bytes memory packetBytes = packets[guid]; + this.assertGuid(packetBytes, guid); + this.validatePacket(packetBytes); + + bytes memory options = optionsLookup[guid]; + if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_NATIVE_DROP)) { + (uint256 amount, bytes32 receiver) = _parseExecutorNativeDropOption(options); + address to = address(uint160(uint256(receiver))); + (bool sent, ) = to.call{ value: amount }(""); + require(sent, "Failed to send Ether"); + } + if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZRECEIVE)) { + this.lzReceive(packetBytes, options); + } + if (_composer != address(0) && _executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZCOMPOSE)) { + this.lzCompose(packetBytes, options, guid, _composer); + } + } + } + + function lzReceive(bytes calldata _packetBytes, bytes memory _options) external payable { + EndpointV2 endpoint = EndpointV2(endpoints[_packetBytes.dstEid()]); + (uint256 gas, uint256 value) = OptionsHelper._parseExecutorLzReceiveOption(_options); + + Origin memory origin = Origin(_packetBytes.srcEid(), _packetBytes.sender(), _packetBytes.nonce()); + endpoint.lzReceive{ value: value, gas: gas }( + origin, + _packetBytes.receiverB20(), + _packetBytes.guid(), + _packetBytes.message(), + bytes("") + ); + } + + function lzCompose( + bytes calldata _packetBytes, + bytes memory _options, + bytes32 _guid, + address _composer + ) external payable { + this.lzCompose( + _packetBytes.dstEid(), + _packetBytes.receiverB20(), + _options, + _guid, + _composer, + _packetBytes.message() + ); + } + + // @dev the verifyPackets does not know the composeMsg if it is NOT the same as the original lzReceive payload + // Can call this directly from your test to lzCompose those types of packets + function lzCompose( + uint32 _dstEid, + address _from, + bytes memory _options, + bytes32 _guid, + address _to, + bytes calldata _composerMsg + ) external payable { + EndpointV2 endpoint = EndpointV2(endpoints[_dstEid]); + (uint16 index, uint256 gas, uint256 value) = _parseExecutorLzComposeOption(_options); + endpoint.lzCompose{ value: value, gas: gas }(_from, _to, _guid, index, _composerMsg, bytes("")); + } + + function validatePacket(bytes calldata _packetBytes) external { + uint32 dstEid = _packetBytes.dstEid(); + EndpointV2 endpoint = EndpointV2(endpoints[dstEid]); + (address receiveLib, ) = endpoint.getReceiveLibrary(_packetBytes.receiverB20(), _packetBytes.srcEid()); + ReceiveUln302 dstUln = ReceiveUln302(receiveLib); + + (uint64 major, , ) = IMessageLib(receiveLib).version(); + if (major == 3) { + // it is ultra light node + bytes memory config = dstUln.getConfig(_packetBytes.srcEid(), _packetBytes.receiverB20(), 2); // CONFIG_TYPE_ULN + DVN dvn = DVN(abi.decode(config, (UlnConfig)).requiredDVNs[0]); + + bytes memory packetHeader = _packetBytes.header(); + bytes32 payloadHash = keccak256(_packetBytes.payload()); + + // sign + bytes memory signatures; + bytes memory verifyCalldata = abi.encodeWithSelector( + IReceiveUlnE2.verify.selector, + packetHeader, + payloadHash, + 100 + ); + { + bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000); + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer + signatures = abi.encodePacked(r, s, v); + } + ExecuteParam[] memory params = new ExecuteParam[](1); + params[0] = ExecuteParam(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000, signatures); + dvn.execute(params); + + // commit verification + bytes memory callData = abi.encodeWithSelector( + IReceiveUlnE2.commitVerification.selector, + packetHeader, + payloadHash + ); + { + bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), callData, block.timestamp + 1000); + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer + signatures = abi.encodePacked(r, s, v); + } + params[0] = ExecuteParam(dstEid, address(dstUln), callData, block.timestamp + 1000, signatures); + dvn.execute(params); + } else { + SimpleMessageLibMock(payable(receiveLib)).validatePacket(_packetBytes); + } + } + + function assertGuid(bytes calldata packetBytes, bytes32 guid) external pure { + bytes32 packetGuid = packetBytes.guid(); + require(packetGuid == guid, "guid not match"); + } + + function registerEndpoint(EndpointV2 endpoint) public { + endpoints[endpoint.eid()] = address(endpoint); + } + + function hasPendingPackets(uint16 _dstEid, bytes32 _dstAddress) public view returns (bool flag) { + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + return queue.length() > 0; + } + + function getNextInflightPacket(uint16 _dstEid, bytes32 _dstAddress) public view returns (bytes memory packetBytes) { + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + if (queue.length() > 0) { + bytes32 guid = queue.back(); + packetBytes = packets[guid]; + } + } + + function addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + receive() external payable {} +} diff --git a/protocol/test/forge/lz-devtools/mocks/EndpointV2Mock.sol b/protocol/test/forge/lz-devtools/mocks/EndpointV2Mock.sol new file mode 100644 index 000000000..bd1f5b194 --- /dev/null +++ b/protocol/test/forge/lz-devtools/mocks/EndpointV2Mock.sol @@ -0,0 +1,378 @@ +// SPDX-License-Identifier: LZBL-1.2 + +pragma solidity ^0.8.20; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// @dev oz4/5 breaking change... Ownable constructor +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +import { MessagingFee, MessagingParams, MessagingReceipt, Origin, ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { ISendLib, Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { ILayerZeroReceiver } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol"; +import { Errors } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Errors.sol"; +import { GUID } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/GUID.sol"; +import { Transfer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Transfer.sol"; +import { MessagingChannel } from "@layerzerolabs/lz-evm-protocol-v2/contracts/MessagingChannel.sol"; + +// @note Needs to use the local TestHelperOz5 for stack too deep +import { MessagingComposerMock as MessagingComposer } from "./MessagingComposerMock.sol"; +import { MessageLibManager } from "@layerzerolabs/lz-evm-protocol-v2/contracts/MessageLibManager.sol"; +import { MessagingContext } from "@layerzerolabs/lz-evm-protocol-v2/contracts/MessagingContext.sol"; + +// LayerZero EndpointV2 is fully backward compatible with LayerZero Endpoint(V1), but it also supports additional +// features that Endpoint(V1) does not support now and may not in the future. We have also changed some terminology +// to clarify pre-existing language that might have been confusing. +// +// The following is a list of terminology changes: +// -chainId -> eid +// - Rationale: chainId was a term we initially used to describe an endpoint on a specific chain. Since +// LayerZero supports non-EVMs we could not map the classic EVM chainIds to the LayerZero chainIds, making it +// confusing for developers. With the addition of EndpointV2 and its backward compatible nature, we would have +// two chainIds per chain that has Endpoint(V1), further confusing developers. We have decided to change the +// name to Endpoint Id, or eid, for simplicity and clarity. +// -adapterParams -> options +// -userApplication -> oapp. Omnichain Application +// -srcAddress -> sender +// -dstAddress -> receiver +// - Rationale: The sender/receiver on EVM is the address. However, on non-EVM chains, the sender/receiver could +// represented as a public key, or some other identifier. The term sender/receiver is more generic +// -payload -> message. +// - Rationale: The term payload is used in the context of a packet, which is a combination of the message and GUID +contract EndpointV2Mock is + ILayerZeroEndpointV2, + MessagingChannel, + MessageLibManager, + MessagingComposer, + MessagingContext +{ + address public lzToken; + + mapping(address oapp => address delegate) public delegates; + + /// @param _eid the unique Endpoint Id for this deploy that all other Endpoints can use to send to it + // @dev oz4/5 breaking change... Ownable constructor + constructor(uint32 _eid, address _owner) Ownable(_owner) MessagingChannel(_eid) {} + + /// @dev MESSAGING STEP 0 + /// @notice This view function gives the application built on top of LayerZero the ability to requests a quote + /// with the same parameters as they would to send their message. Since the quotes are given on chain there is a + /// race condition in which the prices could change between the time the user gets their quote and the time they + /// submit their message. If the price moves up and the user doesn't send enough funds the transaction will revert, + /// if the price goes down the _refundAddress provided by the app will be refunded the difference. + /// @param _params the messaging parameters + /// @param _sender the sender of the message + function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory) { + // lzToken must be set to support payInLzToken + if (_params.payInLzToken && lzToken == address(0x0)) revert Errors.LZ_LzTokenUnavailable(); + + // get the correct outbound nonce + uint64 nonce = outboundNonce[_sender][_params.dstEid][_params.receiver] + 1; + + // construct the packet with a GUID + Packet memory packet = Packet({ + nonce: nonce, + srcEid: eid, + sender: _sender, + dstEid: _params.dstEid, + receiver: _params.receiver, + guid: GUID.generate(nonce, eid, _sender, _params.dstEid, _params.receiver), + message: _params.message + }); + + // get the send library by sender and dst eid + // use _ to avoid variable shadowing + address _sendLibrary = getSendLibrary(_sender, _params.dstEid); + + return ISendLib(_sendLibrary).quote(packet, _params.options, _params.payInLzToken); + } + + /// @dev MESSAGING STEP 1 - OApp need to transfer the fees to the endpoint before sending the message + /// @param _params the messaging parameters + /// @param _refundAddress the address to refund both the native and lzToken + function send( + MessagingParams calldata _params, + address _refundAddress + ) external payable sendContext(_params.dstEid, msg.sender) returns (MessagingReceipt memory) { + if (_params.payInLzToken && lzToken == address(0x0)) revert Errors.LZ_LzTokenUnavailable(); + + // send message + (MessagingReceipt memory receipt, address _sendLibrary) = _send(msg.sender, _params); + + // OApp can simulate with 0 native value it will fail with error including the required fee, which can be provided in the actual call + // this trick can be used to avoid the need to write the quote() function + // however, without the quote view function it will be hard to compose an oapp on chain + uint256 suppliedNative = _suppliedNative(); + uint256 suppliedLzToken = _suppliedLzToken(_params.payInLzToken); + _assertMessagingFee(receipt.fee, suppliedNative, suppliedLzToken); + + // handle lz token fees + _payToken(lzToken, receipt.fee.lzTokenFee, suppliedLzToken, _sendLibrary, _refundAddress); + + // handle native fees + _payNative(receipt.fee.nativeFee, suppliedNative, _sendLibrary, _refundAddress); + + return receipt; + } + + /// @dev internal function for sending the messages used by all external send methods + /// @param _sender the address of the application sending the message to the destination chain + /// @param _params the messaging parameters + function _send( + address _sender, + MessagingParams calldata _params + ) internal returns (MessagingReceipt memory, address) { + // get the correct outbound nonce + uint64 latestNonce = _outbound(_sender, _params.dstEid, _params.receiver); + + // construct the packet with a GUID + Packet memory packet = Packet({ + nonce: latestNonce, + srcEid: eid, + sender: _sender, + dstEid: _params.dstEid, + receiver: _params.receiver, + guid: GUID.generate(latestNonce, eid, _sender, _params.dstEid, _params.receiver), + message: _params.message + }); + + // get the send library by sender and dst eid + address _sendLibrary = getSendLibrary(_sender, _params.dstEid); + + // messageLib always returns encodedPacket with guid + (MessagingFee memory fee, bytes memory encodedPacket) = ISendLib(_sendLibrary).send( + packet, + _params.options, + _params.payInLzToken + ); + + // Emit packet information for DVNs, Executors, and any other offchain infrastructure to only listen + // for this one event to perform their actions. + emit PacketSent(encodedPacket, _params.options, _sendLibrary); + + return (MessagingReceipt(packet.guid, latestNonce, fee), _sendLibrary); + } + + /// @dev MESSAGING STEP 2 - on the destination chain + /// @dev configured receive library verifies a message + /// @param _origin a struct holding the srcEid, nonce, and sender of the message + /// @param _receiver the receiver of the message + /// @param _payloadHash the payload hash of the message + function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external { + if (!isValidReceiveLibrary(_receiver, _origin.srcEid, msg.sender)) revert Errors.LZ_InvalidReceiveLibrary(); + + uint64 lazyNonce = lazyInboundNonce[_receiver][_origin.srcEid][_origin.sender]; + if (!_initializable(_origin, _receiver, lazyNonce)) revert Errors.LZ_PathNotInitializable(); + if (!_verifiable(_origin, _receiver, lazyNonce)) revert Errors.LZ_PathNotVerifiable(); + + // insert the message into the message channel + _inbound(_receiver, _origin.srcEid, _origin.sender, _origin.nonce, _payloadHash); + emit PacketVerified(_origin, _receiver, _payloadHash); + } + + /// @dev MESSAGING STEP 3 - the last step + /// @dev execute a verified message to the designated receiver + /// @dev the execution provides the execution context (caller, extraData) to the receiver. the receiver can optionally assert the caller and validate the untrusted extraData + /// @dev cant reentrant because the payload is cleared before execution + /// @param _origin the origin of the message + /// @param _receiver the receiver of the message + /// @param _guid the guid of the message + /// @param _message the message + /// @param _extraData the extra data provided by the executor. this data is untrusted and should be validated. + function lzReceive( + Origin calldata _origin, + address _receiver, + bytes32 _guid, + bytes calldata _message, + bytes calldata _extraData + ) external payable { + // clear the payload first to prevent reentrancy, and then execute the message + _clearPayload(_receiver, _origin.srcEid, _origin.sender, _origin.nonce, abi.encodePacked(_guid, _message)); + ILayerZeroReceiver(_receiver).lzReceive{ value: msg.value }(_origin, _guid, _message, msg.sender, _extraData); + emit PacketDelivered(_origin, _receiver); + } + + /// @param _origin the origin of the message + /// @param _receiver the receiver of the message + /// @param _guid the guid of the message + /// @param _message the message + /// @param _extraData the extra data provided by the executor. + /// @param _reason the reason for failure + function lzReceiveAlert( + Origin calldata _origin, + address _receiver, + bytes32 _guid, + uint256 _gas, + uint256 _value, + bytes calldata _message, + bytes calldata _extraData, + bytes calldata _reason + ) external { + emit LzReceiveAlert(_receiver, msg.sender, _origin, _guid, _gas, _value, _message, _extraData, _reason); + } + + /// @dev Oapp uses this interface to clear a message. + /// @dev this is a PULL mode versus the PUSH mode of lzReceive + /// @dev the cleared message can be ignored by the app (effectively burnt) + /// @dev authenticated by oapp + /// @param _origin the origin of the message + /// @param _guid the guid of the message + /// @param _message the message + function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external { + _assertAuthorized(_oapp); + + bytes memory payload = abi.encodePacked(_guid, _message); + _clearPayload(_oapp, _origin.srcEid, _origin.sender, _origin.nonce, payload); + emit PacketDelivered(_origin, _oapp); + } + + /// @dev allows reconfiguration to recover from wrong configurations + /// @dev users should never approve the EndpointV2 contract to spend their non-layerzero tokens + /// @dev override this function if the endpoint is charging ERC20 tokens as native + /// @dev only owner + /// @param _lzToken the new layer zero token address + function setLzToken(address _lzToken) public virtual onlyOwner { + lzToken = _lzToken; + emit LzTokenSet(_lzToken); + } + + /// @dev recover the token sent to this contract by mistake + /// @dev only owner + /// @param _token the token to recover. if 0x0 then it is native token + /// @param _to the address to send the token to + /// @param _amount the amount to send + function recoverToken(address _token, address _to, uint256 _amount) external onlyOwner { + Transfer.nativeOrToken(_token, _to, _amount); + } + + /// @dev handling token payments on endpoint. the sender must approve the endpoint to spend the token + /// @dev internal function + /// @param _token the token to pay + /// @param _required the amount required + /// @param _supplied the amount supplied + /// @param _receiver the receiver of the token + function _payToken( + address _token, + uint256 _required, + uint256 _supplied, + address _receiver, + address _refundAddress + ) internal { + if (_required > 0) { + Transfer.token(_token, _receiver, _required); + } + if (_required < _supplied) { + unchecked { + // refund the excess + Transfer.token(_token, _refundAddress, _supplied - _required); + } + } + } + + /// @dev handling native token payments on endpoint + /// @dev override this if the endpoint is charging ERC20 tokens as native + /// @dev internal function + /// @param _required the amount required + /// @param _supplied the amount supplied + /// @param _receiver the receiver of the native token + /// @param _refundAddress the address to refund the excess to + function _payNative( + uint256 _required, + uint256 _supplied, + address _receiver, + address _refundAddress + ) internal virtual { + if (_required > 0) { + Transfer.native(_receiver, _required); + } + if (_required < _supplied) { + unchecked { + // refund the excess + Transfer.native(_refundAddress, _supplied - _required); + } + } + } + + /// @dev get the balance of the lzToken as the supplied lzToken fee if payInLzToken is true + function _suppliedLzToken(bool _payInLzToken) internal view returns (uint256 supplied) { + if (_payInLzToken) { + supplied = IERC20(lzToken).balanceOf(address(this)); + + // if payInLzToken is true, the supplied fee must be greater than 0 to prevent a race condition + // in which an oapp sending a message with lz token and the lz token is set to a new token between the tx + // being sent and the tx being mined. if the required lz token fee is 0 and the old lz token would be + // locked in the contract instead of being refunded + if (supplied == 0) revert Errors.LZ_ZeroLzTokenFee(); + } + } + + /// @dev override this if the endpoint is charging ERC20 tokens as native + function _suppliedNative() internal view virtual returns (uint256) { + return msg.value; + } + + /// @dev Assert the required fees and the supplied fees are enough + function _assertMessagingFee( + MessagingFee memory _required, + uint256 _suppliedNativeFee, + uint256 _suppliedLzTokenFee + ) internal pure { + if (_required.nativeFee > _suppliedNativeFee || _required.lzTokenFee > _suppliedLzTokenFee) { + revert Errors.LZ_InsufficientFee( + _required.nativeFee, + _suppliedNativeFee, + _required.lzTokenFee, + _suppliedLzTokenFee + ); + } + } + + /// @dev override this if the endpoint is charging ERC20 tokens as native + /// @return 0x0 if using native. otherwise the address of the native ERC20 token + function nativeToken() external view virtual returns (address) { + return address(0x0); + } + + /// @notice delegate is authorized by the oapp to configure anything in layerzero + function setDelegate(address _delegate) external { + delegates[msg.sender] = _delegate; + emit DelegateSet(msg.sender, _delegate); + } + + // ========================= Internal ========================= + function _initializable( + Origin calldata _origin, + address _receiver, + uint64 _lazyInboundNonce + ) internal view returns (bool) { + return + _lazyInboundNonce > 0 || // allowInitializePath already checked + ILayerZeroReceiver(_receiver).allowInitializePath(_origin); + } + + /// @dev bytes(0) payloadHash can never be submitted + function _verifiable( + Origin calldata _origin, + address _receiver, + uint64 _lazyInboundNonce + ) internal view returns (bool) { + return + _origin.nonce > _lazyInboundNonce || // either initializing an empty slot or reverifying + inboundPayloadHash[_receiver][_origin.srcEid][_origin.sender][_origin.nonce] != EMPTY_PAYLOAD_HASH; // only allow reverifying if it hasn't been executed + } + + /// @dev assert the caller to either be the oapp or the delegate + function _assertAuthorized(address _oapp) internal view override(MessagingChannel, MessageLibManager) { + if (msg.sender != _oapp && msg.sender != delegates[_oapp]) revert Errors.LZ_Unauthorized(); + } + + // ========================= VIEW FUNCTIONS FOR OFFCHAIN ONLY ========================= + // Not involved in any state transition function. + // ==================================================================================== + function initializable(Origin calldata _origin, address _receiver) external view returns (bool) { + return _initializable(_origin, _receiver, lazyInboundNonce[_receiver][_origin.srcEid][_origin.sender]); + } + + function verifiable(Origin calldata _origin, address _receiver) external view returns (bool) { + return _verifiable(_origin, _receiver, lazyInboundNonce[_receiver][_origin.srcEid][_origin.sender]); + } +} diff --git a/protocol/test/forge/lz-devtools/mocks/MessagingComposerMock.sol b/protocol/test/forge/lz-devtools/mocks/MessagingComposerMock.sol new file mode 100644 index 000000000..8de68fa7c --- /dev/null +++ b/protocol/test/forge/lz-devtools/mocks/MessagingComposerMock.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: LZBL-1.2 + +pragma solidity ^0.8.20; + +// @note Forked from https://github.com/LayerZero-Labs/LayerZero-v2/blob/1fde89479fdc68b1a54cda7f19efa84483fcacc4/protocol/contracts/MessagingComposer.sol#L67 +// but commented out lzComposeAlert() for stack to deep under `forge coverage` + +import { IMessagingComposer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingComposer.sol"; +import { ILayerZeroComposer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroComposer.sol"; +import { Errors } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Errors.sol"; + +abstract contract MessagingComposerMock is IMessagingComposer { + bytes32 private constant NO_MESSAGE_HASH = bytes32(0); + bytes32 private constant RECEIVED_MESSAGE_HASH = bytes32(uint256(1)); + + mapping(address from => mapping(address to => mapping(bytes32 guid => mapping(uint16 index => bytes32 messageHash)))) + public composeQueue; + + /// @dev the Oapp sends the lzCompose message to the endpoint + /// @dev the composer MUST assert the sender because anyone can send compose msg with this function + /// @dev with the same GUID, the Oapp can send compose to multiple _composer at the same time + /// @dev authenticated by the msg.sender + /// @param _to the address which will receive the composed message + /// @param _guid the message guid + /// @param _message the message + function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external { + // must have not been sent before + if (composeQueue[msg.sender][_to][_guid][_index] != NO_MESSAGE_HASH) revert Errors.LZ_ComposeExists(); + composeQueue[msg.sender][_to][_guid][_index] = keccak256(_message); + emit ComposeSent(msg.sender, _to, _guid, _index, _message); + } + + /// @dev execute a composed messages from the sender to the composer (receiver) + /// @dev the execution provides the execution context (caller, extraData) to the receiver. + /// the receiver can optionally assert the caller and validate the untrusted extraData + /// @dev can not re-entrant + /// @param _from the address which sends the composed message. in most cases, it is the Oapp's address. + /// @param _to the address which receives the composed message + /// @param _guid the message guid + /// @param _message the message + /// @param _extraData the extra data provided by the executor. this data is untrusted and should be validated. + function lzCompose( + address _from, + address _to, + bytes32 _guid, + uint16 _index, + bytes calldata _message, + bytes calldata _extraData + ) external payable { + // assert the validity + bytes32 expectedHash = composeQueue[_from][_to][_guid][_index]; + bytes32 actualHash = keccak256(_message); + if (expectedHash != actualHash) revert Errors.LZ_ComposeNotFound(expectedHash, actualHash); + + // marks the message as received to prevent reentrancy + // cannot just delete the value, otherwise the message can be sent again and could result in some undefined behaviour + // even though the sender(composing Oapp) is implicitly fully trusted by the composer. + // eg. sender may not even realize it has such a bug + composeQueue[_from][_to][_guid][_index] = RECEIVED_MESSAGE_HASH; + ILayerZeroComposer(_to).lzCompose{ value: msg.value }(_from, _guid, _message, msg.sender, _extraData); + emit ComposeDelivered(_from, _to, _guid, _index); + } + + // /// @param _from the address which sends the composed message + // /// @param _to the address which receives the composed message + // /// @param _guid the message guid + // /// @param _message the message + // /// @param _extraData the extra data provided by the executor + // /// @param _reason the reason why the message is not received + // function lzComposeAlert( + // address _from, + // address _to, + // bytes32 _guid, + // uint16 _index, + // uint256 _gas, + // uint256 _value, + // bytes calldata _message, + // bytes calldata _extraData, + // bytes calldata _reason + // ) external { + // // emit LzComposeAlert(_from, _to, msg.sender, _guid, _index, _gas, _value, _message, _extraData, _reason); + // } +} diff --git a/protocol/test/forge/lz-devtools/mocks/SendUln302Mock.sol b/protocol/test/forge/lz-devtools/mocks/SendUln302Mock.sol new file mode 100644 index 000000000..d171ca9cb --- /dev/null +++ b/protocol/test/forge/lz-devtools/mocks/SendUln302Mock.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: LZBL-1.2 +pragma solidity ^0.8.22; + +// @dev oz4/5 breaking change... Ownable constructor +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +// structs +import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { ExecutorConfig } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import { UlnConfig } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; + +// contracts +import { SendUlnBase } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/SendUlnBase.sol"; +import { SendLibBaseE2, WorkerOptions } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBaseE2.sol"; +import { SetConfigParam } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; + +import { TestHelperOz5 } from "../TestHelperOz5.sol"; + +contract SendUln302Mock is SendUlnBase, SendLibBaseE2 { + // offchain packets schedule + TestHelperOz5 public testHelper; + + uint32 internal constant CONFIG_TYPE_EXECUTOR = 1; + uint32 internal constant CONFIG_TYPE_ULN = 2; + + error LZ_ULN_InvalidConfigType(uint32 configType); + + constructor( + address payable _verifyHelper, + address _endpoint, + uint256 _treasuryGasCap, + uint256 _treasuryGasForFeeCap + ) Ownable(msg.sender) SendLibBaseE2(_endpoint, _treasuryGasCap, _treasuryGasForFeeCap) { + testHelper = TestHelperOz5(_verifyHelper); + } + + // ============================ OnlyEndpoint =================================== + + // on the send side the user can config both the executor and the ULN + function setConfig(address _oapp, SetConfigParam[] calldata _params) external override onlyEndpoint { + for (uint256 i = 0; i < _params.length; i++) { + SetConfigParam calldata param = _params[i]; + _assertSupportedEid(param.eid); + if (param.configType == CONFIG_TYPE_EXECUTOR) { + _setExecutorConfig(param.eid, _oapp, abi.decode(param.config, (ExecutorConfig))); + } else if (param.configType == CONFIG_TYPE_ULN) { + _setUlnConfig(param.eid, _oapp, abi.decode(param.config, (UlnConfig))); + } else { + revert LZ_ULN_InvalidConfigType(param.configType); + } + } + } + + // ============================ View =================================== + + function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view override returns (bytes memory) { + if (_configType == CONFIG_TYPE_EXECUTOR) { + return abi.encode(getExecutorConfig(_oapp, _eid)); + } else if (_configType == CONFIG_TYPE_ULN) { + return abi.encode(getUlnConfig(_oapp, _eid)); + } else { + revert LZ_ULN_InvalidConfigType(_configType); + } + } + + function version() external pure override returns (uint64 major, uint8 minor, uint8 endpointVersion) { + return (3, 0, 2); + } + + function isSupportedEid(uint32 _eid) external view override returns (bool) { + return _isSupportedEid(_eid); + } + + // ============================ Internal =================================== + + function _quoteVerifier( + address _sender, + uint32 _dstEid, + WorkerOptions[] memory _options + ) internal view override returns (uint256) { + return _quoteDVNs(_sender, _dstEid, _options); + } + + function _payVerifier( + Packet calldata _packet, + WorkerOptions[] memory _options + ) internal override returns (uint256 otherWorkerFees, bytes memory encodedPacket) { + (otherWorkerFees, encodedPacket) = _payDVNs(fees, _packet, _options); + } + + function _splitOptions( + bytes calldata _options + ) internal pure override returns (bytes memory, WorkerOptions[] memory) { + return _splitUlnOptions(_options); + } + + function send( + Packet calldata _packet, + bytes calldata _options, + bool _payInLzToken + ) public override returns (MessagingFee memory fee, bytes memory encodedPacket) { + (fee, encodedPacket) = super.send(_packet, _options, _payInLzToken); + testHelper.schedulePacket(encodedPacket, _options); + } +} diff --git a/protocol/test/forge/lz-devtools/mocks/SimpleMessageLibMock.sol b/protocol/test/forge/lz-devtools/mocks/SimpleMessageLibMock.sol new file mode 100644 index 000000000..09f9f1703 --- /dev/null +++ b/protocol/test/forge/lz-devtools/mocks/SimpleMessageLibMock.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: LZBL-1.2 +pragma solidity ^0.8.22; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +import { IMessageLib, MessageLibType } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; +import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { ILayerZeroEndpointV2, MessagingFee, Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { Errors } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Errors.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { Transfer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Transfer.sol"; + +import { TestHelperOz5 } from "../TestHelperOz5.sol"; + +contract SimpleMessageLibMock is Ownable, ERC165 { + // offchain packets schedule + TestHelperOz5 public testHelper; + + using SafeERC20 for IERC20; + using PacketV1Codec for bytes; + + address public immutable endpoint; + address public immutable treasury; + uint32 public immutable localEid; + uint8 public constant PACKET_VERSION = 1; + + address public whitelistCaller; + + uint256 public lzTokenFee; + uint256 public nativeFee; + + bytes public defaultOption; + + error OnlyEndpoint(); + error OnlyWhitelistCaller(); + error InvalidEndpoint(address expected, address actual); + error ToIsAddressZero(); + error LzTokenIsAddressZero(); + error TransferFailed(); + + // only the endpoint can call SEND() and setConfig() + modifier onlyEndpoint() { + if (endpoint != msg.sender) { + revert OnlyEndpoint(); + } + _; + } + + // @dev oz4/5 breaking change... Ownable constructor + constructor(address payable _verifyHelper, address _endpoint) Ownable(msg.sender) { + testHelper = TestHelperOz5(_verifyHelper); + endpoint = _endpoint; + treasury = address(0x0); + localEid = ILayerZeroEndpointV2(_endpoint).eid(); + lzTokenFee = 99; + nativeFee = 100; + // defaultOption = Options.encodeLegacyOptionsType1(200000); + } + + function supportsInterface(bytes4 interfaceId) public view override returns (bool) { + return interfaceId == type(IMessageLib).interfaceId || super.supportsInterface(interfaceId); + } + + // no validation logic at all + function validatePacket(bytes calldata packetBytes) external { + if (whitelistCaller != address(0x0) && msg.sender != whitelistCaller) { + revert OnlyWhitelistCaller(); + } + Origin memory origin = Origin(packetBytes.srcEid(), packetBytes.sender(), packetBytes.nonce()); + ILayerZeroEndpointV2(endpoint).verify(origin, packetBytes.receiverB20(), keccak256(packetBytes.payload())); + } + + // ------------------ onlyEndpoint ------------------ + function send( + Packet calldata _packet, + bytes memory _options, + bool _payInLzToken + ) external onlyEndpoint returns (MessagingFee memory fee, bytes memory encodedPacket, bytes memory options) { + encodedPacket = PacketV1Codec.encode(_packet); + + options = _options.length == 0 ? defaultOption : _options; + _handleMessagingParamsHook(encodedPacket, options); + + fee = MessagingFee(nativeFee, _payInLzToken ? lzTokenFee : 0); + } + + // ------------------ onlyOwner ------------------ + function setDefaultOption(bytes memory _defaultOption) external onlyOwner { + defaultOption = _defaultOption; + } + + function setMessagingFee(uint256 _nativeFee, uint256 _lzTokenFee) external onlyOwner { + nativeFee = _nativeFee; + lzTokenFee = _lzTokenFee; + } + + function setWhitelistCaller(address _whitelistCaller) external onlyOwner { + whitelistCaller = _whitelistCaller; + } + + function withdrawFee(address _to, uint256 _amount) external onlyOwner { + if (_to == address(0x0)) { + revert ToIsAddressZero(); + } + + address altTokenAddr = ILayerZeroEndpointV2(endpoint).nativeToken(); + + // transfers native if altTokenAddr == address(0x0) + Transfer.nativeOrToken(altTokenAddr, _to, _amount); + } + + function withdrawLzTokenFee(address _to, uint256 _amount) external onlyOwner { + if (_to == address(0x0)) { + revert ToIsAddressZero(); + } + address lzToken = ILayerZeroEndpointV2(endpoint).lzToken(); + if (lzToken == address(0x0)) { + revert LzTokenIsAddressZero(); + } + IERC20(lzToken).safeTransfer(_to, _amount); + } + + // ------------------ View ------------------ + function quote( + Packet calldata /*_packet*/, + bytes calldata /*_options*/, + bool _payInLzToken + ) external view returns (MessagingFee memory) { + return MessagingFee(nativeFee, _payInLzToken ? lzTokenFee : 0); + } + + function isSupportedEid(uint32) external pure returns (bool) { + return true; + } + + function version() external pure returns (uint64 major, uint8 minor, uint8 endpointVersion) { + return (0, 0, 2); + } + + function messageLibType() external pure returns (MessageLibType) { + return MessageLibType.SendAndReceive; + } + + // ------------------ Internal ------------------ + // function _handleMessagingParamsHook(bytes memory _encodedPacket, bytes memory _options) internal virtual {} + + function _handleMessagingParamsHook(bytes memory _encodedPacket, bytes memory _options) internal virtual { + testHelper.schedulePacket(_encodedPacket, _options); + } + + fallback() external payable { + revert Errors.LZ_NotImplemented(); + } + + receive() external payable {} +} diff --git a/protocol/test/forge/TempleTest.sol b/protocol/test/forge/unit/TempleTest.sol similarity index 91% rename from protocol/test/forge/TempleTest.sol rename to protocol/test/forge/unit/TempleTest.sol index d03a4a344..535e4e71d 100644 --- a/protocol/test/forge/TempleTest.sol +++ b/protocol/test/forge/unit/TempleTest.sol @@ -1,4 +1,4 @@ -pragma solidity 0.8.20; +pragma solidity ^0.8.20; // SPDX-License-Identifier: AGPL-3.0-or-later import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; @@ -28,6 +28,12 @@ abstract contract TempleTest is Test { forkId = vm.createSelectFork(chain.rpcUrl, _blockNumber); } + // Fork using .env $_RPC_URL (or the default RPC URL), at latest blockNumber. Returns fork id + function fork(string memory chainAlias) internal returns (uint256) { + chain = getChain(chainAlias); + return vm.createSelectFork(chain.rpcUrl); + } + function dealAdditional(IERC20 token, address to, uint256 additionalAmount) internal { deal(address(token), to, token.balanceOf(to) + additionalAmount, true); } diff --git a/protocol/test/forge/admin/TempleTeamPaymentsFactory.t.sol b/protocol/test/forge/unit/admin/TempleTeamPaymentsFactory.t.sol similarity index 100% rename from protocol/test/forge/admin/TempleTeamPaymentsFactory.t.sol rename to protocol/test/forge/unit/admin/TempleTeamPaymentsFactory.t.sol diff --git a/protocol/test/forge/core/MultiOtcOffer.t.sol b/protocol/test/forge/unit/core/MultiOtcOffer.t.sol similarity index 100% rename from protocol/test/forge/core/MultiOtcOffer.t.sol rename to protocol/test/forge/unit/core/MultiOtcOffer.t.sol diff --git a/protocol/test/forge/core/OtcOffer.t.sol b/protocol/test/forge/unit/core/OtcOffer.t.sol similarity index 100% rename from protocol/test/forge/core/OtcOffer.t.sol rename to protocol/test/forge/unit/core/OtcOffer.t.sol diff --git a/protocol/test/forge/unit/templegold/SpiceAuction.t.sol b/protocol/test/forge/unit/templegold/SpiceAuction.t.sol new file mode 100644 index 000000000..7c8691636 --- /dev/null +++ b/protocol/test/forge/unit/templegold/SpiceAuction.t.sol @@ -0,0 +1,1026 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/SpiceAuction.t.sol) + +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { ISpiceAuction } from "contracts/interfaces/templegold/ISpiceAuction.sol"; +import { SpiceAuctionFactory } from "contracts/templegold/SpiceAuctionFactory.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; + +contract SpiceAuctionTestBase is TempleGoldCommon { + event Claim(address indexed user, uint256 epochId, uint256 bidTokenAmount, uint256 auctionTokenAmount); + event Deposit(address indexed depositor, uint256 epochId, uint256 amount); + event AuctionConfigSet(uint256 epoch, ISpiceAuction.SpiceAuctionConfig config); + event AuctionConfigRemoved(uint256 configId, uint256 epochId); + event AuctionStarted(uint256 epochId, address indexed starter, uint128 startTime, uint128 endTime, uint256 auctionTokenAmount); + event DaoExecutorSet(address daoExecutor); + event TokenRecovered(address indexed to, address indexed token, uint256 amount); + event CirculatingSupplyUpdated(address indexed sender, uint256 amount, uint256 circulatingSuppply, uint256 totalBurned); + event NotifierSet(address indexed notifier); + event RedeemedTempleGoldBurned(uint256 epochId, uint256 amount); + event OperatorSet(address indexed operator); + + address public daoExecutor = makeAddr("daoExecutor"); + FakeERC20 public templeToken; + TempleGoldStaking public staking; + + /// @notice Auctions run for minimum 1 week + uint32 public constant MINIMUM_AUCTION_PERIOD = 604_800; + + ISpiceAuction public spice; + SpiceAuctionFactory public factory; + TempleGold public templeGold; + StableGoldAuction public auction; + + function setUp() public { + fork("arbitrum_one", forkBlockNumber); + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + + templeGold = new TempleGold(initArgs); + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + staking = new TempleGoldStaking(rescuer, executor, address(templeToken), address(templeGold)); + factory = new SpiceAuctionFactory(rescuer, executor, daoExecutor, mike, address(templeGold), ARBITRUM_ONE_LZ_EID, uint32(arbitrumOneChainId)); + fakeERC20 = new FakeERC20("FAKE TOKEN", "FAKE", executor, 1000 ether); + auction = new StableGoldAuction( + address(templeGold), + address(fakeERC20), + treasury, + rescuer, + executor, + executor + ); + vm.startPrank(executor); + spice = ISpiceAuction(factory.createAuction(daiToken, NAME_ONE)); + templeGold.authorizeContract(address(spice), true); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(mike); + templeGold.setStableGoldAuction(address(auction)); + vm.stopPrank(); + } + + function test_initialization() public { + assertEq(spice.name(), NAME_ONE); + assertEq(spice.templeGold(), address(templeGold)); + assertEq(spice.spiceToken(), daiToken); + assertEq(spice.daoExecutor(), daoExecutor); + assertEq(spice.operator(), mike); + } + + function _getAuctionConfig() internal view returns (ISpiceAuction.SpiceAuctionConfig memory config) { + config.duration = 7 days; + config.waitPeriod = 2 weeks; + config.minimumDistributedAuctionToken = 1 ether; + config.starter = alice; + config.startCooldown = 1 hours; + config.isTempleGoldAuctionToken = true; + config.recipient = treasury; + } + + function _setAuctionConfig() private returns ( ISpiceAuction.SpiceAuctionConfig memory config){ + config = _getAuctionConfig(); + vm.startPrank(daoExecutor); + spice.setAuctionConfig(config); + vm.stopPrank(); + } + + function _startAuction(bool _setConfig, bool _sendAuctionTokens) internal returns ( ISpiceAuction.SpiceAuctionConfig memory config) { + if (_setConfig) { + config = _setAuctionConfig(); + } else { + uint256 epochId = spice.currentEpoch(); + config = spice.getAuctionConfig(epochId+1); + } + if (_sendAuctionTokens) { + address auctionToken = config.isTempleGoldAuctionToken ? address(templeGold) : spice.spiceToken(); + dealAdditional(IERC20(auctionToken), address(spice), 100 ether); + } + if (config.starter != address(0)) { vm.startPrank(config.starter); } + vm.warp(block.timestamp + config.waitPeriod); + spice.startAuction(); + } + + function _getAuctionToken(bool _isTempleGoldAuctionToken, address _spiceToken) internal view returns (address) { + return _isTempleGoldAuctionToken ? address(templeGold) : _spiceToken; + } + + function _setVestingFactor() internal { + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + } +} + +contract SpiceAuctionAccessTest is SpiceAuctionTestBase { + function test_access_setSpiceAuctionConfigFail() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.setAuctionConfig(_getAuctionConfig()); + } + + function test_access_setDaoExecutorFail() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.setDaoExecutor(alice); + } + + function test_access_removeSpiceAuctionConfigFail() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.removeAuctionConfig(); + } + + function test_access_setSpiceAuctionConfigSuccess() public { + vm.startPrank(daoExecutor); + spice.setAuctionConfig(_getAuctionConfig()); + } + + function test_access_removeSpiceAuctionConfigSuccess() public { + _startAuction(true, true); + vm.startPrank(daoExecutor); + spice.setAuctionConfig(_getAuctionConfig()); + spice.removeAuctionConfig(); + } +} + +contract SpiceAuctionViewTest is SpiceAuctionTestBase { + function test_getAuctionTokenForCurrentEpoch() public { + ISpiceAuction.SpiceAuctionConfig memory _config = _startAuction(true, true); + address auctionToken = _config.isTempleGoldAuctionToken ? address(templeGold) : spice.spiceToken(); + assertEq(auctionToken, spice.getAuctionTokenForCurrentEpoch()); + } + + function test_is_current_epoch_active() public { + assertEq(spice.isActive(), false); + ISpiceAuction.SpiceAuctionConfig memory _config = _startAuction(true, true); + assertEq(spice.isActive(), false); + skip(_config.startCooldown); + assertEq(spice.isActive(), true); + IAuctionBase.EpochInfo memory _info = spice.getEpochInfo(1); + vm.warp(_info.endTime); + assertEq(spice.isActive(), false); + } + + function test_getClaimableForEpoch() public { + // bid token == 0 + uint256 claimabale = spice.getClaimableForEpoch(alice, 0); + assertEq(claimabale, 0); + + _startAuction(true, true); + vm.startPrank(alice); + deal(daiToken, alice, 100 ether); + IERC20(daiToken).approve(address(spice), type(uint).max); + // epoch > 1 + claimabale = spice.getClaimableForEpoch(alice, 2); + assertEq(claimabale, 0); + /// @dev see claim and bid tests + } + + function test_currentEpoch() public { + /// @dev see claim and bid tests + } +} + +contract SpiceAuctionTest is SpiceAuctionTestBase { + function test_setDaoExecutor() public { + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.setDaoExecutor(address(0)); + + vm.expectEmit(address(spice)); + emit DaoExecutorSet(alice); + spice.setDaoExecutor(alice); + assertEq(spice.daoExecutor(), alice); + } + + function test_setSpiceAuctionConfig() public { + ISpiceAuction.SpiceAuctionConfig memory config = _getAuctionConfig(); + config.duration = 1; + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.setAuctionConfig(config); + // exceeds max duration + config.duration = 31 days; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.setAuctionConfig(config); + // exceeds max wait period + config.waitPeriod = 91 days; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.setAuctionConfig(config); + config.duration = 7 days; + // wait period error + config.waitPeriod = 0; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.setAuctionConfig(config); + config.waitPeriod = 60 hours; + // min distributed tokens error + config.minimumDistributedAuctionToken = 0; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.setAuctionConfig(config); + config.minimumDistributedAuctionToken = 1 ether; + // invalid recipient + config.recipient = address(0); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.setAuctionConfig(config); + config.recipient = treasury; + + uint256 epochId = spice.currentEpoch(); + vm.expectEmit(address(spice)); + emit AuctionConfigSet(1, config); + spice.setAuctionConfig(config); + + ISpiceAuction.SpiceAuctionConfig memory _config = spice.getAuctionConfig(epochId+1); + assertEq(spice.currentEpoch(), epochId); + assertEq(_config.recipient, treasury); + assertEq(_config.minimumDistributedAuctionToken, 1 ether); + assertEq(_config.waitPeriod, 60 hours); + assertEq(_config.duration, 7 days); + assertEq(_config.startCooldown, 1 hours); + assertEq(_config.starter, alice); + + _startAuction(false, true); + vm.warp(block.timestamp + _config.startCooldown); + // trying to set config for ongoing auction error + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.InvalidConfigOperation.selector)); + spice.setAuctionConfig(config); + } + + function test_removeAuctionConfig() public { + vm.startPrank(daoExecutor); + // revert , no config + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.InvalidConfigOperation.selector)); + spice.removeAuctionConfig(); + + ISpiceAuction.SpiceAuctionConfig memory _config = _startAuction(true, true); + vm.warp(block.timestamp + _config.startCooldown); + vm.startPrank(daoExecutor); + // revert , auction active + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.InvalidConfigOperation.selector)); + spice.removeAuctionConfig(); + + // config set but auction not started + IAuctionBase.EpochInfo memory info = spice.getEpochInfo(1); + vm.warp(info.endTime + _config.waitPeriod); + _config = _getAuctionConfig(); + spice.setAuctionConfig(_config); + + vm.expectEmit(address(spice)); + emit AuctionConfigRemoved(2, 0); + spice.removeAuctionConfig(); + + ISpiceAuction.SpiceAuctionConfig memory _emptyConfig = spice.getAuctionConfig(2); + assertEq(_emptyConfig.duration, 0); + assertEq(_emptyConfig.waitPeriod, 0); + assertEq(_emptyConfig.startCooldown, 0); + assertEq(_emptyConfig.minimumDistributedAuctionToken, 0); + assertEq(_emptyConfig.starter, address(0)); + assertEq(_emptyConfig.isTempleGoldAuctionToken, false); + assertEq(_emptyConfig.recipient, address(0)); + assertEq(spice.currentEpoch(), 1); + + // config set and auction started but cooldown not reached + _config = _startAuction(true, true); + // epochId is now 2 for SpiceAuctionConfig and EpochInfo + info = spice.getEpochInfo(2); + // warp below start time (this includes cooldown) + vm.warp(info.startTime - 10 seconds); + vm.startPrank(daoExecutor); + vm.expectEmit(address(spice)); + emit AuctionConfigRemoved(2, 2); // meaning Ids 2 were deleted + spice.removeAuctionConfig(); + + _emptyConfig = spice.getAuctionConfig(2); + assertEq(_emptyConfig.duration, 0); + assertEq(_emptyConfig.waitPeriod, 0); + assertEq(_emptyConfig.startCooldown, 0); + assertEq(_emptyConfig.minimumDistributedAuctionToken, 0); + assertEq(_emptyConfig.starter, address(0)); + assertEq(_emptyConfig.isTempleGoldAuctionToken, false); + assertEq(_emptyConfig.recipient, address(0)); + assertEq(spice.currentEpoch(), 1); + vm.warp(info.endTime+_config.waitPeriod); + + // some more auction and try to delete old ended auction + _config = _startAuction(true, true); + vm.startPrank(daoExecutor); + uint256 currentEpoch = spice.currentEpoch(); + info = spice.getEpochInfo(currentEpoch); + vm.warp(info.endTime + _config.waitPeriod); + _config = _startAuction(true, true); + vm.startPrank(daoExecutor); + currentEpoch = spice.currentEpoch(); + info = spice.getEpochInfo(currentEpoch); + vm.warp(info.endTime + _config.waitPeriod); + _config = _startAuction(true, true); + vm.startPrank(daoExecutor); + currentEpoch = spice.currentEpoch(); + info = spice.getEpochInfo(currentEpoch); + // auction ended + vm.warp(info.endTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionEnded.selector)); + spice.removeAuctionConfig(); + } + + function test_recoverAuctionTokenForZeroBidAuction() public { + vm.startPrank(daoExecutor); + // revert, zero address + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.recoverAuctionTokenForZeroBidAuction(0, address(0)); + // invalid epoch + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + spice.recoverAuctionTokenForZeroBidAuction(1, alice); + + _startAuction(true, true); + IAuctionBase.EpochInfo memory info = spice.getEpochInfo(1); + vm.startPrank(daoExecutor); + vm.warp(info.startTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionActive.selector)); + spice.recoverAuctionTokenForZeroBidAuction(1, alice); + vm.startPrank(bob); + uint256 bidAmount = 10 ether; + deal(daiToken, bob, bidAmount); + IERC20(daiToken).approve(address(spice), type(uint).max); + spice.bid(bidAmount); + uint256 epochOneTotalAuctionTokenAmount = info.totalAuctionTokenAmount; + ISpiceAuction.SpiceAuctionConfig memory _config = spice.getAuctionConfig(1); + vm.warp(info.endTime + _config.waitPeriod); + // fail for epoch with bid + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + spice.recoverAuctionTokenForZeroBidAuction(1, alice); + + _startAuction(true, true); + info = spice.getEpochInfo(2); + _config = spice.getAuctionConfig(2); + vm.warp(info.endTime + _config.waitPeriod); + address auctionToken = spice.getAuctionTokenForCurrentEpoch(); + uint256 auctionTokenBalance = IERC20(auctionToken).balanceOf(address(spice)); + uint256 auctionTokenAmount = info.totalAuctionTokenAmount; + uint256 aliceBalance = IERC20(auctionToken).balanceOf(alice); + vm.startPrank(daoExecutor); + + assertEq(spice.epochsWithoutBidsRecovered(2), false); + vm.expectEmit(address(spice)); + emit TokenRecovered(alice, auctionToken, auctionTokenAmount); + spice.recoverAuctionTokenForZeroBidAuction(2, alice); + assertEq(IERC20(auctionToken).balanceOf(address(spice)), auctionTokenBalance - auctionTokenAmount); + assertEq(IERC20(auctionToken).balanceOf(alice), aliceBalance + auctionTokenAmount); + + // bidders from previous auction can claim + vm.startPrank(bob); + uint256 bobBalance = IERC20(auctionToken).balanceOf(bob); + spice.claim(1); + assertEq(IERC20(auctionToken).balanceOf(bob), bobBalance + epochOneTotalAuctionTokenAmount); + assertEq(spice.epochsWithoutBidsRecovered(2), true); + + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AlreadyRecovered.selector)); + spice.recoverAuctionTokenForZeroBidAuction(2, executor); + } + + function test_recoverToken_spice() public { + vm.startPrank(daoExecutor); + address _fakeErc20TokenAddress = address(fakeERC20); + // revert, invalid params + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.recoverToken(_fakeErc20TokenAddress, address(0), 0); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.recoverToken(_fakeErc20TokenAddress, alice, 0); + + dealAdditional(IERC20(_fakeErc20TokenAddress), address(spice), 50 ether); + vm.expectEmit(address(spice)); + emit TokenRecovered(alice, _fakeErc20TokenAddress, 50 ether); + spice.recoverToken(_fakeErc20TokenAddress, alice, 50 ether); + assertEq(fakeERC20.balanceOf(alice), 50 ether); + + address _spiceToken = spice.spiceToken(); + address _templeGold = address(templeGold); + uint256 recoverAmount = 1 ether; + // _currentEpochId = 0 + // recover bid token, wrong amount + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.recoverToken(_spiceToken, alice, recoverAmount+1); + + uint256 daoDaiBalanceBefore = IERC20(daiToken).balanceOf(daoExecutor); + deal(address(daiToken), address(spice), recoverAmount, true); + vm.expectEmit(address(spice)); + emit TokenRecovered(daoExecutor, daiToken, recoverAmount); + vm.startPrank(daoExecutor); + spice.recoverToken(_spiceToken, address(daoExecutor), recoverAmount); + assertEq(recoverAmount+daoDaiBalanceBefore, IERC20(daiToken).balanceOf(daoExecutor)); + + _startAuction(true, true); + IAuctionBase.EpochInfo memory info = spice.getEpochInfo(1); + vm.startPrank(daoExecutor); + // cooldown still pending + vm.warp(info.startTime - 60 seconds); + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.RemoveAuctionConfig.selector)); + spice.recoverToken(_spiceToken, alice, recoverAmount); + + vm.warp(info.startTime); + // auction active + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.RemoveAuctionConfig.selector)); + spice.recoverToken(_spiceToken, alice, recoverAmount); + vm.warp(info.endTime - 1); + + // some bids + deal(daiToken, alice, 100 ether); + deal(daiToken, bob, 100 ether); + uint256 bidTokenAmount = 10 ether; + vm.startPrank(alice); + IERC20(daiToken).approve(address(spice), type(uint).max); + spice.bid(bidTokenAmount); + vm.startPrank(bob); + IERC20(daiToken).approve(address(spice), type(uint).max); + spice.bid(bidTokenAmount); + vm.startPrank(daoExecutor); + + // auction still active + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.RemoveAuctionConfig.selector)); + spice.recoverToken(_spiceToken, alice, recoverAmount); + // auction ended + vm.warp(info.endTime); + IERC20 spiceTokenErc20 = IERC20(_spiceToken); + dealAdditional(IERC20(daiToken), address(spice), recoverAmount); + uint256 auctionTokenAllocation = info.totalAuctionTokenAmount; + uint256 spiceBidTokenBalance = spiceTokenErc20.balanceOf(address(spice)); + uint256 aliceBidTokenBalance = spiceTokenErc20.balanceOf(address(alice)); + + // recover bid token, wrong amount + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.recoverToken(_spiceToken, alice, recoverAmount+1); + // can recover bid token + vm.expectEmit(address(spice)); + emit TokenRecovered(alice, daiToken, recoverAmount); + spice.recoverToken(daiToken, alice, recoverAmount); + assertEq(aliceBidTokenBalance+recoverAmount, spiceTokenErc20.balanceOf(alice)); + assertEq(spiceBidTokenBalance-recoverAmount, spiceTokenErc20.balanceOf(address(spice))); + + // recover auction token, wrong amount + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.recoverToken(_templeGold, alice, recoverAmount+1); + + dealAdditional(IERC20(_templeGold), address(spice), recoverAmount); + uint256 spiceTempleGoldBalance = templeGold.balanceOf(address(spice)); + uint256 aliceTempleGoldBalance = templeGold.balanceOf(alice); + // recover auction token + vm.expectEmit(address(spice)); + emit TokenRecovered(alice, _templeGold, recoverAmount); + spice.recoverToken(_templeGold, alice, recoverAmount); + assertEq(spiceTempleGoldBalance-recoverAmount, templeGold.balanceOf(address(spice))); + assertEq(aliceTempleGoldBalance+recoverAmount, templeGold.balanceOf(alice)); + + // after recover users can still claim + vm.startPrank(alice); + uint256 aliceClaimable = spice.getClaimableForEpoch(alice, 1); + uint256 bobClaimable = spice.getClaimableForEpoch(bob, 1); + vm.expectEmit(address(spice)); + emit Claim(alice, 1, bidTokenAmount, aliceClaimable); + spice.claim(1); + vm.startPrank(bob); + vm.expectEmit(address(spice)); + emit Claim(bob, 1, bidTokenAmount, bobClaimable); + spice.claim(1); + assertEq(auctionTokenAllocation, bobClaimable+aliceClaimable); + } + + function test_startSpiceAuction() public { + // cannot start auction without setting configuration + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotStartAuction.selector)); + spice.startAuction(); + + // set config + vm.startPrank(daoExecutor); + ISpiceAuction.SpiceAuctionConfig memory _config = _getAuctionConfig(); + spice.setAuctionConfig(_config); + + // not starter + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.startAuction(); + + // time less than wait period + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotStartAuction.selector)); + spice.startAuction(); + vm.warp(block.timestamp + _config.waitPeriod); + // not enough auction tokens to bid. type AUCTION_TOKEN_BALANCE + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.NotEnoughAuctionTokens.selector)); + spice.startAuction(); + + IERC20 auctionToken = IERC20(_getAuctionToken(_config.isTempleGoldAuctionToken, daiToken)); + dealAdditional(auctionToken, address(spice), 100 ether); + uint256 epoch = spice.currentEpoch(); + IAuctionBase.EpochInfo memory epochInfo = spice.getEpochInfo(epoch); + uint64 startTime = uint64(block.timestamp + _config.startCooldown); + uint64 endTime = uint64(startTime+_config.duration); + vm.expectEmit(address(spice)); + emit AuctionStarted(epoch+1, alice, startTime, endTime, 100 ether); + spice.startAuction(); + + epochInfo = spice.getEpochInfo(epoch+1); + assertEq(spice.currentEpoch(), epoch+1); + assertEq(epochInfo.startTime, uint128(block.timestamp+_config.startCooldown)); + assertEq(epochInfo.endTime, uint128(epochInfo.startTime+_config.duration)); + assertEq(epochInfo.totalAuctionTokenAmount, 100 ether); + assertEq(epochInfo.totalBidTokenAmount, 0); + assertEq(auctionToken.balanceOf(address(spice)), 100 ether); + assertEq(epochInfo.endTime - epochInfo.startTime, _config.duration); + + // warp to end and start second auction + vm.warp(epochInfo.endTime); + _config = _getAuctionConfig(); + // any address can start auction + _config.starter = address(0); + _config.startCooldown = 0; + vm.startPrank(daoExecutor); + spice.setAuctionConfig(_config); + // epoch > 0 + // cannot start auction, waitPeriod error. wait period from previous auction config is used + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotStartAuction.selector)); + spice.startAuction(); + + // not enough auction tokens + vm.warp(epochInfo.endTime + _config.waitPeriod); + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.NotEnoughAuctionTokens.selector)); + spice.startAuction(); + + dealAdditional(IERC20(_getAuctionToken(_config.isTempleGoldAuctionToken, daiToken)), address(spice), 50 ether); + epoch = spice.currentEpoch(); + startTime = uint64(block.timestamp+_config.startCooldown); + endTime = uint64(startTime+_config.duration); + vm.expectEmit(address(spice)); + emit AuctionStarted(epoch+1, daoExecutor, startTime, endTime, 50 ether); + spice.startAuction(); + + // another auction , another auction token, user action to start auction + _config = _getAuctionConfig(); + _config.isTempleGoldAuctionToken = false; + _config.starter = address(0); + epoch = spice.currentEpoch(); + epochInfo = spice.getEpochInfo(epoch); + vm.warp(epochInfo.endTime + _config.waitPeriod); + spice.setAuctionConfig(_config); + // even for user first bid, auction tokens should not be less than configured value + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.NotEnoughAuctionTokens.selector)); + spice.startAuction(); + + startTime = uint64(block.timestamp + _config.startCooldown); + endTime = uint64(startTime+_config.duration); + deal(daiToken, address(spice), 30 ether, true); + vm.expectEmit(address(spice)); + emit AuctionStarted(epoch+1, daoExecutor, startTime, endTime, 30 ether); + spice.startAuction(); + epoch = spice.currentEpoch(); + epochInfo = spice.getEpochInfo(epoch); + assertEq(epochInfo.startTime, startTime); + assertEq(epochInfo.endTime, endTime); + + assertEq(IERC20(daiToken).balanceOf(address(spice)), 30 ether); + assertEq(templeGold.balanceOf(address(spice)), 150 ether); + } + + function test_bidSpiceAuction() public { + deal(daiToken, alice, 100 ether); + deal(daiToken, bob, 100 ether); + uint256 aliceBidAmount = 20 ether; + uint256 bobBidAmount = 30 ether; + // cannot deposit + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotDeposit.selector)); + spice.bid(10 ether); + + // start auction + ISpiceAuction.SpiceAuctionConfig memory _config = _startAuction(true, true); + uint256 epoch = spice.currentEpoch(); + IAuctionBase.EpochInfo memory epochInfo = spice.getEpochInfo(epoch); + vm.warp(epochInfo.startTime); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.bid(0); + + IERC20(daiToken).approve(address(spice), type(uint).max); + vm.expectEmit(address(spice)); + emit Deposit(alice, epoch, aliceBidAmount); + spice.bid(aliceBidAmount); + + assertEq(spice.getAuctionBidAmount(1), aliceBidAmount); + assertEq(spice.getAuctionTokenAmount(1), 100 ether); + assertEq(IERC20(daiToken).balanceOf(alice), 100 ether-aliceBidAmount); + assertEq(IERC20(daiToken).balanceOf(_config.recipient), aliceBidAmount); + epochInfo = spice.getEpochInfo(epoch); + assertEq(epochInfo.totalBidTokenAmount, aliceBidAmount); + assertEq(spice.getAuctionBidAmount(1), epochInfo.totalBidTokenAmount); + assertEq(epochInfo.totalAuctionTokenAmount, 100 ether); + assertEq(spice.depositors(alice, epoch), aliceBidAmount); + assertEq(spice.getClaimableForEpoch(alice, epoch), 100 ether); + + // bob bidding + vm.startPrank(bob); + IERC20(daiToken).approve(address(spice), type(uint).max); + vm.expectEmit(address(spice)); + emit Deposit(bob, epoch, bobBidAmount); + spice.bid(bobBidAmount); + + assertEq(spice.getAuctionBidAmount(1), aliceBidAmount+bobBidAmount); + assertEq(spice.getAuctionTokenAmount(1), 100 ether); + assertEq(IERC20(daiToken).balanceOf(alice), 100 ether-aliceBidAmount); + assertEq(IERC20(daiToken).balanceOf(_config.recipient), aliceBidAmount+bobBidAmount); + epochInfo = spice.getEpochInfo(epoch); + assertEq(epochInfo.totalBidTokenAmount, aliceBidAmount+bobBidAmount); + assertEq(epochInfo.totalAuctionTokenAmount, 100 ether); + assertEq(spice.depositors(alice, epoch), aliceBidAmount); + assertEq(spice.depositors(bob, epoch), bobBidAmount); + assertEq(spice.getClaimableForEpoch(alice, epoch), 40 ether); + assertEq(spice.getClaimableForEpoch(bob, epoch), 60 ether); + + // bob bids more + spice.bid(50 ether); + assertEq(spice.getAuctionBidAmount(1), 50 ether+aliceBidAmount+bobBidAmount); + assertEq(spice.getAuctionTokenAmount(1), 100 ether); + assertEq(IERC20(daiToken).balanceOf(alice), 100 ether-aliceBidAmount); + assertEq(IERC20(daiToken).balanceOf(treasury), aliceBidAmount+bobBidAmount+50 ether); + epochInfo = spice.getEpochInfo(epoch); + assertEq(epochInfo.totalBidTokenAmount, aliceBidAmount+bobBidAmount+50 ether); + assertEq(epochInfo.totalAuctionTokenAmount, 100 ether); + assertEq(spice.depositors(alice, epoch), aliceBidAmount); + assertEq(spice.depositors(bob, epoch), bobBidAmount+50 ether); + assertEq(spice.getClaimableForEpoch(alice, epoch), 100 ether * 20/100); + assertEq(spice.getClaimableForEpoch(bob, epoch), 100 ether * 80/100); + } + + function test_claimSpiceAuction() public { + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + spice.claim(1); + ISpiceAuction.SpiceAuctionConfig memory _config = _startAuction(true, true); + uint256 epoch = spice.currentEpoch(); + IAuctionBase.EpochInfo memory epochInfo = spice.getEpochInfo(epoch); + // cannot claim before active auction + vm.warp(epochInfo.startTime - 1); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, 1)); + spice.claim(1); + vm.warp(epochInfo.startTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, 1)); + spice.claim(1); + vm.warp(epochInfo.endTime+_config.waitPeriod); + + _config = _startAuction(true, true); + epoch = spice.currentEpoch(); + epochInfo = spice.getEpochInfo(epoch); + vm.warp(epochInfo.startTime+_config.startCooldown); + + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.claim(1); + + deal(daiToken, alice, 100 ether); + deal(daiToken, bob, 100 ether); + uint256 aliceBidAmount = 20 ether; + uint256 bobBidAmount = 30 ether; + + IERC20(daiToken).approve(address(spice), type(uint).max); + spice.bid(aliceBidAmount); + + vm.startPrank(bob); + IERC20(daiToken).approve(address(spice), type(uint).max); + spice.bid(bobBidAmount); + + // still cannot claim because auction is not ended + epoch = spice.currentEpoch(); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, epoch)); + spice.claim(epoch); + epochInfo = spice.getEpochInfo(epoch); + vm.warp(epochInfo.endTime+_config.waitPeriod); + uint256 bobTGoldBalance = templeGold.balanceOf(bob); + uint256 aliceTGoldBalance = templeGold.balanceOf(alice); + uint256 bobClaimAmount = spice.getClaimableForEpoch(bob, epoch); + uint256 aliceClaimAmount = spice.getClaimableForEpoch(alice, epoch); + vm.expectEmit(address(spice)); + emit Claim(bob, epoch, bobBidAmount, bobClaimAmount); + spice.claim(epoch); + assertEq(templeGold.balanceOf(bob), bobTGoldBalance+bobClaimAmount); + assertEq(bobClaimAmount, 100 ether * 30/50); + + vm.startPrank(alice); + vm.expectEmit(address(spice)); + emit Claim(alice, epoch, aliceBidAmount, aliceClaimAmount); + spice.claim(epoch); + assertEq(templeGold.balanceOf(alice), aliceTGoldBalance+aliceClaimAmount); + assertEq(aliceClaimAmount, 100 ether * 20/50); + + assertEq(spice.getClaimableForEpoch(alice, epoch), 0); + assertEq(spice.getClaimableForEpoch(alice, epoch+1), 0); + assertEq(spice.claimedAmount(alice, epoch), aliceClaimAmount); + assertEq(spice.claimed(alice, epoch), true); + + // try to claim and fail + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AlreadyClaimed.selector)); + spice.claim(epoch); + } + + function test_claim_tgld_is_bid_token() public { + { + _setVestingFactor(); + // authorize for transfers + vm.startPrank(executor); + templeGold.authorizeContract(mike, true); + templeGold.authorizeContract(treasury, true); + skip(4 weeks); + templeGold.mint(); + // team gnosis + vm.startPrank(mike); + // distribute TGLD to alice and bob + IERC20(templeGold).transfer(bob, 100 ether); + IERC20(templeGold).transfer(alice, 100 ether); + } + + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + spice.claim(1); + + uint256 aliceBidAmount = 20 ether; + uint256 bobBidAmount = 30 ether; + + ISpiceAuction.SpiceAuctionConfig memory config = _getAuctionConfig(); + { + // tgld as bid token + config.isTempleGoldAuctionToken = false; + vm.startPrank(daoExecutor); + spice.setAuctionConfig(config); + deal(daiToken, address(spice), 500 ether); + emit log_address(config.starter); + vm.startPrank(alice); + spice.startAuction(); + // skip cooldown + skip(config.startCooldown); + } + uint256 currentEpoch = spice.currentEpoch(); + // bids + vm.startPrank(alice); + IERC20(templeGold).approve(address(spice), type(uint).max); + vm.expectEmit(address(spice)); + emit Deposit(alice, currentEpoch, aliceBidAmount); + spice.bid(aliceBidAmount); + + vm.startPrank(bob); + IERC20(templeGold).approve(address(spice), type(uint).max); + vm.expectEmit(address(spice)); + emit Deposit(bob, currentEpoch, bobBidAmount); + spice.bid(bobBidAmount); + + assertEq(spice.depositors(alice, currentEpoch), aliceBidAmount); + assertEq(spice.depositors(bob, currentEpoch), bobBidAmount); + IAuctionBase.EpochInfo memory epochInfo = spice.getEpochInfo(currentEpoch); + assertEq(epochInfo.totalBidTokenAmount, aliceBidAmount+bobBidAmount); + + uint256 totalTgldBid = (spice.getEpochInfo(spice.currentEpoch())).totalBidTokenAmount; + assertEq(totalTgldBid, aliceBidAmount+bobBidAmount); + + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + spice.claim(currentEpoch+1); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, currentEpoch)); + spice.claim(currentEpoch); + vm.warp(epochInfo.endTime); + + vm.startPrank(mike); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.claim(currentEpoch); + + uint256 balanceBefore = IERC20(daiToken).balanceOf(alice); + emit log_string("balance before"); + emit log_uint(balanceBefore); + uint256 claimAmount = 2*epochInfo.totalAuctionTokenAmount/5; + vm.startPrank(alice); + vm.expectEmit(address(spice)); + emit Claim(alice, currentEpoch, aliceBidAmount, claimAmount); + spice.claim(currentEpoch); + assertEq(IERC20(daiToken).balanceOf(alice), balanceBefore+claimAmount); + + vm.startPrank(bob); + balanceBefore = IERC20(daiToken).balanceOf(bob); + claimAmount = epochInfo.totalAuctionTokenAmount-claimAmount; + vm.expectEmit(address(spice)); + emit Claim(bob, currentEpoch, bobBidAmount, claimAmount); + spice.claim(currentEpoch); + assertEq(IERC20(daiToken).balanceOf(bob), balanceBefore+claimAmount); + } + + function test_withdrawEth_spice() public { + vm.startPrank(daoExecutor); + spice.setOperator(mike); + // access + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.withdrawEth(payable(alice), 1 ether); + + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.withdrawEth(payable(address(0)), 1 ether); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.withdrawEth(payable(alice), 0); + + vm.deal(address(spice), 2 ether); + // operator withdraw + vm.startPrank(mike); + uint256 balanceBefore = address(alice).balance; + spice.withdrawEth(payable(alice), 1 ether); + assertEq(alice.balance, balanceBefore+1 ether); + + // dao executor withdraw + vm.startPrank(daoExecutor); + balanceBefore = address(daoExecutor).balance; + spice.withdrawEth(payable(daoExecutor), 1 ether); + assertEq(daoExecutor.balance, balanceBefore+1 ether); + assertEq(address(spice).balance, 0); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InsufficientBalance.selector, address(0), 1 ether, 0)); + spice.withdrawEth(payable(alice), 1 ether); + } + function test_setOperator() public { + // access + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + spice.setOperator(alice); + + vm.startPrank(daoExecutor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + spice.setOperator(address(0)); + + vm.expectEmit(address(spice)); + emit OperatorSet(alice); + spice.setOperator(alice); + } + + + function test_burn_and_notify_arbitrum() public { + { + _setVestingFactor(); + // authorize for transfers + vm.startPrank(executor); + templeGold.authorizeContract(mike, true); + templeGold.authorizeContract(treasury, true); + skip(4 weeks); + templeGold.mint(); + // team gnosis + vm.startPrank(mike); + // approve spice auction contract to transfer + IERC20(templeGold).approve(address(spice), type(uint).max); + // distribute TGLD to alice + IERC20(templeGold).transfer(alice, 100 ether); + } + + uint256 etherAmount = 5 ether; + vm.deal(address(spice), etherAmount); + + // start spcie auction with TGLD as bid token + ISpiceAuction.SpiceAuctionConfig memory _config = _getAuctionConfig(); + _config.isTempleGoldAuctionToken = false; + _config.recipient = mike; + vm.startPrank(daoExecutor); + spice.setAuctionConfig(_config); + + { + deal(daiToken, address(spice), 500 ether); + vm.startPrank(alice); + spice.startAuction(); + // skip cooldown + skip(_config.startCooldown); + } + uint256 bidAmount = 100 ether; + uint256 currentEpoch = spice.currentEpoch(); + + { + // bids + vm.startPrank(alice); + IERC20(templeGold).approve(address(spice), type(uint).max); + vm.expectEmit(address(spice)); + emit Deposit(alice, currentEpoch, bidAmount); + spice.bid(bidAmount); + } + + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + spice.burnAndNotify(3, false); + + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionActive.selector)); + spice.burnAndNotify(currentEpoch, false); + + IAuctionBase.EpochInfo memory _info = spice.getEpochInfo(currentEpoch); + vm.warp(_info.endTime); + + vm.deal(alice, 1 ether); + vm.expectRevert(abi.encodeWithSelector(ISpiceAuction.EtherNotNeeded.selector)); + spice.burnAndNotify{value: 1 ether}(currentEpoch, false); + + uint256 circulatingSupply = templeGold.circulatingSupply(); + vm.expectEmit(address(spice)); + emit RedeemedTempleGoldBurned(currentEpoch, bidAmount); + spice.burnAndNotify(currentEpoch, false); + emit log_string("balance"); + emit log_uint(IERC20(daiToken).balanceOf(address(spice))); + assertEq(spice.redeemedEpochs(currentEpoch), true); + assertEq(templeGold.circulatingSupply(), circulatingSupply-bidAmount); + + _startAuction(true, true); + _config = spice.getAuctionConfig(currentEpoch+1); + currentEpoch = spice.currentEpoch(); + _info = spice.getEpochInfo(currentEpoch); + vm.warp(_info.endTime); + + // tgld is auction token + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + spice.burnAndNotify(currentEpoch, false); + + _config = _getAuctionConfig(); + _config.isTempleGoldAuctionToken = false; + vm.startPrank(daoExecutor); + spice.setAuctionConfig(_config); + vm.startPrank(_config.starter); + skip(_config.waitPeriod); + dealAdditional(IERC20(daiToken), address(spice), 500 ether); + templeGold.mint(); + spice.startAuction(); + // no bids + currentEpoch = spice.currentEpoch(); + _info = spice.getEpochInfo(currentEpoch); + vm.warp(_info.endTime); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + spice.burnAndNotify(currentEpoch, false); + } + + function test_mint_max_supply_update_circulating_supply() public { + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + { + vm.startPrank(executor); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(_factor); + templeGold.authorizeContract(mike, true); + templeGold.authorizeContract(treasury, true); + skip(365 days); + templeGold.mint(); + // team gnosis + vm.startPrank(mike); + IERC20(templeGold).approve(address(spice), type(uint).max); + // distribute TGLD to alice + IERC20(templeGold).transfer(alice, 12_400 ether); + deal(daiToken, address(spice), 100 ether); + } + assertEq(templeGold.circulatingSupply(), templeGold.MAX_CIRCULATING_SUPPLY()); + assertEq(templeGold.getMintAmount(), 0); + assertEq(templeGold.canDistribute(), false); + + // create spice auction and redeem + ISpiceAuction.SpiceAuctionConfig memory config = _getAuctionConfig(); + { + // tgld as bid token + config.isTempleGoldAuctionToken = false; + config.recipient = mike; + vm.startPrank(daoExecutor); + spice.setAuctionConfig(config); + vm.startPrank(alice); + spice.startAuction(); + skip(config.startCooldown); + } + uint256 bidAmount = 12_333_456_789_012_345_678_900; + uint256 currentEpoch = spice.currentEpoch(); + // bid + vm.startPrank(alice); + IERC20(templeGold).approve(address(spice), type(uint).max); + spice.bid(bidAmount); + + IAuctionBase.EpochInfo memory epochInfo = spice.getEpochInfo(currentEpoch); + assertEq(epochInfo.totalBidTokenAmount, bidAmount); + vm.warp(epochInfo.endTime); + + // burn redeemed TGLD and update circulating supply. + vm.deal(address(spice), 1 ether); + vm.startPrank(mike); + IERC20(templeGold).transfer(address(spice), 12_400 ether); + uint256 circulatingSupply = templeGold.MAX_CIRCULATING_SUPPLY() - bidAmount; + vm.expectEmit(address(templeGold)); + emit CirculatingSupplyUpdated(address(spice), bidAmount, circulatingSupply, bidAmount); + spice.burnAndNotify(currentEpoch, true); + assertEq(templeGold.circulatingSupply(), circulatingSupply); + emit log_uint(templeGold.getMintAmount()); + // circulating supply reduced but not enough to mint 10_000 + assertEq(templeGold.canDistribute(), false); + vm.startPrank(executor); + // mint faster + _factor.weekMultiplier = 70; + templeGold.setVestingFactor(_factor); + skip(1 weeks); + emit log_uint(templeGold.getMintAmount()); + assertEq(templeGold.canDistribute(), true); + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/SpiceAuctionFactory.t.sol b/protocol/test/forge/unit/templegold/SpiceAuctionFactory.t.sol new file mode 100644 index 000000000..f2c0cf3de --- /dev/null +++ b/protocol/test/forge/unit/templegold/SpiceAuctionFactory.t.sol @@ -0,0 +1,74 @@ +pragma solidity 0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/SpiceAuctionFactory.t.sol) + +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { SpiceAuctionFactory } from "contracts/templegold/SpiceAuctionFactory.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; + +contract SpiceAuctionFactoryTestBase is TempleGoldCommon { + event AuctionCreated(bytes32 id, address auction); + + address public fakeToken = makeAddr("fakeToken"); + SpiceAuctionFactory public factory; + TempleGold public templeGold; + + function setUp() public { + fork("arbitrum_one", forkBlockNumber); + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + + templeGold = new TempleGold(initArgs); + factory = new SpiceAuctionFactory(rescuer, executor, executor, mike, address(templeGold), ARBITRUM_ONE_LZ_EID, uint32(arbitrumOneChainId)); + } + + function test_initialization() public { + assertEq(factory.executor(), executor); + assertEq(factory.rescuer(), rescuer); + assertEq(factory.daoExecutor(), executor); + assertEq(factory.templeGold(), address(templeGold)); + assertEq(factory.operator(), mike); + } +} + +contract SpiceAuctionFactoryTestAccess is SpiceAuctionFactoryTestBase { + function test_access_createAuction() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + factory.createAuction(usdcToken, NAME_ONE); + } +} + +contract SpiceAuctionFactoryTest is SpiceAuctionFactoryTestBase { + function test_createAuction() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + factory.createAuction(address(0), NAME_ONE); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + factory.createAuction(address(templeGold), NAME_ONE); + + address auction = factory.createAuction(usdcToken, NAME_ONE); + bytes32 id = factory.getPairId(usdcToken); + assertEq(auction, factory.findAuctionForSpiceToken(usdcToken)); + assertEq(factory.deployedAuctions(id), auction); + } + + function test_getPairId() public { + vm.startPrank(executor); + address auction = factory.createAuction(usdcToken, NAME_ONE); + bytes32 id = factory.getPairId(usdcToken); + assertEq(auction, factory.findAuctionForSpiceToken(usdcToken)); + assertEq(factory.deployedAuctions(id), auction); + + auction = factory.createAuction(daiToken, NAME_ONE); + id = factory.getPairId(daiToken); + assertEq(auction, factory.findAuctionForSpiceToken(daiToken)); + assertEq(factory.deployedAuctions(id), auction); + + // get id of token < templeGold. test coverage + id = factory.getPairId(fakeToken); + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/StableGoldAuction.t.sol b/protocol/test/forge/unit/templegold/StableGoldAuction.t.sol new file mode 100644 index 000000000..aa71538d8 --- /dev/null +++ b/protocol/test/forge/unit/templegold/StableGoldAuction.t.sol @@ -0,0 +1,706 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/StableGoldAuction.t.sol) + +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { IStableGoldAuction } from "contracts/interfaces/templegold/IStableGoldAuction.sol"; +import { IAuctionBase } from "contracts/interfaces/templegold/IAuctionBase.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { ITempleERC20Token } from "contracts/interfaces/core/ITempleERC20Token.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { ITempleElevatedAccess } from "contracts/interfaces/v2/access/ITempleElevatedAccess.sol"; + +contract StableGoldAuctionTestBase is TempleGoldCommon { + event AuctionStarted(uint256 epochId, address indexed starter, uint128 startTime, uint128 endTime, uint256 auctionTokenAmount); + event BidTokenSet(address bidToken); + event GoldDistributionNotified(uint256 amount, uint256 timestamp); + event AuctionConfigSet(uint256 epochId, IStableGoldAuction.AuctionConfig config); + event AuctionStarterSet(address indexed starter); + event Deposit(address indexed depositor, uint256 epochId, uint256 amount); + event Claim(address indexed user, uint256 epochId, uint256 bidTokenAmount, uint256 auctionTokenAmount); + event TokenRecovered(address indexed to, address indexed token, uint256 amount); + + /// @notice Auction duration + uint64 public constant AUCTION_DURATION = 1 weeks; + uint32 public constant AUCTIONS_TIME_DIFF_ONE = 2 weeks; + uint32 public constant AUCTIONS_START_COOLDOWN_ONE = 1 hours; + uint192 public constant AUCTION_MIN_DISTRIBUTED_GOLD_ONE = 1_000; + + address public templeToken = 0x470EBf5f030Ed85Fc1ed4C2d36B9DD02e77CF1b7; + + TempleGold public templeGold; + IERC20 public bidToken; + IERC20 public bidToken2; + ITempleERC20Token public temple; + StableGoldAuction public auction; + TempleGoldStaking public goldStaking; + + function setUp() public { + /// @dev forking for layerzero endpoint to execute code + fork("arbitrum_one", 204026954); + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + + templeGold = new TempleGold(initArgs); + auction = new StableGoldAuction( + address(templeGold), + address(bidToken), + treasury, + rescuer, + executor, + executor + ); + goldStaking = new TempleGoldStaking( + rescuer, + executor, + templeToken, + address(templeGold) + ); + bidToken = IERC20(daiToken); // dai + bidToken2 = IERC20(usdcToken); //usdc + temple = ITempleERC20Token(templeToken); + + vm.startPrank(executor); + _configureTempleGold(); + deal(address(bidToken), executor, 100 ether, false); + deal(address(bidToken), alice, 100 ether, false); + + vm.stopPrank(); + } + + function _configureTempleGold() private { + templeGold.setStableGoldAuction(address(auction)); + auction.setBidToken(address(bidToken)); + ITempleGold.DistributionParams memory params; + params.auction = 60 ether; + params.gnosis = 10 ether; + params.staking = 30 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 2 ether; + factor.weekMultiplier = 1000 ether; + templeGold.setVestingFactor(factor); + templeGold.setStaking(address(goldStaking)); + templeGold.setTeamGnosis(address(teamGnosis)); + // whitelist + templeGold.authorizeContract(address(auction), true); + templeGold.authorizeContract(address(goldStaking), true); + templeGold.authorizeContract(teamGnosis, true); + } + + function test_initialization() public { + assertEq(address(templeGold), address(auction.templeGold())); + assertEq(rescuer, auction.rescuer()); + assertEq(executor, auction.executor()); + assertEq(treasury, auction.treasury()); + assertEq(address(bidToken), address(auction.bidToken())); + } + + function _getAuctionConfig() internal pure returns (IStableGoldAuction.AuctionConfig memory config) { + config.auctionsTimeDiff = AUCTIONS_TIME_DIFF_ONE; + config.auctionStartCooldown = AUCTIONS_START_COOLDOWN_ONE; + config.auctionMinimumDistributedGold = AUCTION_MIN_DISTRIBUTED_GOLD_ONE; + } + + function _startAuction() internal { + uint256 currentEpoch = auction.currentEpoch(); + IStableGoldAuction.AuctionConfig memory config = auction.getAuctionConfig(); + IAuctionBase.EpochInfo memory info; + if (currentEpoch == 0) { + vm.warp(block.timestamp + 1 weeks); + } else { + info = auction.getEpochInfo(currentEpoch); + vm.warp(info.endTime + config.auctionsTimeDiff); + } + // set auction config if not set + if (config.auctionMinimumDistributedGold == 0) { + auction.setAuctionConfig(_getAuctionConfig()); + } + templeGold.mint(); + auction.setAuctionStarter(address(0)); + auction.startAuction(); + info = auction.getEpochInfo(auction.currentEpoch()); + vm.warp(info.startTime); + } +} + +contract StableGoldAuctionTestAccess is StableGoldAuctionTestBase { + + function test_access_setAuctionConfigFail() public { + vm.startPrank(unauthorizedUser); + IStableGoldAuction.AuctionConfig memory config = _getAuctionConfig(); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + auction.setAuctionConfig(config); + } + function test_access_setAuctionStarterFail() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + auction.setAuctionStarter(unauthorizedUser); + } + + function test_access_setBidTokenFail() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + auction.setBidToken(address(templeGold)); + } + + function test_access_setAuctionConfigSuccess() public { + vm.startPrank(executor); + IStableGoldAuction.AuctionConfig memory config = _getAuctionConfig(); + auction.setAuctionConfig(config); + } + + function test_access_setAuctionStarterSuccess() public { + vm.startPrank(executor); + auction.setAuctionStarter(alice); + } + + function test_access_setBidTokenSuccess() public { + vm.startPrank(executor); + auction.setBidToken(address(bidToken)); + } +} + +contract StableGoldAuctionTestSetters is StableGoldAuctionTestBase { + + function test_setAuctionConfig() public { + vm.startPrank(executor); + IStableGoldAuction.AuctionConfig memory fakeConfig; + // config.auctionStartCooldown = 0 error + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.setAuctionConfig(fakeConfig); + fakeConfig.auctionStartCooldown = 100; + // config.auctionMinimumDistributedGold = 0 error + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.setAuctionConfig(fakeConfig); + fakeConfig.auctionMinimumDistributedGold = 1000; + // config.auctionsTimeDiff = 0 error + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.setAuctionConfig(fakeConfig); + fakeConfig.auctionsTimeDiff = 1; + vm.expectEmit(address(auction)); + uint256 currentEpochId = auction.currentEpoch(); + emit AuctionConfigSet(currentEpochId, fakeConfig); + auction.setAuctionConfig(fakeConfig); + + IStableGoldAuction.AuctionConfig memory config = auction.getAuctionConfig(); + assertEq(config.auctionsTimeDiff, 1); + assertEq(config.auctionStartCooldown, 100); + assertEq(config.auctionMinimumDistributedGold, 1000); + + // auction started + ITempleGold.VestingFactor memory _factor; + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(_factor); + skip(3 days); + templeGold.mint(); + _startAuction(); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.setAuctionConfig(config); + } + + function test_setAuctionStarter() public { + vm.startPrank(executor); + // address zero error + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + auction.setBidToken(address(0)); + + vm.expectEmit(address(auction)); + emit AuctionStarterSet(alice); + auction.setAuctionStarter(alice); + + assertEq(auction.auctionStarter(), alice); + + // auction started + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.setBidToken(alice); + } + + function test_setBidToken() public { + _setVestingFactor(templeGold); + vm.startPrank(executor); + + vm.expectEmit(address(auction)); + emit BidTokenSet(usdcToken); + auction.setBidToken(usdcToken); + + assertEq(address(auction.bidToken()), usdcToken); + + // auction started + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + // epoch not ended + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.setBidToken(alice); + } +} + +contract StableGoldAuctionTestView is StableGoldAuctionTestBase { + function test_getClaimableAtEpoch() public { + vm.warp(block.timestamp + 3 weeks); + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + + templeGold.mint(); + + vm.startPrank(alice); + bidToken.approve(address(auction), type(uint).max); + auction.bid(50 ether); + vm.startPrank(executor); + bidToken.approve(address(auction), type(uint).max); + auction.bid(100 ether); + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + uint256 totalRewards = info.totalAuctionTokenAmount; + uint256 aliceClaimable = (50 ether * totalRewards) / 150 ether; + uint256 executorClaimable = (100 ether * totalRewards) / 150 ether; + + assertEq(auction.getClaimableAtEpoch(alice, currentEpoch), aliceClaimable); + assertEq(auction.getClaimableAtEpoch(executor, currentEpoch), executorClaimable); + // rounding down change by 1 + assertApproxEqAbs(totalRewards, executorClaimable+aliceClaimable, 1); + } + + function test_getAuctionConfig() public { + /// @dev See test_setAuctionConfig() + } + + function test_nextEpoch() public { + uint256 currentEpoch = auction.currentEpoch(); + assertEq(auction.nextEpoch(), currentEpoch+1); + } + + function test_isCurrentEpochEnded() public { + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + vm.warp(block.timestamp + 6 days); + assertEq(auction.isCurrentEpochEnded(), false); + vm.warp(block.timestamp + 1 days + 1 seconds); + assertEq(auction.isCurrentEpochEnded(), true); + } + + function test_canDeposit() public { + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(auction.currentEpoch()); + vm.warp(info.endTime - 1); + assertEq(auction.canDeposit(), true); + vm.warp(info.endTime); + assertEq(auction.canDeposit(), false); + vm.warp(info.endTime+1); + assertEq(auction.canDeposit(), false); + } +} + +contract StableGoldAuctionTest is StableGoldAuctionTestBase { + + function test_startAuction_dai_gold_auction() public { + // auctionStarter == address(0). anyone can call + vm.startPrank(executor); + auction.setAuctionStarter(address(0)); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.startAuction(); + + _setVestingFactor(templeGold); + vm.startPrank(executor); + auction.setAuctionStarter(alice); + // auction starter != adderss(0) and caller is not auction starter + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + auction.startAuction(); + + // auctionStarter == address(0). anyone can call + vm.startPrank(executor); + auction.setAuctionStarter(address(0)); + IStableGoldAuction.AuctionConfig memory _config = _getAuctionConfig(); + auction.setAuctionConfig(_config); + + // distribute some TGLD + skip(1 days); + templeGold.mint(); + + uint128 startTime = uint128(block.timestamp + _config.auctionStartCooldown); + uint128 endTime = startTime + uint128(1 weeks); + uint256 goldAmount = auction.nextAuctionGoldAmount(); + vm.expectEmit(address(auction)); + emit AuctionStarted(1, executor, startTime, endTime, goldAmount); + auction.startAuction(); + + IStableGoldAuction.EpochInfo memory epochInfo = auction.getEpochInfo(1); + assertEq(auction.currentEpoch(), 1); + assertEq(epochInfo.startTime, startTime); + assertEq(epochInfo.endTime, endTime); + assertEq(epochInfo.totalBidTokenAmount, 0); + assertEq(epochInfo.totalAuctionTokenAmount, goldAmount); + + // test is current epoch ended + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotStartAuction.selector)); + auction.startAuction(); + + // test CannotStartAuction + // warp to auction end time + vm.warp(epochInfo.endTime+_config.auctionsTimeDiff-1); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotStartAuction.selector)); + auction.startAuction(); + + vm.warp(epochInfo.endTime+_config.auctionsTimeDiff); + + // distribute gold and start second auction + templeGold.mint(); + startTime = uint128(block.timestamp + _config.auctionStartCooldown); + endTime = startTime + uint128(1 weeks); + goldAmount = auction.nextAuctionGoldAmount(); + vm.expectEmit(address(auction)); + emit AuctionStarted(2, executor, startTime, endTime, goldAmount); + auction.startAuction(); + + epochInfo = auction.getEpochInfo(2); + assertEq(auction.currentEpoch(), 2); + assertEq(epochInfo.startTime, startTime); + assertEq(epochInfo.endTime, endTime); + assertEq(epochInfo.totalBidTokenAmount, 0); + assertEq(epochInfo.totalAuctionTokenAmount, goldAmount); + assertEq(auction.epochGoldSupply(2), epochInfo.totalAuctionTokenAmount); + + // low TGLD distribution error + vm.startPrank(executor); + ITempleGold.DistributionParams memory _params = _getDistributionParameters(); + _params.auction = 0; + _params.staking = 80 ether; + _params.gnosis = 20 ether; + // update so dai gold auction gets nothing + templeGold.setDistributionParams(_params); + vm.warp(epochInfo.endTime + _config.auctionsTimeDiff); + auction.isCurrentEpochEnded(); + vm.expectRevert(abi.encodeWithSelector(IStableGoldAuction.LowGoldDistributed.selector, 0)); + auction.startAuction(); + + } + + function test_bid_daiGold() public { + // onlyt when live error. + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotDeposit.selector)); + auction.bid(0); + + _setVestingFactor(templeGold); + vm.startPrank(executor); + _startAuction(); + // zero amount error + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.bid(0); + + // if auction ended + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory epochInfo = auction.getEpochInfo(currentEpoch); + vm.warp(epochInfo.endTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotDeposit.selector)); + auction.bid(100 ether); + + uint256 goldBalanceBefore = templeGold.balanceOf(address(auction)); + vm.warp(epochInfo.startTime); + + currentEpoch = auction.currentEpoch(); + bidToken.approve(address(auction), type(uint).max); + vm.expectEmit(address(auction)); + emit Deposit(executor, currentEpoch, 100 ether); + auction.bid(100 ether); + + epochInfo = auction.getEpochInfo(currentEpoch); + assertEq(auction.depositors(executor, currentEpoch), 100 ether); + assertEq(epochInfo.totalBidTokenAmount, 100 ether); + assertEq(bidToken.balanceOf(treasury), 100 ether); + + uint256 goldBalanceAfter = templeGold.balanceOf(address(auction)); + assertEq(goldBalanceAfter, goldBalanceBefore); + + // second deposits + vm.startPrank(alice); + bidToken.approve(address(auction), type(uint).max); + vm.expectEmit(address(auction)); + emit Deposit(alice, currentEpoch, 50 ether); + auction.bid(50 ether); + + epochInfo = auction.getEpochInfo(currentEpoch); + assertEq(auction.depositors(alice, currentEpoch), 50 ether); + assertEq(epochInfo.totalBidTokenAmount, 150 ether); + assertEq(bidToken.balanceOf(treasury), 150 ether); + + // bidToken amount = 0 + assertEq(auction.getClaimableAtEpoch(unauthorizedUser, currentEpoch), 0); + // invalid epoch + assertEq(auction.getClaimableAtEpoch(unauthorizedUser, currentEpoch+1), 0); + } + + function test_claim_daiGold() public { + _setVestingFactor(templeGold); + skip(1 days); + vm.startPrank(executor); + _startAuction(); + + // deposits + vm.startPrank(alice); + bidToken.approve(address(auction), type(uint).max); + auction.bid(50 ether); + vm.startPrank(executor); + bidToken.approve(address(auction), type(uint).max); + auction.bid(100 ether); + + // cannot claim for current epoch + uint256 currentEpoch = auction.currentEpoch(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(currentEpoch); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, currentEpoch)); + auction.claim(currentEpoch); + // cannot claim for not started (cooldown time) + vm.warp(info.startTime - 1 seconds); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, currentEpoch)); + auction.claim(currentEpoch); + // cannot claim when active + vm.warp(info.startTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.CannotClaim.selector, currentEpoch)); + auction.claim(currentEpoch); + // invalid epoch error + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + auction.claim(currentEpoch+1); + + vm.warp(info.endTime); + // bob cannot claim for 0 deposits + vm.startPrank(bob); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.claim(currentEpoch); + + // valid claims + uint256 aliceRewardBalanceBefore = templeGold.balanceOf(alice); + uint256 executorRewardBalanceBefore = templeGold.balanceOf(executor); + uint256 executorClaimable = auction.getClaimableAtCurrentEpoch(executor); + uint256 aliceClaimable = auction.getClaimableAtCurrentEpoch(alice); + vm.startPrank(alice); + vm.expectEmit(address(auction)); + emit Claim(alice, currentEpoch, 50 ether, aliceClaimable); + auction.claim(currentEpoch); + vm.startPrank(executor); + vm.expectEmit(address(auction)); + emit Claim(executor, currentEpoch, 100 ether, executorClaimable); + auction.claim(currentEpoch); + + uint256 aliceRewardBalanceAfter= templeGold.balanceOf(alice); + uint256 executorRewardBalanceAfter = templeGold.balanceOf(executor); + IAuctionBase.EpochInfo memory epochInfo = auction.getEpochInfo(currentEpoch); + assertEq(executorClaimable+aliceClaimable, epochInfo.totalAuctionTokenAmount); + assertEq(aliceRewardBalanceAfter, aliceRewardBalanceBefore+aliceClaimable); + assertEq(executorRewardBalanceAfter, executorRewardBalanceBefore+executorClaimable); + assertEq(auction.claimedAmount(alice, currentEpoch), aliceClaimable); + assertEq(auction.claimedAmount(executor, currentEpoch), executorClaimable); + assertEq(auction.claimed(alice, currentEpoch), true); + assertEq(auction.claimed(executor, currentEpoch), true); + + // try to claim again + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AlreadyClaimed.selector)); + auction.claim(currentEpoch); + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AlreadyClaimed.selector)); + auction.claim(currentEpoch); + vm.startPrank(executor); + + // start another auction but check claimable diffs when another user deposits additionally + skip(1 days); + _startAuction(); + currentEpoch = auction.currentEpoch(); + info = auction.getEpochInfo(currentEpoch); + vm.warp(info.startTime); + deal(address(bidToken), alice, 100 ether, false); + deal(address(bidToken), executor, 100 ether, false); + vm.startPrank(alice); + bidToken.approve(address(auction), type(uint).max); + auction.bid(100 ether); + vm.startPrank(executor); + bidToken.approve(address(auction), type(uint).max); + auction.bid(100 ether); + executorClaimable = auction.getClaimableAtCurrentEpoch(executor); + aliceClaimable = auction.getClaimableAtCurrentEpoch(alice); + deal(address(bidToken), bob, 100 ether, false); + vm.startPrank(bob); + bidToken.approve(address(auction), type(uint).max); + auction.bid(100 ether); + assertGt(aliceClaimable, auction.getClaimableAtCurrentEpoch(alice)); + assertGt(executorClaimable, auction.getClaimableAtCurrentEpoch(executor)); + } + + function test_notifyDistribution() public { + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + auction.notifyDistribution(100 ether); + + uint256 nextGoldAmount = auction.nextAuctionGoldAmount(); + vm.warp(block.timestamp + 1 weeks); + uint256 mintAmount = templeGold.getMintAmount(); + ITempleGold.DistributionParams memory dp = templeGold.getDistributionParameters(); + uint256 auctionAmount = dp.auction * mintAmount / 100 ether; + templeGold.mint(); + assertEq(auction.nextAuctionGoldAmount(), nextGoldAmount+auctionAmount); + } + + function test_distributeGold() public { + _setVestingFactor(templeGold); + skip(1 days); + uint256 goldBalance = templeGold.balanceOf(address(auction)); + auction.distributeGold(); + assertGt(templeGold.balanceOf(address(auction)), goldBalance); + } + + function test_recoverToken_daiGold() public { + _setVestingFactor(templeGold); + skip(1 days); + vm.startPrank(executor); + // revert, invalid params + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + auction.recoverToken(address(temple), address(0), 0); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + auction.recoverToken(address(temple), alice, 0); + + uint256 sendAmount = 50 ether; + deal(address(bidToken), address(auction), sendAmount, false); + + uint256 aliceBalance = bidToken.balanceOf(alice); + vm.expectEmit(address(auction)); + emit TokenRecovered(alice, address(bidToken), sendAmount); + auction.recoverToken(address(bidToken), alice, sendAmount); + assertEq(bidToken.balanceOf(alice), aliceBalance+sendAmount); + assertEq(auction.nextAuctionGoldAmount(), 0); + + // currentEpochId = 0 + templeGold.mint(); + uint256 mintAmount = templeGold.balanceOf(address(auction)); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.recoverToken(address(templeGold), alice, mintAmount); + + IStableGoldAuction.AuctionConfig memory _config = _getAuctionConfig(); + auction.setAuctionConfig(_config); + _startAuction(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(1); + vm.warp(info.startTime); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionActive.selector)); + auction.recoverToken(address(templeGold), alice, mintAmount); + + vm.warp(info.endTime); + templeGold.mint(); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionEnded.selector)); + auction.recoverToken(address(templeGold), alice, mintAmount); + + vm.warp(info.startTime - 10 seconds); + mintAmount = templeGold.balanceOf(address(auction)); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAmount.selector, address(templeGold), mintAmount+1)); + auction.recoverToken(address(templeGold), alice, mintAmount+1); + + // there was distribution after calling `templeGold.mint()`. nextAuctionGoldAmount > 0 + // recover half of total auction amount + aliceBalance = templeGold.balanceOf(alice); + uint256 recoverAmount = info.totalAuctionTokenAmount / 2; + uint256 nextAuctionGoldAmount = auction.nextAuctionGoldAmount(); + vm.expectEmit(address(auction)); + emit TokenRecovered(alice, address(templeGold), recoverAmount); + auction.recoverToken(address(templeGold), alice, recoverAmount); + assertEq(templeGold.balanceOf(alice), aliceBalance+recoverAmount); + // plus the half of total auction amount that was not recovered + // delta of 1 because of rounding + assertApproxEqAbs(nextAuctionGoldAmount + recoverAmount, auction.nextAuctionGoldAmount(), 1); + // epoch deleted, cannot recover + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.recoverToken(address(templeGold), alice, mintAmount); + + // can also recover full amount of TGLD + vm.warp(info.endTime + _config.auctionsTimeDiff); + auction.startAuction(); + info = auction.getEpochInfo(auction.currentEpoch()); + // cooldown time + vm.warp(info.startTime - 10 seconds); + // distribute so nextAuctionGoldAmount > 0 + templeGold.mint(); + aliceBalance = templeGold.balanceOf(alice); + recoverAmount = info.totalAuctionTokenAmount; + nextAuctionGoldAmount = auction.nextAuctionGoldAmount(); + vm.expectEmit(address(auction)); + emit TokenRecovered(alice, address(templeGold), recoverAmount); + auction.recoverToken(address(templeGold), alice, recoverAmount); + assertEq(templeGold.balanceOf(alice), aliceBalance+recoverAmount); + assertGt(nextAuctionGoldAmount, 0); + assertEq(nextAuctionGoldAmount, auction.nextAuctionGoldAmount()); + + // now alice can send back TGLD to Dai Gold auction and notify distribution + vm.startPrank(executor); + ITempleElevatedAccess.ExplicitAccess[] memory _accesses = new ITempleElevatedAccess.ExplicitAccess[](1); + ITempleElevatedAccess.ExplicitAccess memory _access; + _access.fnSelector = auction.notifyDistribution.selector; + _access.allowed = true; + _accesses[0] = _access; + auction.setExplicitAccess(alice, _accesses); + vm.startPrank(alice); + nextAuctionGoldAmount = auction.nextAuctionGoldAmount(); + IERC20(templeGold).transfer(address(auction), recoverAmount); + auction.notifyDistribution(recoverAmount); + assertEq(auction.nextAuctionGoldAmount(), recoverAmount+nextAuctionGoldAmount); + } + + function test_recoverTempleGoldForZeroBidAuction_daiGold() public { + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor; + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(_factor); + _startAuction(); + IAuctionBase.EpochInfo memory info = auction.getEpochInfo(1); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + auction.recoverTempleGoldForZeroBidAuction(1, address(0)); + + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidEpoch.selector)); + auction.recoverTempleGoldForZeroBidAuction(2, executor); + + vm.warp(info.endTime-1); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AuctionActive.selector)); + auction.recoverTempleGoldForZeroBidAuction(1, executor); + + // bid to invalidate + vm.startPrank(alice); + uint256 amount = 1 ether; + deal(address(bidToken), alice, amount, false); + bidToken.approve(address(auction), type(uint).max); + auction.bid(amount); + + vm.warp(info.endTime); + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.InvalidOperation.selector)); + auction.recoverTempleGoldForZeroBidAuction(1, executor); + + // start anotheer auction and recover + _startAuction(); + info = auction.getEpochInfo(2); + vm.warp(info.endTime); + assertEq(auction.epochsWithoutBidsRecovered(2), false); + vm.expectEmit(address(auction)); + emit TokenRecovered(executor, address(templeGold), info.totalAuctionTokenAmount); + auction.recoverTempleGoldForZeroBidAuction(2, executor); + assertEq(auction.epochsWithoutBidsRecovered(2), true); + + vm.expectRevert(abi.encodeWithSelector(IAuctionBase.AlreadyRecovered.selector)); + auction.recoverTempleGoldForZeroBidAuction(2, executor); + + // now executor can send back TGLD to Dai Gold auction and notify distribution + vm.startPrank(executor); + uint256 nextAuctionGoldAmount = auction.nextAuctionGoldAmount(); + uint256 recoverAmount = info.totalAuctionTokenAmount; + IERC20(templeGold).transfer(address(auction), recoverAmount); + auction.notifyDistribution(recoverAmount); + assertEq(auction.nextAuctionGoldAmount(), recoverAmount+nextAuctionGoldAmount); + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/TempleGold.t.sol b/protocol/test/forge/unit/templegold/TempleGold.t.sol new file mode 100644 index 000000000..225fa7628 --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleGold.t.sol @@ -0,0 +1,644 @@ +pragma solidity 0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleGold.t.sol) + +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; +import { IERC20Errors } from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +contract TempleGoldTestBase is TempleGoldCommon { + using OptionsBuilder for bytes; + + event Transfer(address indexed from, address indexed to, uint256 value); + event ContractAuthorizationSet(address indexed _contract, bool _whitelisted); + event VestingFactorSet(uint128 value, uint128 weekMultiplier); + event DistributionParamsSet(uint256 staking, uint256 auction, uint256 gnosis); + event Distributed(uint256 stakingAmount, uint256 auctionAmount, uint256 gnosisAmount, uint256 timestamp); + event StakingSet(address staking); + event StableGoldAuctionSet(address auction); + event TeamGnosisSet(address gnosis); + event CirculatingSupplyUpdated(address indexed sender, uint256 amount, uint256 circulatingSuppply, uint256 totalBurned); + event NotifierSet(address indexed notifier); + + StableGoldAuction public auction; + TempleGoldStaking public staking; + TempleGold public templeGold; + TempleGold public templeGoldMainnet; + FakeERC20 public templeToken; + + uint32 internal _setVestingFactorTime; + + uint256 public constant MINIMUM_DISTRIBUTION_SHARE = 1 ether; + uint256 public constant ARBITRUM_ONE_BLOCKNUMBER_B = 207201713; + uint256 public constant MINIMUM_MINT = 1_000; + uint256 public constant MAXIMUM_CIRCULATING_SUPPLY = 1_000_000_000 ether; + uint256 public arbitrumOneForkId; + uint256 public mainnetForkId; + + function setUp() public { + arbitrumOneForkId = fork("arbitrum_one"); + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + templeGold = new TempleGold(initArgs); + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + staking = new TempleGoldStaking(rescuer, executor, address(templeToken), address(templeGold)); + auction = new StableGoldAuction( + address(templeGold), + daiToken, + treasury, + rescuer, + executor, + executor + ); + vm.startPrank(executor); + _configureTempleGold(); + vm.deal(alice, 100 ether); + vm.deal(bob, 100 ether); + vm.stopPrank(); + } + + function test_initialization() public { + assertEq(templeGold.owner(), executor); + assertEq(address(templeGold.auction()), address(auction)); + assertEq(address(templeGold.staking()), address(staking)); + assertEq(templeGold.teamGnosis(), teamGnosis); + assertEq(templeGold.MAX_CIRCULATING_SUPPLY(), 1_000_000_000 ether); + } + + function _configureTempleGold() private { + templeGold.setStableGoldAuction(address(auction)); + ITempleGold.DistributionParams memory params; + params.auction = 60 ether; + params.gnosis = 10 ether; + params.staking = 30 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 2 ether; + factor.weekMultiplier = 1000 ether; + templeGold.setVestingFactor(factor); + _setVestingFactorTime = uint32(block.timestamp); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(address(teamGnosis)); + // whitelist + templeGold.authorizeContract(address(auction), true); + templeGold.authorizeContract(address(staking), true); + templeGold.authorizeContract(teamGnosis, true); + } + + function _deployContractsOnMainnet() internal returns (TempleGold){ + mainnetForkId = fork("mainnet"); + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + initArgs.layerZeroEndpoint = layerZeroEndpointEthereum; + templeGoldMainnet = new TempleGold(initArgs); + return templeGoldMainnet; + } + + function _setupPeers() internal { + templeGoldMainnet = _deployContractsOnMainnet(); + vm.startPrank(executor); + vm.selectFork(mainnetForkId); + templeGoldMainnet.setPeer(ARBITRUM_ONE_LZ_EID, _addressToBytes32(address(templeGold))); + vm.selectFork(arbitrumOneForkId); + templeGold.setPeer(MAINNET_LZ_EID, _addressToBytes32(address(templeGoldMainnet))); + vm.stopPrank(); + } +} + +contract TempleGoldAccessTest is TempleGoldTestBase { + function test_access_setaiGoldAuction_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.setStableGoldAuction(alice); + } + + function test_access_setStaking_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.setStaking(alice); + } + + function test_access_setTeamGnosis_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.setTeamGnosis(teamGnosis); + } + + function test_access_authorizeContract_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.authorizeContract(alice, true); + } + + function test_access_setDistributionParams_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.setDistributionParams(_getDistributionParameters()); + } + + function test_access_setVestingFactor_tgld() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser)); + templeGold.setVestingFactor(_getVestingFactor()); + } +} + +contract TempleGoldViewTest is TempleGoldTestBase { + function test_oftVersion_tgld() public { + (bytes4 interfaceId, ) = templeGold.oftVersion(); + bytes4 expectedId = 0x02e49c2c; + assertEq(interfaceId, expectedId); + } + + function test_getVestingFactor_tgld() public { + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + _factor = templeGold.getVestingFactor(); + assertEq(_factor.value, 10 ether); + assertEq(_factor.weekMultiplier, 100 ether); + _factor.value = 3 ether; + templeGold.setVestingFactor(_factor); + _factor = templeGold.getVestingFactor(); + assertEq(_factor.value, 3 ether); + assertEq(_factor.weekMultiplier, 100 ether); + } + + function test_getDistributionParameters_tgld() public { + ITempleGold.DistributionParams memory _params = _getDistributionParameters(); + vm.startPrank(executor); + _params.staking = 50 ether; + _params.auction = 40 ether; + _params.gnosis = 10 ether; + templeGold.setDistributionParams(_params); + _params = templeGold.getDistributionParameters(); + assertEq(_params.staking, 50 ether); + assertEq(_params.auction, 40 ether); + assertEq(_params.gnosis, 10 ether); + } + + function test_canDistribute_tgld() public { + _setVestingFactor(templeGold); + bool canDistribute = templeGold.canDistribute(); + assertEq(canDistribute, false); + skip(1 days); + canDistribute = templeGold.canDistribute(); + assertEq(canDistribute, true); + templeGold.mint(); + // end of vesting + skip(99 days); + canDistribute = templeGold.canDistribute(); + assertEq(canDistribute, true); + templeGold.mint(); + canDistribute = templeGold.canDistribute(); + assertEq(canDistribute, false); + } + + function test_getMintAmount_tgld() public { + // first mint + ITempleGold.VestingFactor memory _factor = templeGold.getVestingFactor(); + _factor.value = 1 seconds; + _factor.weekMultiplier = 100 days; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + uint256 _maxSupply = templeGold.MAX_CIRCULATING_SUPPLY(); + uint256 _amount = _maxSupply * (block.timestamp - _setVestingFactorTime) * _factor.value / _factor.weekMultiplier; + assertEq(_amount, templeGold.getMintAmount()); + templeGold.mint(); + uint256 _lastMint = block.timestamp; + skip(10 days); + _amount = (block.timestamp - _lastMint) * _maxSupply * _factor.value / _factor.weekMultiplier; + assertEq(_amount, templeGold.getMintAmount()); + assertEq(templeGold.circulatingSupply(), templeGold.totalSupply()); + uint256 _circulating = _amount + templeGold.totalSupply(); + templeGold.mint(); + assertEq(_circulating, templeGold.circulatingSupply()); + } +} + +contract TempleGoldTest is TempleGoldTestBase { + + function test_only_source_chain_mint_setters_reverts() public { + templeGoldMainnet = _deployContractsOnMainnet(); + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.setVestingFactor(_factor); + + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.setDistributionParams(_getDistributionParameters()); + + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.setStaking(address(staking)); + + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.setTeamGnosis(teamGnosis); + + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.setStableGoldAuction(address(auction)); + } + + function test_setStaking_tgld() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + templeGold.setStaking(address(0)); + + vm.expectEmit(address(templeGold)); + emit StakingSet(address(staking)); + templeGold.setStaking(address(staking)); + assertEq(address(templeGold.staking()), address(staking)); + vm.expectEmit(address(templeGold)); + emit StakingSet(alice); + templeGold.setStaking(alice); + assertEq(address(templeGold.staking()), alice); + } + + function test_set_stableGoldAuction_tgld() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + templeGold.setStableGoldAuction(address(0)); + + vm.expectEmit(address(templeGold)); + emit StableGoldAuctionSet(address(auction)); + templeGold.setStableGoldAuction(address(auction)); + assertEq(address(templeGold.auction()), address(auction)); + vm.expectEmit(address(templeGold)); + emit StableGoldAuctionSet(alice); + templeGold.setStableGoldAuction(alice); + assertEq(address(templeGold.auction()), alice); + } + + function test_setTeamGnosis_tgld() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + templeGold.setTeamGnosis(address(0)); + + vm.expectEmit(address(templeGold)); + emit TeamGnosisSet(teamGnosis); + templeGold.setTeamGnosis(teamGnosis); + assertEq(templeGold.teamGnosis(), teamGnosis); + vm.expectEmit(address(templeGold)); + emit TeamGnosisSet(alice); + templeGold.setTeamGnosis(alice); + assertEq(templeGold.teamGnosis(), alice); + } + + function test_authorizeContract_tgld() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + templeGold.authorizeContract(address(0), false); + + address _auction = address(auction); + vm.expectEmit(address(templeGold)); + emit ContractAuthorizationSet(_auction, true); + templeGold.authorizeContract(_auction, true); + assertEq(templeGold.authorized(_auction), true); + vm.expectEmit(address(templeGold)); + emit ContractAuthorizationSet(_auction, false); + templeGold.authorizeContract(_auction, false); + assertEq(templeGold.authorized(_auction), false); + } + + function test_setVestingFactor_tgld() public { + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + uint128 temp = _factor.value; + _factor.value = 0; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + templeGold.setVestingFactor(_factor); + _factor.value = temp; + temp = _factor.weekMultiplier; + _factor.weekMultiplier = 0; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + templeGold.setVestingFactor(_factor); + _factor.weekMultiplier = temp; + vm.expectEmit(address(templeGold)); + emit VestingFactorSet(_factor.value, _factor.weekMultiplier); + templeGold.setVestingFactor(_factor); + ITempleGold.VestingFactor memory _vf = templeGold.getVestingFactor(); + assertEq(_vf.value, 10 ether); + assertEq(_vf.weekMultiplier, 100 ether); + assertEq(templeGold.lastMintTimestamp(), uint32(block.timestamp)); + } + + function test_setDistributionParameters_tgld() public { + vm.startPrank(executor); + ITempleGold.DistributionParams memory _params = _getDistributionParameters(); + + _params.gnosis = _params.gnosis + 1; + vm.expectRevert(abi.encodeWithSelector(ITempleGold.InvalidTotalShare.selector)); + templeGold.setDistributionParams(_params); + + _params.gnosis = _params.gnosis - 1; + vm.expectEmit(address(templeGold)); + emit DistributionParamsSet(_params.staking, _params.auction, _params.gnosis); + templeGold.setDistributionParams(_params); + + ITempleGold.DistributionParams memory _p = templeGold.getDistributionParameters(); + assertEq(_p.gnosis, _params.gnosis); + assertEq(_p.auction, _params.auction); + assertEq(_p.staking, _params.staking); + } + + function test_mint_tgld_revert() public { + // cannot mint on different chain + templeGoldMainnet = _deployContractsOnMainnet(); + vm.expectRevert(abi.encodeWithSelector(ITempleGold.WrongChain.selector)); + templeGoldMainnet.mint(); + } + + function test_nontransferrable_tgld() public { + vm.startPrank(executor); + templeGold.authorizeContract(teamGnosis, false); + vm.warp(block.timestamp + 2 days); + templeGold.mint(); + vm.startPrank(teamGnosis); + uint256 balance = templeGold.balanceOf(teamGnosis); + vm.expectRevert(abi.encodeWithSelector(ITempleGold.NonTransferrable.selector, teamGnosis, alice)); + templeGold.transfer(alice, balance); + + } + + function test_mint_tgld_recipient_params_revert() public { + vm.selectFork(arbitrumOneForkId); + // minting when params and vesting factor not set + fork("arbitrum_one"); + + TempleGold _templeGold = new TempleGold(_getTempleGoldInitArgs()); + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor; + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + _templeGold.setVestingFactor(_factor); + _templeGold.setDistributionParams(_getDistributionParameters()); + skip(1 days); + // invalid receiver. staking and auction not set + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + _templeGold.mint(); + } + + function test_mint_with_vesting_factor_one_year() public { + vm.selectFork(arbitrumOneForkId); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + uint256 mintAmount = templeGold.getMintAmount(); + assertEq(mintAmount, 0); + + // week 1 + uint256 timeDifference = 1 weeks; + uint256 emission = (timeDifference * MAXIMUM_CIRCULATING_SUPPLY / _factor.value) / _factor.weekMultiplier; + skip(1 weeks); + mintAmount = templeGold.getMintAmount(); + templeGold.mint(); + emit log_string("Emission 1"); + emit log_uint(emission); + assertEq(emission, mintAmount); + assertEq(emission, templeGold.circulatingSupply()); + assertEq(templeGold.circulatingSupply(), 28571428571428571428571428); + uint256 totalEmissions = emission; + // week 2 + skip(1 weeks); + emission = (timeDifference * (MAXIMUM_CIRCULATING_SUPPLY - totalEmissions) / _factor.value) / _factor.weekMultiplier; + mintAmount = templeGold.getMintAmount(); + totalEmissions += emission; + templeGold.mint(); + emit log_string("Emission 2"); + emit log_uint(emission); + emit log_uint(totalEmissions); + assertEq(emission, mintAmount); + assertEq(totalEmissions, templeGold.circulatingSupply()); + assertEq(templeGold.circulatingSupply(), 56326530612244897959183672); + + // week 3 + skip(1 weeks); + emission = (timeDifference * (MAXIMUM_CIRCULATING_SUPPLY - totalEmissions) / _factor.value) / _factor.weekMultiplier; + mintAmount = templeGold.getMintAmount(); + totalEmissions += emission; + templeGold.mint(); + emit log_string("Emission 3"); + emit log_uint(emission); + emit log_uint(totalEmissions); + assertEq(emission, mintAmount); + assertEq(totalEmissions, templeGold.circulatingSupply()); + assertEq(templeGold.circulatingSupply(), 83288629737609329446064138); + + // week 4 + skip(1 weeks); + emission = (timeDifference * (MAXIMUM_CIRCULATING_SUPPLY - totalEmissions) / _factor.value) / _factor.weekMultiplier; + mintAmount = templeGold.getMintAmount(); + totalEmissions += emission; + templeGold.mint(); + emit log_string("Emission 4"); + emit log_uint(emission); + emit log_uint(totalEmissions); + assertEq(emission, mintAmount); + assertEq(totalEmissions, templeGold.circulatingSupply()); + assertEq(templeGold.circulatingSupply(), 109480383173677634319033734); + + // // week 5 + skip(1 weeks); + emission = (timeDifference * (MAXIMUM_CIRCULATING_SUPPLY - totalEmissions) / _factor.value) / _factor.weekMultiplier; + mintAmount = templeGold.getMintAmount(); + totalEmissions += emission; + templeGold.mint(); + emit log_string("Emission 5"); + emit log_uint(emission); + emit log_uint(totalEmissions); + assertEq(emission, mintAmount); + assertEq(totalEmissions, templeGold.circulatingSupply()); + assertEq(templeGold.circulatingSupply(), 134923800797286844767061341); + + // week 6 + skip(1 weeks); + emission = (timeDifference * (MAXIMUM_CIRCULATING_SUPPLY - totalEmissions) / _factor.value) / _factor.weekMultiplier; + mintAmount = templeGold.getMintAmount(); + totalEmissions += emission; + templeGold.mint(); + emit log_string("Emission 6"); + emit log_uint(emission); + emit log_uint(totalEmissions); + assertEq(emission, mintAmount); + assertEq(totalEmissions, templeGold.circulatingSupply()); + } + + function test_mint_tgld_share() public { + vm.selectFork(arbitrumOneForkId); + uint256 totalSupply = templeGold.totalSupply(); + _setVestingFactor(templeGold); + + skip(1 days); + uint256 mintAmount = templeGold.getMintAmount(); + ITempleGold.DistributionParams memory _params = templeGold.getDistributionParameters(); + uint256 stakingAmount = _params.staking * mintAmount / 100 ether; + uint256 auctionAmount = _params.auction * mintAmount / 100 ether; + uint256 gnosisAmount = mintAmount - (stakingAmount + auctionAmount); + + vm.expectEmit(address(templeGold)); + emit Transfer(address(0), address(staking), stakingAmount); + vm.expectEmit(address(templeGold)); + emit Transfer(address(0), address(auction), auctionAmount); + vm.expectEmit(address(templeGold)); + emit Transfer(address(0), teamGnosis, gnosisAmount); + vm.expectEmit(address(templeGold)); + emit Distributed(stakingAmount, auctionAmount, gnosisAmount, block.timestamp); + templeGold.mint(); + assertEq(templeGold.totalSupply(), totalSupply+mintAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingAmount); + assertEq(templeGold.balanceOf(address(auction)), auctionAmount); + assertEq(templeGold.balanceOf(teamGnosis), gnosisAmount); + // end of vesting + totalSupply = templeGold.totalSupply(); + skip(99 days); + mintAmount = templeGold.getMintAmount(); + stakingAmount = _params.staking * mintAmount / 100 ether; + auctionAmount = _params.auction * mintAmount / 100 ether; + gnosisAmount = mintAmount - (stakingAmount + auctionAmount); + + uint256 stakingBalanceBefore = templeGold.balanceOf(address(staking)); + uint256 auctionBalanceBefore = templeGold.balanceOf(address(auction)); + uint256 gnosisBalanceBefore = templeGold.balanceOf(teamGnosis); + templeGold.mint(); + emit log_string("balances 2"); + emit log_uint(templeGold.balanceOf(address(staking))); + emit log_uint(templeGold.balanceOf(address(auction))); + emit log_uint(mintAmount); + assertEq(templeGold.totalSupply(), totalSupply+mintAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingBalanceBefore+stakingAmount); + assertEq(templeGold.balanceOf(address(auction)), auctionBalanceBefore+auctionAmount); + assertEq(templeGold.balanceOf(teamGnosis), gnosisBalanceBefore+gnosisAmount); + // test mint amount = 0 + assertEq(templeGold.getMintAmount(), 0); + // test coverage mintAmount = 0 + templeGold.mint(); + } + + function test_mint_tgld_distribution() public { + vm.selectFork(arbitrumOneForkId); + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor; + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(_factor); + ITempleGold.DistributionParams memory _params = _getDistributionParameters(); + _params.gnosis = 0; + _params.staking = 30 ether; + _params.auction = 70 ether; + skip(30 days); + uint256 totalSupply = templeGold.totalSupply(); + uint256 mintAmount = templeGold.getMintAmount(); + templeGold.setDistributionParams(_params); + uint256 stakingAmount = _params.staking * mintAmount / 100 ether; + uint256 gnosisAmount = 0; + uint256 auctionAmount = _params.auction * mintAmount / 100 ether; + emit log_string("gnosis amount"); + emit log_uint(templeGold.balanceOf(teamGnosis)); + templeGold.mint(); + assertEq(templeGold.totalSupply(), totalSupply+mintAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingAmount); + assertEq(templeGold.balanceOf(address(auction)), auctionAmount); + assertApproxEqAbs(templeGold.balanceOf(teamGnosis), gnosisAmount, 1); + + // staking = 0 + _params.gnosis = 10 ether; + _params.staking = 0; + _params.auction = 90 ether; + templeGold.setDistributionParams(_params); + skip(30 days); + mintAmount = templeGold.getMintAmount(); + totalSupply = templeGold.totalSupply(); + stakingAmount = 0; + gnosisAmount = _params.gnosis * mintAmount / 100 ether; + auctionAmount = _params.auction * mintAmount / 100 ether; + uint256 stakingBalance = templeGold.balanceOf(address(staking)); + uint256 daiGoldBalance = templeGold.balanceOf(address(auction)); + uint256 gnosisBalance = templeGold.balanceOf(teamGnosis); + templeGold.mint(); + assertEq(templeGold.totalSupply(), totalSupply+mintAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingBalance+stakingAmount); + assertEq(templeGold.balanceOf(address(auction)), daiGoldBalance+auctionAmount); + assertApproxEqAbs(templeGold.balanceOf(teamGnosis), gnosisBalance+gnosisAmount, 1); + + // dai gold auction = 0 + _params.gnosis = 10 ether; + _params.staking = 90 ether; + _params.auction = 0; + templeGold.setDistributionParams(_params); + skip(30 days); + mintAmount = templeGold.getMintAmount(); + totalSupply = templeGold.totalSupply(); + stakingAmount = _params.staking * mintAmount / 100 ether; + gnosisAmount = _params.gnosis * mintAmount / 100 ether; + auctionAmount = 0; + stakingBalance = templeGold.balanceOf(address(staking)); + daiGoldBalance = templeGold.balanceOf(address(auction)); + gnosisBalance = templeGold.balanceOf(teamGnosis); + templeGold.mint(); + assertEq(templeGold.totalSupply(), totalSupply+mintAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingBalance+stakingAmount); + assertEq(templeGold.balanceOf(address(auction)), daiGoldBalance+auctionAmount); + assertApproxEqAbs(templeGold.balanceOf(teamGnosis), gnosisBalance+gnosisAmount, 1); + } + + function test_mint_max_supply_tgld() public { + // set vesting factor high to speed max supply mint time + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 35; + templeGold.setVestingFactor(_factor); + skip(5 days); + uint256 _expectedAmount = templeGold.getMintAmount(); + _expectedAmount = templeGold.MAX_CIRCULATING_SUPPLY() - templeGold.totalSupply(); + + ITempleGold.DistributionParams memory _params = templeGold.getDistributionParameters(); + uint256 stakingAmount = _params.staking * _expectedAmount / 100 ether; + uint256 gnosisAmount = _params.gnosis * _expectedAmount / 100 ether; + uint256 auctionAmount = _params.auction * _expectedAmount / 100 ether; + vm.expectEmit(address(templeGold)); + emit Distributed(stakingAmount, auctionAmount, gnosisAmount, block.timestamp); + templeGold.mint(); + + uint256 _totalSupply = templeGold.totalSupply(); + assertEq(_totalSupply, templeGold.MAX_CIRCULATING_SUPPLY()); + assertEq(templeGold.canDistribute(), false); + // nothing is minted + templeGold.mint(); + assertEq(templeGold.totalSupply(), _totalSupply); + templeGold.mint(); + assertEq(templeGold.totalSupply(), _totalSupply); + assertEq(templeGold.getMintAmount(), 0); + } + + function test_setVestingFactor_repeat_expected_mint_amount() public { + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor; + { + _factor.value = 70; + _factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(_factor); + } + skip(1 days); + uint256 mintAmountDayOne = templeGold.getMintAmount(); + + _factor.value = 35; + // setting vesting factor mints tgld tokens + templeGold.setVestingFactor(_factor); + assertEq(templeGold.getMintAmount(), 0); + skip(1 days); + uint256 mintAmountDayTwo = templeGold.getMintAmount(); + assertApproxEqAbs(mintAmountDayTwo, mintAmountDayOne * 2, 1e22); + skip(1 days); + uint256 mintAmountDayThree = templeGold.getMintAmount() - mintAmountDayTwo; + assertEq(mintAmountDayThree, mintAmountDayTwo); + + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/TempleGoldAdmin.t.sol b/protocol/test/forge/unit/templegold/TempleGoldAdmin.t.sol new file mode 100644 index 000000000..7093dbe97 --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleGoldAdmin.t.sol @@ -0,0 +1,274 @@ +pragma solidity 0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleGoldAdmin.t.sol) + + +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { TempleGoldAdmin } from "contracts/templegold/TempleGoldAdmin.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { EnforcedOptionParam } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import { IOAppOptionsType3 } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppOptionsType3.sol"; + +contract TempleGoldAdminTestBase is TempleGoldCommon { + event ContractAuthorizationSet(address indexed _contract, bool _whitelisted); + event VestingFactorSet(uint128 value, uint128 weekMultiplier); + event DistributionParamsSet(uint256 staking, uint256 auction, uint256 gnosis); + event StakingSet(address staking); + event StableGoldAuctionSet(address auction); + event TeamGnosisSet(address gnosis); + + StableGoldAuction public auction; + TempleGoldStaking public staking; + TempleGold public templeGold; + TempleGold public templeGoldMainnet; + FakeERC20 public templeToken; + TempleGoldAdmin public templeGoldAdmin; + + uint256 public constant MINIMUM_DISTRIBUTION_SHARE = 1 ether; + uint256 public constant ARBITRUM_ONE_BLOCKNUMBER_B = 207201713; + uint256 public constant MINIMUM_MINT = 1_000; + uint256 public arbitrumOneForkId; + uint256 public mainnetForkId; + + function setUp() public { + fork("arbitrum_one", forkBlockNumber); + arbitrumOneForkId = forkId; + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + templeGold = new TempleGold(initArgs); + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + staking = new TempleGoldStaking(rescuer, executor, address(templeToken), address(templeGold)); + auction = new StableGoldAuction( + address(templeGold), + daiToken, + treasury, + rescuer, + executor, + executor + ); + templeGoldAdmin = new TempleGoldAdmin(rescuer, executor, address(templeGold)); + vm.startPrank(executor); + _configureTempleGold(); + templeGold.transferOwnership(address(templeGoldAdmin)); + vm.stopPrank(); + } + + function test_initialization() public { + assertEq(templeGoldAdmin.rescuer(), rescuer); + assertEq(templeGoldAdmin.executor(), executor); + assertEq(address(templeGoldAdmin.templeGold()), address(templeGold)); + assertEq(templeGold.owner(), address(templeGoldAdmin)); + } + + function _configureTempleGold() private { + templeGold.setStableGoldAuction(address(auction)); + ITempleGold.DistributionParams memory params; + params.auction = 60 ether; + params.gnosis = 10 ether; + params.staking = 30 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 2 ether; + factor.weekMultiplier = 1000 ether; + templeGold.setVestingFactor(factor); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(address(teamGnosis)); + // whitelist + templeGold.authorizeContract(address(auction), true); + templeGold.authorizeContract(address(staking), true); + templeGold.authorizeContract(teamGnosis, true); + } +} + +contract TempleGoldAdminAccessTest is TempleGoldAdminTestBase { + function test_access_setStaking_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setStaking(alice); + } + + function test_access_setauction_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setStableGoldAuction(alice); + } + + function test_access_setTeamgnosis_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setTeamGnosis(alice); + } + + function test_access_authorizeContract_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.authorizeContract(alice, true); + } + function test_access_setDistributionParams_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setDistributionParams(_getDistributionParameters()); + } + + function test_access_setVestingFactor_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setVestingFactor(_getVestingFactor()); + } + + function test_access_setMsgInspector_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setMsgInspector(alice); + } + + function test_access_setPreCrime_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setPreCrime(alice); + } + + function test_access_setDelegate_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setDelegate(alice); + } + + function test_access_setPeer_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + templeGoldAdmin.setPeer(MAINNET_LZ_EID, bytes32(uint256(uint160(alice)))); + } + + function test_access_setEnforcedOptions_tgldAdmin() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + EnforcedOptionParam[] memory _params; + templeGoldAdmin.setEnforcedOptions(_params); + } +} + +contract TempleGoldAdminTest is TempleGoldAdminTestBase { + function test_setStaking_tgoldProxy() public { + vm.startPrank(executor); + + vm.expectEmit(address(templeGold)); + emit StakingSet(address(staking)); + templeGoldAdmin.setStaking(address(staking)); + assertEq(address(templeGold.staking()), address(staking)); + vm.expectEmit(address(templeGold)); + emit StakingSet(alice); + templeGoldAdmin.setStaking(alice); + assertEq(address(templeGold.staking()), alice); + } + + function test_setstableGoldAuction_tgoldProxy() public { + vm.startPrank(executor); + + vm.expectEmit(address(templeGold)); + emit StableGoldAuctionSet(address(auction)); + templeGoldAdmin.setStableGoldAuction(address(auction)); + assertEq(address(templeGold.auction()), address(auction)); + vm.expectEmit(address(templeGold)); + emit StableGoldAuctionSet(alice); + templeGoldAdmin.setStableGoldAuction(alice); + assertEq(address(templeGold.auction()), alice); + } + + function test_setTeamGnosis_tgldAdmin() public { + vm.startPrank(executor); + + vm.expectEmit(address(templeGold)); + emit TeamGnosisSet(teamGnosis); + templeGoldAdmin.setTeamGnosis(teamGnosis); + assertEq(templeGold.teamGnosis(), teamGnosis); + vm.expectEmit(address(templeGold)); + emit TeamGnosisSet(alice); + templeGoldAdmin.setTeamGnosis(alice); + assertEq(templeGold.teamGnosis(), alice); + } + + function test_authorizeContract_tgldAdmin() public { + vm.startPrank(executor); + + address _auction = address(auction); + vm.expectEmit(address(templeGold)); + emit ContractAuthorizationSet(_auction, true); + templeGoldAdmin.authorizeContract(_auction, true); + assertEq(templeGold.authorized(_auction), true); + vm.expectEmit(address(templeGold)); + emit ContractAuthorizationSet(_auction, false); + templeGoldAdmin.authorizeContract(_auction, false); + assertEq(templeGold.authorized(_auction), false); + } + + function test_setVestingFactor_tgldAdmin() public { + vm.startPrank(executor); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + vm.expectEmit(address(templeGold)); + emit VestingFactorSet(_factor.value, _factor.weekMultiplier); + templeGoldAdmin.setVestingFactor(_factor); + ITempleGold.VestingFactor memory _vf = templeGold.getVestingFactor(); + assertEq(_vf.value, 10 ether); + assertEq(_vf.weekMultiplier, 100 ether); + } + + function test_setDistributionParameters_tgldAdmin() public { + vm.startPrank(executor); + ITempleGold.DistributionParams memory _params = _getDistributionParameters(); + vm.expectEmit(address(templeGold)); + emit DistributionParamsSet(_params.staking, _params.auction, _params.gnosis); + templeGoldAdmin.setDistributionParams(_params); + + ITempleGold.DistributionParams memory _p = templeGold.getDistributionParameters(); + assertEq(_p.gnosis, _params.gnosis); + assertEq(_p.auction, _params.auction); + assertEq(_p.staking, _params.staking); + } + + function test_setMsgInspector_tgldAdmin() public { + vm.startPrank(executor); + templeGoldAdmin.setMsgInspector(alice); + assertEq(templeGold.msgInspector(), alice); + // msgInspector + } + + function test_setPreCrime_tgldAdmin() public { + vm.startPrank(executor); + templeGoldAdmin.setPreCrime(alice); + assertEq(templeGold.preCrime(), alice); + } + + function test_setDelegate_tgldAdmin() public { + vm.startPrank(executor); + templeGoldAdmin.setDelegate(alice); + // ILayerZeroEndpointV2 does not provide an interface for this variable getter + (, bytes memory data) = layerZeroEndpointArbitrumOne.call{value: 0}(abi.encodeWithSignature("delegates(address)", address(templeGold))); + address delegate = abi.decode(data, (address)); + assertEq(delegate, alice); + } + + function test_setPeer_tgldAdmin() public { + vm.startPrank(executor); + bytes32 peerAsBytes32 = bytes32(uint256(uint160(alice))); + templeGoldAdmin.setPeer(MAINNET_LZ_EID, peerAsBytes32); + assertEq(templeGold.isPeer(MAINNET_LZ_EID, peerAsBytes32), true); + } + + function test_setEnforcedOptions_tgldAdmin() public { + vm.startPrank(executor); + EnforcedOptionParam[] memory enforcedOptions = new EnforcedOptionParam[](1); + enforcedOptions[0] = EnforcedOptionParam(MAINNET_LZ_EID, 1, hex"0004"); // not type 3 + vm.expectRevert(abi.encodeWithSelector(IOAppOptionsType3.InvalidOptions.selector, hex"0004")); + templeGoldAdmin.setEnforcedOptions(enforcedOptions); + + enforcedOptions[0] = EnforcedOptionParam(MAINNET_LZ_EID, 1, hex"0003"); // type 3 + templeGoldAdmin.setEnforcedOptions(enforcedOptions); + assertEq(templeGold.enforcedOptions(MAINNET_LZ_EID, 1), hex"0003"); + } +} diff --git a/protocol/test/forge/unit/templegold/TempleGoldCommon.t.sol b/protocol/test/forge/unit/templegold/TempleGoldCommon.t.sol new file mode 100644 index 000000000..6aa51e6b4 --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleGoldCommon.t.sol @@ -0,0 +1,79 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleGoldCommon.t.sol) + +import { TempleTest } from "../TempleTest.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; + +contract TempleGoldCommon is TempleTest { + address public treasury = makeAddr("treasury"); + address public teamGnosis = makeAddr("teamGnosis"); + address public mike = makeAddr("mike"); + address public layerZeroEndpointArbitrumOne = 0x1a44076050125825900e736c501f859c50fE728c; + address public layerZeroEndpointEthereum = 0x1a44076050125825900e736c501f859c50fE728c; + uint256 public layerZeroEndpointArbitrumId = 30110; + address public usdcToken = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831; // arb USDC + address public daiToken = 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1; //arb DAI + + string public constant TEMPLE_GOLD_NAME = "TEMPLE GOLD"; + string public constant TEMPLE_GOLD_SYMBOL = "TGLD"; + + uint256 public mintChainId = 1; + uint256 public arbitrumOneChainId = 42161; + uint32 public constant MAINNET_LZ_EID = 30101; + uint32 public constant ARBITRUM_ONE_LZ_EID = 30110; + + uint256 public constant forkBlockNumber = 204226954; + uint256 public constant mainnetForkBlockNumber = 20053784; + uint256 public constant WEEK_LENGTH = 7 days; + + string public constant NAME_ONE = "SPICE_AUCTION_TGLD_USDC"; + string public constant NAME_TWO = "SPICE_AUCTION_TGLD_DAI"; + + string public constant VOTE_TOKEN_NAME = "Staked Temple Vote Token"; + string public constant VOTE_TOKEN_SYMBOL = "stTemple"; + + FakeERC20 public fakeERC20; + + receive() external payable {} + + function _approve(address _token, address _spender, uint256 _amount) internal { + IERC20(_token).approve(_spender, _amount); + } + + function _getTempleGoldInitArgs() internal view returns (ITempleGold.InitArgs memory initArgs) { + initArgs.executor = executor; + initArgs.layerZeroEndpoint = layerZeroEndpointArbitrumOne; + initArgs.mintChainId = uint128(arbitrumOneChainId); + initArgs.mintChainLzEid = uint128(ARBITRUM_ONE_LZ_EID); + initArgs.name = TEMPLE_GOLD_NAME; + initArgs.symbol = TEMPLE_GOLD_SYMBOL; + } + + function _getDistributionParameters() internal pure returns (ITempleGold.DistributionParams memory _params) { + _params.staking = 40 ether; + _params.auction = 50 ether; + _params.gnosis = 10 ether; + } + + function _getVestingFactor() internal pure returns (ITempleGold.VestingFactor memory _factor) { + _factor.value = 10 ether; + _factor.weekMultiplier = 100 ether; + } + + function _addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + function _setVestingFactor(TempleGold templeGold) internal { + vm.startPrank(executor); + ITempleGold.VestingFactor memory factor; + factor.value = 35; + factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(factor); + vm.stopPrank(); + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/TempleGoldLayerZero.t.sol b/protocol/test/forge/unit/templegold/TempleGoldLayerZero.t.sol new file mode 100644 index 000000000..6e11d2317 --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleGoldLayerZero.t.sol @@ -0,0 +1,213 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleGoldLayerZero.t.sol) + +// OApp imports +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; + +// OFT imports +import { SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { MessagingFee, MessagingReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; + +// TempleGold imports +import { TempleGoldMock } from "contracts/fakes/templegold/TempleGoldMock.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +// Spice +import { SpiceAuctionMock } from "contracts/fakes/templegold/SpiceAuctionMock.sol"; + +// DevTools imports -- needs to use the local version to avoid stack too deep +import { TestHelperOz5 } from "test/forge/lz-devtools/TestHelperOz5.sol"; + +contract TempleGoldLayerZeroTest is TestHelperOz5 { + using OptionsBuilder for bytes; + + uint32 aEid = 1; + uint32 bEid = 2; + + TempleGoldMock public aTempleGold; + TempleGoldMock public bTempleGold; + + SpiceAuctionMock public aSpice; + SpiceAuctionMock public bSpice; + + address public alice = makeAddr("alice"); + + address public userA = address(0x1); + address public userB = address(0x2); + uint256 public initialBalance = 100 ether; + + event RedeemedTempleGoldBurned(uint256 amount); + event CirculatingSupplyUpdated(address indexed sender, uint256 amount, uint256 circulatingSuppply, uint256 totalBurned); + + function setUp() public virtual override { + vm.deal(userA, 1000 ether); + vm.deal(userB, 1000 ether); + + super.setUp(); + + setUpEndpoints(2, LibraryType.UltraLightNode); + aTempleGold = TempleGoldMock( + _deployOApp(type(TempleGoldMock).creationCode, abi.encode(address(endpoints[aEid]), address(this), "aTempleGold", "aTGOLD")) + ); + bTempleGold = TempleGoldMock( + _deployOApp(type(TempleGoldMock).creationCode, abi.encode(address(endpoints[bEid]), address(this), "bTempleGold", "bTGOLD")) + ); + // todo check mintchainId + uint mintChainId = aEid; + aSpice = SpiceAuctionMock( + payable(_deployOApp(type(SpiceAuctionMock).creationCode, abi.encode(address(aTempleGold), aEid, mintChainId, "aSpice"))) + ); + // mintChainId = bEid; + // use aEid as source chain eid + bSpice = SpiceAuctionMock( + payable(_deployOApp(type(SpiceAuctionMock).creationCode, abi.encode(address(bTempleGold), aEid, mintChainId, "bSpice"))) + ); + + // config and wire the ofts + address[] memory ofts = new address[](2); + ofts[0] = address(aTempleGold); + ofts[1] = address(bTempleGold); + this.wireOApps(ofts); + + // mint tokens + aTempleGold.mint(userA, initialBalance); + bTempleGold.mint(userB, initialBalance); + aTempleGold.mint(address(aSpice), initialBalance); + bTempleGold.mint(address(bSpice), initialBalance); + } + + function test_send_tgld() public { + uint256 tokensToSend = 1 ether; + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + bEid, + addressToBytes32(userB), + tokensToSend, + tokensToSend, + options, + bytes("something"), // compose message + "" + ); + MessagingFee memory fee = aTempleGold.quoteSend(sendParam, false); + + vm.startPrank(userA); + vm.expectRevert(abi.encodeWithSelector(ITempleGold.CannotCompose.selector)); + aTempleGold.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + sendParam.composeMsg = ""; + + vm.expectRevert(abi.encodeWithSelector(ITempleGold.NonTransferrable.selector, userA, userB)); + aTempleGold.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + + sendParam.to = addressToBytes32(userA); + + vm.startPrank(userA); + (MessagingReceipt memory msgReceipt,) = + aTempleGold.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + emit log_string("messaging receipt"); + emit log_bytes32(msgReceipt.guid); + verifyPackets(bEid, addressToBytes32(address(bTempleGold))); + + assertEq(aTempleGold.balanceOf(userA), initialBalance - tokensToSend); + assertEq(bTempleGold.balanceOf(userB), initialBalance); + assertEq(bTempleGold.balanceOf(userA), tokensToSend); + + vm.startPrank(userB); + sendParam.dstEid = aEid; + vm.expectRevert(abi.encodeWithSelector(ITempleGold.NonTransferrable.selector, userB, userA)); + bTempleGold.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + + sendParam.to = addressToBytes32(userB); + bTempleGold.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + verifyPackets(bEid, addressToBytes32(address(bTempleGold))); + assertEq(aTempleGold.balanceOf(userA), initialBalance - tokensToSend); + assertEq(bTempleGold.balanceOf(userB), initialBalance - tokensToSend); + assertEq(bTempleGold.balanceOf(userA), tokensToSend); + // todo remove + address r = 0xC785695710292c042a2de8A0Ba16F3a054cC2eAD; + emit log_bytes32(addressToBytes32(r)); + emit log_uint(1 ether); + emit log_uint(1); + emit log_bytes(options); + emit log_bytes(bytes("")); + emit log_bytes(bytes("")); + emit log_bytes32(addressToBytes32(0x192aA9BfDcA5540406E211950C226C8E0cd5047F)); + emit log_bytes32(addressToBytes32(0x8afB7E03a6e115577361C5648924eBA3163381Fc)); + + // ["40161", "0x000000000000000000000000c785695710292c042a2de8a0ba16f3a054cc2ead", "1000000000000000000", "1", "0x00030100110100000000000000000000000000030d40", "0x", "0x"] + } + + function test_redemption_cross_chain() public { + uint256 amount = 10 ether; + uint256 etherAmount = 5 ether; + vm.deal(address(aSpice), etherAmount); + vm.deal(address(bSpice), etherAmount); + vm.deal(address(this), etherAmount); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(100_000, 0); + SendParam memory sendParam = SendParam( + aEid, //, + bytes32(uint256(uint160(address(0)))), // bytes32(address(0)) to burn + amount, + 0, + options, + bytes(""), // compose message + "" + ); + MessagingFee memory fee = TempleGoldMock(bTempleGold).quoteSend(sendParam, false); + + // aTempleGold is source + uint256 circulatingSupplyBefore = aTempleGold.circulatingSupply(); + // use contract ether + bSpice.burnAndNotify(amount, true); + verifyPackets(aEid, addressToBytes32(address(aTempleGold))); + assertEq(circulatingSupplyBefore-amount, aTempleGold.circulatingSupply()); + assertLt(address(bSpice).balance, etherAmount); + + // use msg.value + circulatingSupplyBefore = aTempleGold.circulatingSupply(); + // drain eth + bSpice.withdrawEth(payable(address(this)), address(bSpice).balance); + uint256 balanceBefore = address(this).balance; + uint256 spiceBalanceBefore = address(bSpice).balance; + vm.expectEmit(address(bSpice)); + emit RedeemedTempleGoldBurned(amount); + bSpice.burnAndNotify{value: fee.nativeFee }(amount, false); + verifyPackets(aEid, addressToBytes32(address(aTempleGold))); + + assertEq(circulatingSupplyBefore-amount, aTempleGold.circulatingSupply()); + assertEq(spiceBalanceBefore, address(bSpice).balance); + assertLt(address(this).balance, balanceBefore); + assertEq(address(bSpice).balance, 0); + } + + function test_redemption_after_bid_cross_chain_truncation() public { + uint256 amount = 12_333_456_789_012_345_678_900; + uint256 maxSupply = aTempleGold.MAX_CIRCULATING_SUPPLY(); + uint256 currentSupply = aTempleGold.circulatingSupply(); + vm.deal(address(aSpice), 1 ether); + vm.deal(address(bSpice), 1 ether); + vm.deal(alice, 1 ether); + { + aTempleGold.mint(address(aSpice), amount); + assertEq(aTempleGold.circulatingSupply(), amount + currentSupply); + // mint max circulating supply + currentSupply += amount; + aTempleGold.mint(alice, maxSupply - currentSupply); + assertEq(aTempleGold.circulatingSupply(), maxSupply); + currentSupply = aTempleGold.circulatingSupply(); + } + + // send remainder to burn + bTempleGold.mint(address(bSpice), amount - bTempleGold.balanceOf(address(bSpice))); + + // burn tgld from spice on chain b + /// @dev Conversion to and from shared decimals and local decimals truncates trailing zeros + uint256 amountTruncated = 12_333_456_789_000_000_000_000; + emit log_uint(bTempleGold.balanceOf(address(bSpice))); + uint256 bSpiceBalance = bTempleGold.balanceOf(address(bSpice)); + bSpice.burnAndNotify(amount, true); + verifyPackets(aEid, addressToBytes32(address(aTempleGold))); + assertEq(bSpiceBalance - amountTruncated, bTempleGold.balanceOf(address(bSpice))); + assertEq(aTempleGold.circulatingSupply(), currentSupply - amountTruncated); + } +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/TempleGoldStaking.t.sol b/protocol/test/forge/unit/templegold/TempleGoldStaking.t.sol new file mode 100644 index 000000000..fb65d1ca1 --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleGoldStaking.t.sol @@ -0,0 +1,1425 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleGoldStaking.t.sol) + + +import { TempleGoldCommon } from "./TempleGoldCommon.t.sol"; +import { FakeERC20 } from "contracts/fakes/FakeERC20.sol"; +import { TempleGold } from "contracts/templegold/TempleGold.sol"; +import { TempleGoldStaking } from "contracts/templegold/TempleGoldStaking.sol"; +import { ITempleGold } from "contracts/interfaces/templegold/ITempleGold.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { StableGoldAuction } from "contracts/templegold/StableGoldAuction.sol"; +import { ITempleGoldStaking } from "contracts/interfaces/templegold/ITempleGoldStaking.sol"; +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { TempleGoldStakingMock } from "contracts/fakes/templegold/TempleGoldStakingMock.sol"; +import { ITempleElevatedAccess } from "contracts/interfaces/v2/access/ITempleElevatedAccess.sol"; + +contract TempleGoldStakingTestBase is TempleGoldCommon { + + event Paused(address account); + event Unpaused(address account); + event GoldDistributionNotified(uint256 amount, uint256 timestamp); + event Staked(address indexed staker, uint256 amount); + event MigratorSet(address migrator); + event Withdrawn(address indexed staker, address to, uint256 amount); + event RewardDistributionCoolDownSet(uint160 cooldown); + event DistributionStarterSet(address indexed starter); + event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + event RewardPaid(address indexed staker, address toAddress, uint256 reward); + event RewardDurationSet(uint256 duration); + event UnstakeCooldownSet(uint32 period); + event DAOExecutorSet(address indexed daoExecutor); + + IERC20 public bidToken; + IERC20 public bidToken2; + StableGoldAuction public daiGoldAuction; + FakeERC20 public templeToken; + TempleGoldStaking public staking; + TempleGoldStakingMock public mockStaking; + TempleGold public templeGold; + + function setUp() public { + fork("arbitrum_one", forkBlockNumber); + + ITempleGold.InitArgs memory initArgs = _getTempleGoldInitArgs(); + + templeGold = new TempleGold(initArgs); + templeToken = new FakeERC20("Temple Token", "TEMPLE", executor, 1000 ether); + staking = new TempleGoldStaking(rescuer, executor, address(templeToken), address(templeGold)); + mockStaking = new TempleGoldStakingMock(rescuer, executor, address(templeToken), address(templeGold), address(staking)); + vm.startPrank(executor); + templeGold.authorizeContract(address(staking), true); + bidToken = IERC20(daiToken); + bidToken2 = IERC20(usdcToken); + daiGoldAuction = new StableGoldAuction( + address(templeGold), + address(bidToken), + treasury, + rescuer, + executor, + executor + ); + _configureTempleGold(); + staking.setDistributionStarter(executor); + vm.stopPrank(); + } + + function test_initialization() public { + assertEq(staking.rescuer(), rescuer); + assertEq(staking.executor(), executor); + assertEq(address(staking.stakingToken()), address(templeToken)); + assertEq(address(staking.rewardToken()), address(templeGold)); + } + + function _configureTempleGold() private { + templeGold.setStableGoldAuction(address(daiGoldAuction)); + ITempleGold.DistributionParams memory params; + params.auction = 60 ether; + params.gnosis = 10 ether; + params.staking = 30 ether; + templeGold.setDistributionParams(params); + ITempleGold.VestingFactor memory factor; + factor.value = 35; + factor.weekMultiplier = 1 weeks; + templeGold.setVestingFactor(factor); + templeGold.setStaking(address(staking)); + templeGold.setTeamGnosis(teamGnosis); + // whitelist + templeGold.authorizeContract(address(daiGoldAuction), true); + templeGold.authorizeContract(address(staking), true); + templeGold.authorizeContract(teamGnosis, true); + } + + function _setRewardDuration(uint256 _duration) internal { + vm.startPrank(executor); + staking.setRewardDuration(_duration); + vm.stopPrank(); + } + + function _setVestingFactor() internal { + uint32 _rewardDuration = 1 weeks; + _setRewardDuration(_rewardDuration); + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + } + + function _distributeRewards(address _nextPrank) internal { + vm.startPrank(executor); + staking.distributeRewards(); + if (_nextPrank != address(0)) { + vm.startPrank(_nextPrank); + } + } + + function _setUnstakeCooldown() internal { + vm.startPrank(executor); + uint32 cooldown = 1 weeks; + staking.setUnstakeCooldown(cooldown); + vm.stopPrank(); + } +} + +contract TempleGoldStakingAccessTest is TempleGoldStakingTestBase { + function test_access_setDistributionStarter() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setDistributionStarter(alice); + } + + function test_access_setMigrator() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setMigrator(alice); + } + + function test_access_setRewardDistributionCoolDown() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setRewardDistributionCoolDown(10); + } + + function test_access_pause() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.pause(); + } + + function test_access_setRewardDuration() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setRewardDuration(1); + } + + function test_access_unpause() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.unpause(); + } + + function test_access_setUnstakeCooldown() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setUnstakeCooldown(1 weeks); + } + + function test_access_setDaoExecutor() public { + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setDaoExecutor(alice); + + vm.startPrank(executor); + staking.setDaoExecutor(alice); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setDaoExecutor(bob); + } + + function test_access_setMigrator_when_dao() public { + vm.startPrank(executor); + staking.setDaoExecutor(alice); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setMigrator(bob); + } +} + +contract TempleGoldStakingTest is TempleGoldStakingTestBase { + function test_pauseUnpause_staking() public { + // testing not when paused + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit Paused(executor); + staking.pause(); + vm.expectEmit(address(staking)); + emit Unpaused(executor); + staking.unpause(); + } + + function test_revert_withdraw_when_paused() public { + _setVestingFactor(); + vm.startPrank(alice); + deal(address(templeToken), alice, 1 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + vm.startPrank(executor); + uint32 cooldown = 1 weeks; + staking.setUnstakeCooldown(cooldown); + vm.startPrank(alice); + staking.stake(1 ether); + + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit Paused(executor); + staking.pause(); + skip(cooldown); + vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); + staking.withdraw(1, false); + + staking.unpause(); + vm.startPrank(alice); + staking.withdraw(1, false); + } + + function test_get_account_unstake_time() public { + _setRewardDuration(1 weeks); + _setVestingFactor(); + _setUnstakeCooldown(); + + vm.startPrank(alice); + deal(address(templeToken), alice, 2 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + uint256 cooldown = staking.unstakeCooldown(); + staking.stake(1 ether); + uint256 unstakeTime = block.timestamp + cooldown; + assertEq(unstakeTime, staking.getAccountUnstakeTime(alice)); + + vm.startPrank(executor); + staking.setUnstakeCooldown(3 days); + unstakeTime = block.timestamp + 3 days; + vm.startPrank(alice); + staking.stake(1 ether); + assertEq(unstakeTime, staking.getAccountUnstakeTime(alice)); + } + + function test_revert_distribute_when_paused() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(alice); + deal(address(templeToken), alice, 1 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(1 ether); + + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit Paused(executor); + staking.pause(); + + skip(3 days); + vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); + _distributeRewards(address(0)); + + vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); + _distributeRewards(address(0)); + + staking.unpause(); + staking.distributeGold(); + _distributeRewards(address(0)); + } + + function test_revert_get_reward_when_paused() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(alice); + deal(address(templeToken), alice, 1 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(1 ether); + + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit Paused(executor); + staking.pause(); + + skip(3 days); + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); + staking.getReward(alice); + + vm.startPrank(executor); + staking.unpause(); + staking.getReward(alice); + } + + function test_stake_when_paused() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit Paused(executor); + staking.pause(); + + vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); + staking.stake(1 ether); + + staking.unpause(); + deal(address(templeToken), executor, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(1 ether); + } + + function test_setDistributionStarter() public { + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit DistributionStarterSet(alice); + staking.setDistributionStarter(alice); + + assertEq(staking.distributionStarter(), alice); + vm.expectEmit(address(staking)); + emit DistributionStarterSet(bob); + staking.setDistributionStarter(bob); + + assertEq(staking.distributionStarter(), bob); + } + + function test_setDaoExecutor_staking() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + staking.setDaoExecutor(address(0)); + + vm.expectEmit(address(staking)); + emit DAOExecutorSet(alice); + staking.setDaoExecutor(alice); + assertEq(staking.daoExecutor(), alice); + + // only DAO executor can set dao executor + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.setDaoExecutor(bob); + + emit log_address(staking.daoExecutor()); + vm.startPrank(alice); + vm.expectEmit(address(staking)); + emit DAOExecutorSet(bob); + staking.setDaoExecutor(bob); + assertEq(staking.daoExecutor(), bob); + } + + function test_setMigrator() public { + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + staking.setMigrator(address(0)); + + vm.expectEmit(address(staking)); + emit MigratorSet(alice); + staking.setMigrator(alice); + assertEq(staking.migrator(), alice); + } + + function test_setRewardsDistributionCooldown() public { + vm.startPrank(executor); + vm.expectEmit(address(staking)); + emit RewardDistributionCoolDownSet(10 seconds); + staking.setRewardDistributionCoolDown(10 seconds); + assertEq(staking.rewardDistributionCoolDown(), 10 seconds); + + vm.expectEmit(address(staking)); + emit RewardDistributionCoolDownSet(1 minutes); + staking.setRewardDistributionCoolDown(1 minutes); + assertEq(staking.rewardDistributionCoolDown(), 1 minutes); + } + + function test_setRewardDuration() public { + _setUnstakeCooldown(); + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + staking.setRewardDuration(0); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + staking.setRewardDuration(WEEK_LENGTH-1); + uint256 duration = 16 weeks; + vm.expectEmit(address(staking)); + emit RewardDurationSet(duration); + staking.setRewardDuration(duration); + assertEq(staking.rewardDuration(), duration); + duration += WEEK_LENGTH; + staking.setRewardDuration(duration); + assertEq(staking.rewardDuration(), duration); + + // distribute and test change + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + + skip(3 days); + deal(address(templeToken), bob, 1000 ether, true); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(100 ether); + _distributeRewards(address(0)); // executor prank + vm.expectRevert(abi.encodeWithSelector(ITempleGoldStaking.InvalidOperation.selector)); + staking.setRewardDuration(duration); + } + + function test_migrateWithdraw_tgldStaking() public { + vm.startPrank(executor); + staking.setMigrator(alice); + uint256 _rewardDuration = 16 weeks; + _setVestingFactor(templeGold); + _setRewardDuration(_rewardDuration); + _setUnstakeCooldown(); + // bob stakes + vm.startPrank(bob); + deal(address(templeToken), bob, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(100 ether); + + // invalid access + vm.startPrank(unauthorizedUser); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.migrateWithdraw(bob); + uint256 aliceTempleBalance = templeToken.balanceOf(alice); + uint256 bobGoldBalance = templeGold.balanceOf(bob); + // distribute rewards to earn + skip(2 days); + _distributeRewards(bob); + uint256 bobEarned = staking.earned(bob); + vm.startPrank(alice); + // invalid staker + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + staking.migrateWithdraw(address(0)); + // zero stake + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + staking.migrateWithdraw(unauthorizedUser); + + vm.expectEmit(address(staking)); + emit Withdrawn(bob, alice, 100 ether); + staking.migrateWithdraw(bob); + assertEq(templeToken.balanceOf(alice), aliceTempleBalance + 100 ether); + assertEq(templeGold.balanceOf(bob), bobGoldBalance + bobEarned); + } + + function test_migrateWithdraw_end_to_end() public { + uint256 _rewardDuration = 16 weeks; + _setVestingFactor(templeGold); + _setRewardDuration(_rewardDuration); + _setUnstakeCooldown(); + vm.startPrank(executor); + staking.setMigrator(address(mockStaking)); + + // some stakes + uint256 stakeAmount = 100 ether; + deal(address(templeToken), bob, 1000 ether, true); + deal(address(templeToken), alice, 1000 ether, true); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + vm.startPrank(alice); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + assertEq(staking.balanceOf(alice), stakeAmount); + assertEq(staking.balanceOf(bob), stakeAmount); + assertEq(templeToken.balanceOf(address(staking)), 2*stakeAmount); + + // distribute rewards + skip(2 days); + _distributeRewards(alice); + skip(2 days); + uint256 bobEarned = staking.earned(bob); + uint256 aliceEarned = staking.earned(alice); + // migrate withdraw + mockStaking.migrateFromPreviousStaking(); + assertEq(staking.balanceOf(alice), 0); + assertEq(staking.earned(alice), 0); + assertEq(mockStaking.balanceOf(alice), stakeAmount); + assertEq(templeGold.balanceOf(alice), aliceEarned); + + vm.startPrank(bob); + mockStaking.migrateFromPreviousStaking(); + assertEq(staking.balanceOf(bob), 0); + assertEq(staking.earned(bob), 0); + assertEq(mockStaking.balanceOf(bob), stakeAmount); + assertEq(templeGold.balanceOf(bob), bobEarned); + } + + function test_distributeRewards() public { + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + + uint256 _period = 16 weeks; + { + _setRewardDuration(_period); + _setVestingFactor(templeGold); + _setUnstakeCooldown(); + } + + { + skip(1 days); + vm.startPrank(executor); + staking.setDistributionStarter(alice); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.distributeRewards(); + } + + { + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(ITempleGoldStaking.NoStaker.selector)); + staking.distributeRewards(); + } + + { + deal(address(templeToken), bob, 1000 ether, true); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(1 ether); + } + + uint256 rewardAmount; + uint256 mintAmount; + { + vm.startPrank(alice); + rewardAmount = staking.nextRewardAmount(); + ITempleGoldStaking.Reward memory rewardDataBefore = staking.getRewardData(); + assertEq(rewardDataBefore.rewardRate, 0); + assertEq(rewardDataBefore.lastUpdateTime, 0); + assertEq(rewardDataBefore.periodFinish, 0); + assertEq(staking.rewardPeriodFinish(), 0); + ITempleGold.DistributionParams memory params = templeGold.getDistributionParameters(); + mintAmount = templeGold.getMintAmount(); + + // amount for staking + mintAmount = mintAmount * params.staking / 100 ether; + vm.expectEmit(address(staking)); + emit GoldDistributionNotified(mintAmount, block.timestamp); + staking.distributeRewards(); + } + + uint256 rewardBalance; + uint256 rewardRate; + { + rewardBalance = templeGold.balanceOf(address(staking)); + assertGt(rewardBalance, rewardAmount); + assertEq(staking.lastRewardNotificationTimestamp(), block.timestamp); + // reward params were set + rewardRate = rewardBalance / _period; + ITempleGoldStaking.Reward memory rewardData = staking.getRewardData(); + assertEq(rewardData.rewardRate, rewardRate); + assertEq(rewardData.lastUpdateTime, block.timestamp); + assertEq(rewardData.periodFinish, block.timestamp + _period); + } + + uint160 cooldown; + { + // reward distribution cooldown is not zero + vm.startPrank(executor); + cooldown = 1 days; + staking.setRewardDistributionCoolDown(cooldown); + assertEq(staking.rewardDistributionCoolDown(), cooldown); + staking.setDistributionStarter(executor); + vm.expectRevert(abi.encodeWithSelector(ITempleGoldStaking.CannotDistribute.selector)); + staking.distributeRewards(); + + vm.warp(block.timestamp + cooldown + 1); + staking.setRewardDistributionCoolDown(0); + } + + { + // mint so there's nothing for next transaction + _factor = _getVestingFactor(); + _factor.value = 99 ether; + _factor.weekMultiplier = 100 ether; + templeGold.setVestingFactor(_factor); + skip(100 days); + _distributeRewards(address(0)); + + // zero rewards minted, so no reward notification from TGLD. this is also for TempleGold max supply case. + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + _distributeRewards(address(0)); + } + } + + function test_distributeGold_staking() public { + _setVestingFactor(templeGold); + skip(1 days); + uint256 mintAmount = templeGold.getMintAmount(); + uint256 stakingAmount = 30 * mintAmount / 100; + staking.distributeGold(); + assertEq(templeGold.balanceOf(address(staking)), stakingAmount); + vm.warp(block.timestamp + 103 days); + mintAmount = templeGold.getMintAmount(); + uint256 stakingAmount2 = 30 * mintAmount / 100; + staking.distributeGold(); + assertGt(stakingAmount2, stakingAmount); + assertEq(templeGold.balanceOf(address(staking)), stakingAmount2+stakingAmount); + } + + function test_notifyDistribution_revert() public { + vm.startPrank(alice); + uint256 amount = 1000 ether; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAccess.selector)); + staking.notifyDistribution(amount); + } + + function test_setUnstakeCooldown() public { + vm.startPrank(executor); + uint32 invalidUnstakeCooldown = staking.MAXIMUM_UNSTAKE_COOLDOWN()+1; + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidParam.selector)); + staking.setUnstakeCooldown(invalidUnstakeCooldown); + + vm.expectEmit(address(staking)); + emit UnstakeCooldownSet(1 weeks); + staking.setUnstakeCooldown(1 weeks); + assertEq(staking.unstakeCooldown(), 1 weeks); + + vm.expectEmit(address(staking)); + emit UnstakeCooldownSet(2 weeks); + staking.setUnstakeCooldown(2 weeks); + assertEq(staking.unstakeCooldown(), 2 weeks); + } + + function test_recoverToken_tgld_staking() public { + uint256 amount = 100 ether; + deal(daiToken, address(staking), amount, true); + + vm.startPrank(executor); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + staking.recoverToken(address(templeGold), alice, amount); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + staking.recoverToken(address(templeToken), alice, amount); + + vm.expectEmit(); + emit CommonEventsAndErrors.TokenRecovered(alice, daiToken, amount); + + staking.recoverToken(daiToken, alice, amount); + assertEq(IERC20(daiToken).balanceOf(alice), amount); + assertEq(IERC20(daiToken).balanceOf(address(staking)), 0); + } + + function test_notifyDistribution_explicit_access() public { + skip(1 weeks); + templeGold.mint(); + vm.startPrank(executor); + ITempleElevatedAccess.ExplicitAccess[] memory _accesses = new ITempleElevatedAccess.ExplicitAccess[](1); + ITempleElevatedAccess.ExplicitAccess memory _access; + _access.fnSelector = staking.notifyDistribution.selector; + _access.allowed = true; + _accesses[0] = _access; + staking.setExplicitAccess(teamGnosis, _accesses); + + // now team gnosis can send TGLD to staking contract and notify distribution + vm.startPrank(teamGnosis); + uint256 nextRewardAmount = staking.nextRewardAmount(); + uint256 amount = 1 ether; + IERC20(templeGold).transfer(address(staking), amount); + staking.notifyDistribution(amount); + assertEq(staking.nextRewardAmount(), amount+nextRewardAmount); + } + + function test_withdraw_single_account_single_stake() public { + { + _setUnstakeCooldown(); + _setVestingFactor(); + } + skip(3 days); + { + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + staking.withdraw(0, false); + } + uint256 goldRewardAmount; + uint256 dustAmount; + uint256 stakeAmount = 100 ether; + { + vm.startPrank(alice); + deal(address(templeToken), alice, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + _distributeRewards(alice); + dustAmount = staking.nextRewardAmount(); + goldRewardAmount = templeGold.balanceOf(address(staking)) - dustAmount; + } + + { + skip(1 weeks); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, stakeAmount/2); + staking.withdraw(stakeAmount/2, false); + assertEq(staking.balanceOf(alice), stakeAmount/2); + assertEq(templeToken.balanceOf(alice), 1000 ether - stakeAmount/2); + assertEq(staking.totalSupply(), stakeAmount/2); + assertEq(goldRewardAmount, staking.earned(alice)); + } + + { + skip(1 weeks); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, stakeAmount/2); + staking.withdraw(stakeAmount/2, true); + assertEq(staking.balanceOf(alice), 0); + assertEq(templeToken.balanceOf(alice), 1000 ether); + assertEq(staking.totalSupply(), 0); + assertEq(0, staking.earned(alice)); + } + } + + function _getEarned(address _account) internal view returns(uint256) { + uint balance = staking.balanceOf(_account); + uint rewardPerToken = staking.rewardPerToken(); + uint claimableRewards = staking.claimableRewards(_account); + uint userRewardPerTokenPaid = staking.userRewardPerTokenPaid(_account); + return balance * (rewardPerToken - userRewardPerTokenPaid) / 1e18 + claimableRewards; + } + + function test_withdraw_multiple_accounts_multiple_stakes() public { + { + _setVestingFactor(); + _setUnstakeCooldown(); + } + skip(3 days); + uint256 goldRewardAmount; + uint256 dustAmount; + uint256 stakeAmount = 100 ether; + { + vm.startPrank(bob); + deal(address(templeToken), alice, 1000 ether, true); + deal(address(templeToken), bob, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + vm.startPrank(alice); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + vm.startPrank(executor); + staking.distributeRewards(); + dustAmount = staking.nextRewardAmount(); + goldRewardAmount = templeGold.balanceOf(address(staking)) - dustAmount; + } + + { + // unstake cooldown + vm.startPrank(alice); + vm.expectRevert(abi.encodeWithSelector(ITempleGoldStaking.UnstakeCooldown.selector, block.timestamp, block.timestamp+1 weeks)); + staking.withdraw(stakeAmount, false); + skip(1 weeks); + // insufficient balance + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InsufficientBalance.selector, address(templeToken), stakeAmount+1, stakeAmount)); + staking.withdraw(stakeAmount+1, true); + } + uint256 earned; + uint256 balanceBefore; + uint256 balanceAfter; + { + earned = staking.earned(alice); + balanceBefore = templeGold.balanceOf(alice); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, 100 ether); + staking.withdraw(stakeAmount, true); + balanceAfter = templeGold.balanceOf(alice); + assertEq(templeToken.balanceOf(alice), 1000 ether); + assertEq(staking.totalSupply(), 100 ether); + assertEq(0, staking.earned(alice)); + assertEq(earned, balanceAfter-balanceBefore); + vm.startPrank(bob); + balanceBefore = templeGold.balanceOf(bob); + vm.expectEmit(address(staking)); + emit Withdrawn(bob, bob, 100 ether); + staking.withdraw(stakeAmount, true); + balanceAfter = templeGold.balanceOf(bob); + assertEq(templeToken.balanceOf(bob), 1000 ether); + assertEq(staking.totalSupply(), 0); + assertEq(0, staking.earned(bob)); + assertEq(earned, balanceAfter-balanceBefore); + } + uint256 oldDustAmount; + uint256 goldBalanceBefore; + { + skip(1 days); + _setRewardDuration(10 days); + vm.startPrank(alice); + staking.stake(stakeAmount); + vm.startPrank(bob); + staking.stake(stakeAmount); + vm.startPrank(executor); + goldBalanceBefore = templeGold.balanceOf(address(staking)); + oldDustAmount = dustAmount; + staking.distributeRewards(); + dustAmount = staking.nextRewardAmount(); + goldRewardAmount = templeGold.balanceOf(address(staking)) - goldBalanceBefore - dustAmount + oldDustAmount; + skip(1 days); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount/10); + skip(1 days); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount*2/10); + skip(3 days); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount*5/10); + skip(5 days); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount); + + balanceBefore = templeGold.balanceOf(bob); + vm.startPrank(bob); + vm.expectEmit(address(staking)); + emit Withdrawn(bob, bob, 100 ether); + staking.withdraw(stakeAmount, true); + assertEq(templeGold.balanceOf(bob), goldRewardAmount/2 + balanceBefore); + + balanceBefore = templeGold.balanceOf(alice); + vm.startPrank(alice); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, 100 ether); + staking.withdraw(stakeAmount, true); + assertEq(staking.earned(alice), 0); + assertEq(staking.earned(bob), 0); + assertEq(templeGold.balanceOf(alice), goldRewardAmount/2 + balanceBefore); + } + // partial withdraws + { + vm.startPrank(executor); + staking.setUnstakeCooldown(4 days); + vm.startPrank(alice); + staking.stake(70 ether); + vm.startPrank(bob); + staking.stake(30 ether); + vm.startPrank(executor); + goldBalanceBefore = templeGold.balanceOf(address(staking)); + oldDustAmount = dustAmount; + staking.distributeRewards(); + dustAmount = staking.nextRewardAmount(); + goldRewardAmount = templeGold.balanceOf(address(staking)) - goldBalanceBefore - dustAmount + oldDustAmount; + skip(1 days); + assertEq(staking.earned(alice), goldRewardAmount*7/100); + assertEq(staking.earned(bob), goldRewardAmount*3/100); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount/10); + skip(1 days); + assertEq(staking.earned(alice), goldRewardAmount*14/100); + assertEq(staking.earned(bob), goldRewardAmount*6/100); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount*2/10); + skip(3 days); + assertEq(staking.earned(alice), goldRewardAmount*35/100); + assertEq(staking.earned(bob), goldRewardAmount*15/100); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount*5/10); + // alice withdraws half + vm.startPrank(alice); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, 40 ether); + staking.withdraw(40 ether, false); + assertEq(staking.claimableRewards(alice), goldRewardAmount*35/100); + skip(3 days); + assertEq(staking.earned(alice), _getEarned(alice)); + skip(2 days); + assertEq(staking.earned(alice)+staking.earned(bob), goldRewardAmount); + balanceBefore = templeGold.balanceOf(alice); + earned = staking.earned(alice); + staking.getReward(alice); + assertEq(templeGold.balanceOf(alice), earned+balanceBefore); + vm.startPrank(bob); + balanceBefore = templeGold.balanceOf(bob); + earned = staking.earned(bob); + staking.getReward(bob); + assertEq(templeGold.balanceOf(bob), earned+balanceBefore); + + } + } + + function test_reward_params_tgldStaking() public { + uint256 _period = 4 weeks; + _setVestingFactor(); + _setRewardDuration(_period); + _setUnstakeCooldown(); + + skip(1 days); + vm.startPrank(alice); + deal(address(templeToken), alice, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(100 ether); + uint256 goldBalanceBefore = templeGold.balanceOf(address(staking)); + uint256 ts = block.timestamp; + _distributeRewards(alice); + uint256 goldBalanceAfter = templeGold.balanceOf(address(staking)); + uint256 rewardsAmount = goldBalanceAfter - goldBalanceBefore; + + skip(1 days); + + ITempleGoldStaking.Reward memory rdata = staking.getRewardData(); + assertEq(rdata.rewardRate, rewardsAmount / _period); + assertEq(rdata.periodFinish, ts + _period); + assertEq(rdata.lastUpdateTime, ts); + uint256 dust = rewardsAmount - (rdata.rewardRate * _period); + assertEq(dust, staking.nextRewardAmount()); + + skip(2 weeks); + goldBalanceBefore = templeGold.balanceOf(address(staking)); + ts = block.timestamp; + _distributeRewards(alice); + goldBalanceAfter = templeGold.balanceOf(address(staking)); + uint256 remaining = uint256(rdata.periodFinish) - block.timestamp; + uint256 leftover = remaining * rdata.rewardRate + dust; + rewardsAmount = goldBalanceAfter - goldBalanceBefore; + uint256 rewardRate = uint216((rewardsAmount + leftover) / _period); + rdata = staking.getRewardData(); + assertEq(rdata.rewardRate, rewardRate); + assertEq(rdata.periodFinish, ts + _period); + assertEq(rdata.lastUpdateTime, ts); + // check dust amount + dust = (rewardsAmount + leftover) - (rewardRate * _period); + assertEq(dust, staking.nextRewardAmount()); + } + + function test_reward_per_token_when_lastUpdateTime_is_periodFinish() public { + ITempleGold.VestingFactor memory _factor = _getVestingFactor(); + _factor.value = 35; + _factor.weekMultiplier = 1 weeks; + vm.startPrank(executor); + templeGold.setVestingFactor(_factor); + + uint256 _period = 7 days; + { + _setRewardDuration(_period); + _setVestingFactor(templeGold); + _setUnstakeCooldown(); + } + + { + skip(1 days); + vm.startPrank(executor); + staking.setDistributionStarter(alice); + } + + { + deal(address(templeToken), bob, 1000 ether, true); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(1 ether); + } + + uint256 rewardPerToken; + uint256 lastUpdateTime; + { + vm.startPrank(alice); + staking.distributeRewards(); + ITempleGoldStaking.Reward memory rewardData = staking.getRewardData(); + rewardPerToken = staking.rewardPerToken(); + // skip some time + skip(3 days); + assertGt(staking.rewardPerToken(), rewardPerToken); + // period finish is not same as last update time so expect full reward formular used + lastUpdateTime = rewardData.lastUpdateTime; + rewardPerToken = + _calculateRewardPerToken(rewardPerToken, lastUpdateTime, + block.timestamp, rewardData.rewardRate, staking.totalSupply()); + vm.startPrank(bob); + // take action to update rewards data + staking.stake(1 ether); + // updateReward called after stake so check + assertEq(staking.rewardPerToken(), rewardPerToken); + // still below period finish + vm.warp(rewardData.periodFinish - 1); + lastUpdateTime = block.timestamp; + rewardPerToken = staking.rewardPerToken(); + rewardPerToken = + _calculateRewardPerToken(rewardPerToken, lastUpdateTime, + block.timestamp, rewardData.rewardRate, staking.totalSupply()); + // take action to call updateReward + staking.stake(1 ether); + assertEq(staking.rewardPerToken(), rewardPerToken); + // at period finish + skip(1 seconds); + lastUpdateTime = block.timestamp; + rewardPerToken = staking.rewardPerToken(); + rewardPerToken = + _calculateRewardPerToken(rewardPerToken, lastUpdateTime, + rewardData.periodFinish, rewardData.rewardRate, staking.totalSupply()); + assertEq(staking.rewardPerToken(), rewardPerToken); + skip(1 seconds); + // last update time will be set to period finish in `updateReward` + staking.stake(1 ether); + assertEq(staking.rewardPerToken(), rewardPerToken); + assertEq(lastUpdateTime, rewardData.periodFinish); + skip(1 weeks); + staking.stake(1 ether); + assertEq(staking.rewardPerToken(), rewardPerToken); + } + } + + function _calculateRewardPerToken( + uint256 rewardPerToken, + uint256 lastUpdateTime, + uint256 lastTimeRewardApplicable, + uint256 rewardRate, + uint256 totalSupply + ) private pure returns (uint256) { + return rewardPerToken + + (((lastTimeRewardApplicable - + lastUpdateTime) * + rewardRate * 1e18) + / totalSupply); + } + + function test_check_votes_tgld_staking() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(alice); + staking.delegate(alice); + + assertEq(staking.getCurrentVotes(alice), 0); + vm.expectRevert(abi.encodeWithSelector(ITempleGoldStaking.InvalidBlockNumber.selector)); + assertEq(staking.getPriorVotes(alice, block.number), 0); + assertEq(staking.getPriorVotes(alice, block.number - 1), 0); + + // stake + uint256 stakeAmount = 1 ether; + deal(address(templeToken), alice, 100 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + + uint256 blockNumber = block.number; + assertEq(staking.getCurrentVotes(alice), stakeAmount); + assertEq(staking.getPriorVotes(alice, blockNumber - 1), 0); + blockNumber += 1; + vm.roll(blockNumber); + assertEq(staking.getCurrentVotes(alice), stakeAmount); + assertEq(staking.getPriorVotes(alice, blockNumber - 1), stakeAmount); + blockNumber += 1; + vm.roll(blockNumber); + assertEq(staking.getCurrentVotes(alice), stakeAmount); + assertEq(staking.getPriorVotes(alice, blockNumber - 1), stakeAmount); + + staking.stake(stakeAmount); + staking.delegate(mike); + assertEq(staking.getCurrentVotes(alice), 0); + assertEq(staking.getPriorVotes(alice, blockNumber - 1), stakeAmount); + assertEq(staking.getCurrentVotes(mike), 2 * stakeAmount); + assertEq(staking.getPriorVotes(mike, blockNumber - 1), 0); + blockNumber += 1; + vm.roll(blockNumber); + assertEq(staking.getCurrentVotes(mike), 2 * stakeAmount); + assertEq(staking.getPriorVotes(mike, blockNumber - 1), 2 * stakeAmount); + + staking.delegate(address(0)); + assertEq(staking.getCurrentVotes(alice), 0); + assertEq(staking.getPriorVotes(alice, blockNumber - 1), 0); + assertEq(staking.getCurrentVotes(mike), 0); + assertEq(staking.getPriorVotes(mike, blockNumber - 1), 2 * stakeAmount); + blockNumber += 1; + vm.roll(blockNumber); + assertEq(staking.getPriorVotes(mike, blockNumber - 1), 0); + } + + function test_delegate_tgld_staking() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(alice); + assertEq(staking.delegates(alice), address(0)); + vm.expectEmit(address(staking)); + emit DelegateChanged(alice, address(0), mike); + staking.delegate(mike); + assertEq(staking.delegates(alice), mike); + // amount is 0 + assertEq(staking.numCheckpoints(mike), 0); + ITempleGoldStaking.Checkpoint memory _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, 0); + assertEq(_checkpoint.votes, 0); + assertEq(staking.numCheckpoints(mike), 0); + + // stake + uint256 stakeAmount = 1 ether; + deal(address(templeToken), alice, 100 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + uint256 blockNumber = block.number; + vm.expectEmit(address(staking)); + emit DelegateChanged(alice, mike, bob); + vm.expectEmit(address(staking)); + emit DelegateVotesChanged(bob, 0, stakeAmount); + staking.delegate(bob); + assertEq(staking.delegates(alice), bob); + assertEq(staking.numCheckpoints(bob), 1); + // checkpoints start from 0 + _checkpoint = staking.getCheckpoint(bob, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + assertEq(staking.numCheckpoints(bob), 1); + // move delegates again + skip(1 days); + blockNumber = block.number; + staking.delegate(mike); + assertEq(staking.delegates(alice), mike); + assertEq(staking.numCheckpoints(mike), 1); + _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + } + + function test_stake_tgldStaking_stake_withdraw_checkpoints() public { + vm.startPrank(executor); + staking.setUnstakeCooldown(1 hours); + vm.startPrank(alice); + staking.delegate(mike); + uint256 stakeAmount = 1 ether; + deal(address(templeToken), alice, 100 ether, true); + deal(address(templeToken), bob, 100 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + staking.stake(0); + uint256 blockNumber = block.number; + vm.expectEmit(address(staking)); + emit Staked(alice, stakeAmount); + staking.stake(stakeAmount); + + assertEq(staking.balanceOf(alice), stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + ITempleGoldStaking.Checkpoint memory _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + + skip(1 days); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + blockNumber = block.number; + staking.stake(stakeAmount); + staking.delegate(mike); + assertEq(staking.balanceOf(bob), stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + // same block number as previous checkpoint + _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 2 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + + // different block number + blockNumber += 1; + vm.roll(blockNumber); + staking.stake(stakeAmount); + assertEq(staking.balanceOf(bob), 2 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 2); + _checkpoint = staking.getCheckpoint(mike, 1); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 3 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 2); + + // unstake + vm.startPrank(alice); + staking.withdraw(stakeAmount, false); + _checkpoint = staking.getCheckpoint(mike, 1); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 2 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 2); + blockNumber += 1; + vm.roll(blockNumber); + vm.startPrank(bob); + skip(1 hours); + staking.withdraw(stakeAmount, false); + assertEq(staking.numCheckpoints(mike), 3); + _checkpoint = staking.getCheckpoint(mike, 2); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + } + + function test_stake_tgldStaking_earned_single_stake_single_account() public { + _setRewardDuration(1 weeks); + _setVestingFactor(); + _setUnstakeCooldown(); + + uint256 unstakeCooldown = staking.unstakeCooldown(); + vm.startPrank(alice); + deal(address(templeToken), alice, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + uint256 stakeAmount = 100 ether; + staking.stake(stakeAmount); + assertEq(staking.stakeTimes(alice), block.timestamp); + uint256 unstakeTime = staking.stakeTimes(alice) + unstakeCooldown; + assertEq(staking.getAccountUnstakeTime(alice), unstakeTime); + skip(1 days); + _distributeRewards(alice); + uint256 tgldRewardAmount = templeGold.balanceOf(address(staking)); + uint256 tgldRewardsDistributed = tgldRewardAmount - staking.nextRewardAmount(); + assertEq(staking.earned(alice), 0); + + skip(1 days); + uint256 aliceEarned = _getEarned(alice); + assertEq(staking.earned(alice), aliceEarned); + assertEq(aliceEarned, tgldRewardsDistributed/7); + + skip(5 days); + aliceEarned = _getEarned(alice); + assertEq(staking.earned(alice), aliceEarned); + assertEq(aliceEarned, tgldRewardsDistributed*6/7); + + skip(1 days); + aliceEarned = _getEarned(alice); + assertEq(staking.earned(alice), aliceEarned); + assertEq(aliceEarned, tgldRewardsDistributed); + staking.getReward(alice); + assertEq(templeGold.balanceOf(address(staking)), staking.nextRewardAmount()); + } + + function test_getReward_tgldStaking_multiple_stakes_multiple_rewards_distribution() public { + { + _setVestingFactor(); + _setUnstakeCooldown(); + _setRewardDuration(16 weeks); + } + uint256 stakeAmount = 100 ether; + uint256 goldRewardsAmount; + uint256 nextRewardAmount; + ITempleGoldStaking.Reward memory rewardDataOne; + { + vm.startPrank(alice); + deal(address(templeToken), alice, 1000 ether, true); + deal(address(templeToken), bob, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + staking.stake(stakeAmount); + skip(1 days); + _distributeRewards(alice); + nextRewardAmount = staking.nextRewardAmount(); + goldRewardsAmount = templeGold.balanceOf(address(staking)) - nextRewardAmount; + assertEq(staking.earned(alice), 0); + rewardDataOne = staking.getRewardData(); + } + uint256 rewardPerToken; + uint256 earned; + uint256 aliceBalanceBefore; + uint256 aliceBalanceAfter; + { + skip(6 days); + earned = _getEarned(alice); + aliceBalanceBefore = templeGold.balanceOf(alice); + emit log_string("alice before get reward"); + emit log_uint(aliceBalanceBefore); + vm.expectEmit(address(staking)); + emit RewardPaid(alice, alice, earned); + staking.getReward(alice); + aliceBalanceAfter = templeGold.balanceOf(alice); + emit log_string("alice after get reward"); + emit log_uint(aliceBalanceAfter); + assertEq(aliceBalanceAfter - aliceBalanceBefore, earned); + assertEq(staking.claimableRewards(alice), 0); + assertEq(templeGold.balanceOf(address(staking)), goldRewardsAmount + staking.nextRewardAmount() - earned); + } + + uint256 goldRewardsAmountTwo; + ITempleGoldStaking.Reward memory rewardDataTwo; + { + skip(7 weeks); + uint256 goldBalanceBefore = templeGold.balanceOf(address(staking)); + _distributeRewards(alice); + goldRewardsAmountTwo = templeGold.balanceOf(address(staking)) - goldBalanceBefore - staking.nextRewardAmount(); + rewardDataTwo = staking.getRewardData(); + uint256 remaining = uint256(rewardDataOne.periodFinish) - block.timestamp; + uint256 leftover = remaining * rewardDataOne.rewardRate; + uint256 rewardRate = uint216((goldRewardsAmountTwo + leftover) / 16 weeks); + assertApproxEqAbs(rewardDataTwo.rewardRate, rewardRate, 1); + } + + { + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + // bob first stake + staking.stake(stakeAmount); + rewardPerToken = staking.rewardPerToken(); + assertEq(rewardPerToken, staking.userRewardPerTokenPaid(bob)); + earned = _getEarned(bob); + uint256 bobBalanceBefore = templeGold.balanceOf(bob); + uint256 stakingGoldBalance = templeGold.balanceOf(address(staking)); + staking.getReward(bob); + assertEq(templeGold.balanceOf(bob), earned + bobBalanceBefore); + assertEq(templeGold.balanceOf(address(staking)), stakingGoldBalance - earned); + + skip(8 weeks); + emit log_string("goldbalancebefore"); + emit log_uint(templeGold.balanceOf(address(staking))); + aliceBalanceBefore = templeGold.balanceOf(alice); + bobBalanceBefore = templeGold.balanceOf(bob); + earned = staking.earned(alice); + staking.getReward(alice); + assertEq(earned, templeGold.balanceOf(alice)-aliceBalanceBefore); + assertEq(staking.earned(alice), 0); + earned = staking.earned(bob); + staking.getReward(bob); + assertEq(templeGold.balanceOf(bob)-bobBalanceBefore, earned); + + + // skip till end of reward distribution two + skip(8 weeks); + emit log_string("goldbalanceafter"); + emit log_uint(templeGold.balanceOf(address(staking))); + earned = staking.earned(alice); + aliceBalanceBefore = templeGold.balanceOf(alice); + vm.expectEmit(address(staking)); + emit RewardPaid(alice, alice, earned); + staking.getReward(alice); + aliceBalanceAfter = templeGold.balanceOf(alice); + assertEq(earned, aliceBalanceAfter - aliceBalanceBefore); + + earned = staking.earned(bob); + bobBalanceBefore = templeGold.balanceOf(bob); + vm.expectEmit(address(staking)); + emit RewardPaid(bob, bob, earned); + staking.getReward(bob); + assertEq(earned, templeGold.balanceOf(bob) - bobBalanceBefore); + emit log_string("gold in staking"); + emit log_uint(templeGold.balanceOf(address(staking))); + assertEq(staking.earned(alice), 0); + assertEq(staking.earned(bob), 0); + assertEq(templeGold.balanceOf(address(staking)), staking.nextRewardAmount()); + // still no rewards earned after reward distribution period finished + skip(3 days); + assertEq(staking.earned(alice), 0); + assertEq(staking.earned(bob), 0); + } + assertEq( + goldRewardsAmount + goldRewardsAmountTwo + nextRewardAmount, + templeGold.balanceOf(alice) + templeGold.balanceOf(bob) + ); + } + + function test_stake_checkpoints() public { + _setVestingFactor(); + _setUnstakeCooldown(); + vm.startPrank(alice); + staking.delegate(mike); + uint256 stakeAmount = 1 ether; + deal(address(templeToken), alice, 100 ether, true); + deal(address(templeToken), bob, 100 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + staking.stake(0); + + uint256 blockNumber = block.number; + vm.expectEmit(address(staking)); + emit Staked(alice, stakeAmount); + staking.stake(stakeAmount); + assertEq(staking.balanceOf(alice), stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + ITempleGoldStaking.Checkpoint memory _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + + skip(1 days); + vm.startPrank(bob); + _approve(address(templeToken), address(staking), type(uint).max); + blockNumber = block.number; + staking.stake(stakeAmount); + staking.delegate(mike); + assertEq(staking.balanceOf(bob), stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + // same block number as previous checkpoint + _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 2 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + + // different block number + blockNumber += 1; + vm.roll(blockNumber); + staking.stake(stakeAmount); + assertEq(staking.balanceOf(bob), 2 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 2); + _checkpoint = staking.getCheckpoint(mike, 1); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 3 * stakeAmount); + assertEq(staking.numCheckpoints(mike), 2); + } + + function test_withdraw_checkpoints_tgldStaking() public { + { + // for distribution + skip(3 days); + _setRewardDuration(1 weeks); + _setVestingFactor(templeGold); + vm.startPrank(executor); + staking.setUnstakeCooldown(1 hours); + } + + vm.startPrank(alice); + staking.delegate(mike); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + staking.withdraw(0, false); + + uint256 stakeAmount = 100 ether; + deal(address(templeToken), alice, 1000 ether, true); + _approve(address(templeToken), address(staking), type(uint).max); + uint256 blockNumber = block.number; + staking.stake(stakeAmount); + ITempleGoldStaking.Checkpoint memory _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, stakeAmount); + assertEq(staking.numCheckpoints(mike), 1); + skip(1 hours); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, 100 ether); + staking.withdraw(stakeAmount, false); + assertEq(templeToken.balanceOf(alice), 1000 ether); + assertEq(staking.totalSupply(), 0); + // same block number + _checkpoint = staking.getCheckpoint(mike, 0); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(staking.numCheckpoints(mike), 1); + assertEq(_checkpoint.votes, 0); + assertEq(staking.numCheckpoints(mike), 1); + + staking.stake(60 ether); + skip(1 hours); + // new block number + blockNumber += 1; + vm.roll(blockNumber); + vm.expectEmit(address(staking)); + emit Withdrawn(alice, alice, 60 ether); + staking.withdraw(60 ether, false); + assertEq(templeToken.balanceOf(alice), 1000 ether); + assertEq(staking.totalSupply(), 0); + assertEq(staking.numCheckpoints(mike), 2); + _checkpoint = staking.getCheckpoint(mike, 1); + assertEq(_checkpoint.fromBlock, blockNumber); + assertEq(_checkpoint.votes, 0); + assertEq(staking.numCheckpoints(mike), 2); + } + +} \ No newline at end of file diff --git a/protocol/test/forge/unit/templegold/TempleTeleporter.t.sol b/protocol/test/forge/unit/templegold/TempleTeleporter.t.sol new file mode 100644 index 000000000..fed5c1b1c --- /dev/null +++ b/protocol/test/forge/unit/templegold/TempleTeleporter.t.sol @@ -0,0 +1,95 @@ +pragma solidity ^0.8.20; +// SPDX-License-Identifier: AGPL-3.0-or-later +// (tests/forge/templegold/TempleTeleporter.t.sol) + +// OFT imports +import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; + +// OApp imports +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; + +// Temple Gold imports +import { TempleTeleporter } from "contracts/templegold/TempleTeleporter.sol"; +import { TempleERC20Token } from "contracts/core/TempleERC20Token.sol"; +import { CommonEventsAndErrors } from "contracts/common/CommonEventsAndErrors.sol"; + +// DevTools imports -- needs to use the local version to avoid stack too deep +import { TestHelperOz5 } from "test/forge/lz-devtools/TestHelperOz5.sol"; + +contract TempleTeleporterTest is TestHelperOz5 { + using OptionsBuilder for bytes; + + uint32 aEid = 1; + uint32 bEid = 2; + + TempleTeleporter public aTT; + TempleTeleporter public bTT; + TempleERC20Token public aTemple; + TempleERC20Token public bTemple; + + + address public userA = address(0x1); + address public userB = address(0x2); + uint256 public initialBalance = 100 ether; + + function setUp() public virtual override { + aTemple = new TempleERC20Token(); + bTemple = new TempleERC20Token(); + + vm.deal(userA, 1000 ether); + vm.deal(userB, 1000 ether); + + super.setUp(); + setUpEndpoints(2, LibraryType.UltraLightNode); + aTT = TempleTeleporter( + payable(_deployOApp(type(TempleTeleporter).creationCode, abi.encode(address(this), address(aTemple), address(endpoints[aEid])))) + ); + bTT = TempleTeleporter( + payable(_deployOApp(type(TempleTeleporter).creationCode, abi.encode(address(this), address(bTemple), address(endpoints[bEid])))) + ); + + // config and wire the ofts + address[] memory ofts = new address[](2); + ofts[0] = address(aTT); + ofts[1] = address(bTT); + this.wireOApps(ofts); + + // mint tokens + aTemple.addMinter(address(this)); + bTemple.addMinter(address(this)); + aTemple.addMinter(address(aTT)); + bTemple.addMinter(address(bTT)); + aTemple.mint(userA, initialBalance); + bTemple.mint(userB, initialBalance); + } + + function test_teleport() public { + uint256 tokensToSend = 1 ether; + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + MessagingFee memory fee = aTT.quote(bEid, abi.encode(userB, tokensToSend), options); + vm.startPrank(userA); + aTemple.approve(address(aTT), type(uint).max); + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.InvalidAddress.selector)); + aTT.teleport{ value: fee.nativeFee }(bEid, address(0), tokensToSend, options); + + vm.expectRevert(abi.encodeWithSelector(CommonEventsAndErrors.ExpectedNonZero.selector)); + aTT.teleport{ value: fee.nativeFee }(bEid, userB, 0, options); + + aTT.teleport{ value: fee.nativeFee }(bEid, userB, tokensToSend, options); + verifyPackets(bEid, addressToBytes32(address(bTT))); + + assertEq(bTemple.balanceOf(userB), initialBalance + tokensToSend); + assertEq(aTemple.balanceOf(userA), initialBalance - tokensToSend); + + // using quoteRaw gives same fee + MessagingFee memory feeRaw = aTT.quote(bEid, userB, tokensToSend, options); + assertEq(feeRaw.lzTokenFee, fee.lzTokenFee); + assertApproxEqAbs(feeRaw.nativeFee, fee.nativeFee, 20); + + // user A teleports to self + aTT.teleport{ value: fee.nativeFee }(bEid, userA, tokensToSend, options); + verifyPackets(bEid, addressToBytes32(address(bTT))); + assertEq(bTemple.balanceOf(userA), tokensToSend); + assertEq(aTemple.balanceOf(userA), initialBalance - 2 * tokensToSend); + } +} \ No newline at end of file diff --git a/protocol/test/forge/v2/TreasuryPriceIndexOracle.t.sol b/protocol/test/forge/unit/v2/TreasuryPriceIndexOracle.t.sol similarity index 100% rename from protocol/test/forge/v2/TreasuryPriceIndexOracle.t.sol rename to protocol/test/forge/unit/v2/TreasuryPriceIndexOracle.t.sol diff --git a/protocol/test/forge/v2/access/TempleElevatedAccess.t.sol b/protocol/test/forge/unit/v2/access/TempleElevatedAccess.t.sol similarity index 100% rename from protocol/test/forge/v2/access/TempleElevatedAccess.t.sol rename to protocol/test/forge/unit/v2/access/TempleElevatedAccess.t.sol diff --git a/protocol/test/forge/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.t.sol b/protocol/test/forge/unit/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.t.sol similarity index 100% rename from protocol/test/forge/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.t.sol rename to protocol/test/forge/unit/v2/circuitBreaker/TempleCircuitBreakerAllUsersPerPeriod.t.sol diff --git a/protocol/test/forge/v2/circuitBreaker/TempleCircuitBreakerProxy.t.sol b/protocol/test/forge/unit/v2/circuitBreaker/TempleCircuitBreakerProxy.t.sol similarity index 100% rename from protocol/test/forge/v2/circuitBreaker/TempleCircuitBreakerProxy.t.sol rename to protocol/test/forge/unit/v2/circuitBreaker/TempleCircuitBreakerProxy.t.sol diff --git a/protocol/test/forge/v2/interestRate/CompoundedInterest.t.sol b/protocol/test/forge/unit/v2/interestRate/CompoundedInterest.t.sol similarity index 100% rename from protocol/test/forge/v2/interestRate/CompoundedInterest.t.sol rename to protocol/test/forge/unit/v2/interestRate/CompoundedInterest.t.sol diff --git a/protocol/test/forge/v2/interestRate/LinearWithKinkInterestRateModel.t.sol b/protocol/test/forge/unit/v2/interestRate/LinearWithKinkInterestRateModel.t.sol similarity index 100% rename from protocol/test/forge/v2/interestRate/LinearWithKinkInterestRateModel.t.sol rename to protocol/test/forge/unit/v2/interestRate/LinearWithKinkInterestRateModel.t.sol diff --git a/protocol/test/forge/v2/safeGuards/CompatibilityFallbackHandler.forked.sol b/protocol/test/forge/unit/v2/safeGuards/CompatibilityFallbackHandler.forked.sol similarity index 100% rename from protocol/test/forge/v2/safeGuards/CompatibilityFallbackHandler.forked.sol rename to protocol/test/forge/unit/v2/safeGuards/CompatibilityFallbackHandler.forked.sol diff --git a/protocol/test/forge/v2/safeGuards/ThresholdSafeGuard.t.sol b/protocol/test/forge/unit/v2/safeGuards/ThresholdSafeGuard.t.sol similarity index 100% rename from protocol/test/forge/v2/safeGuards/ThresholdSafeGuard.t.sol rename to protocol/test/forge/unit/v2/safeGuards/ThresholdSafeGuard.t.sol diff --git a/protocol/test/forge/v2/strategies/AbstractStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/AbstractStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/AbstractStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/AbstractStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/DsrBaseStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/DsrBaseStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/DsrBaseStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/DsrBaseStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/DsrBaseStrategyTestnet.t.sol b/protocol/test/forge/unit/v2/strategies/DsrBaseStrategyTestnet.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/DsrBaseStrategyTestnet.t.sol rename to protocol/test/forge/unit/v2/strategies/DsrBaseStrategyTestnet.t.sol diff --git a/protocol/test/forge/v2/strategies/GnosisStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/GnosisStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/GnosisStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/GnosisStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/MockBaseStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/MockBaseStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/MockBaseStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/MockBaseStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/MockStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/MockStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/MockStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/MockStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/RamosStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/RamosStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/RamosStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/RamosStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/SkyFarmBaseStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/SkyFarmBaseStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/SkyFarmBaseStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/SkyFarmBaseStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/TempleTokenBaseStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/TempleTokenBaseStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/TempleTokenBaseStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/TempleTokenBaseStrategy.t.sol diff --git a/protocol/test/forge/v2/strategies/TlcStrategy.t.sol b/protocol/test/forge/unit/v2/strategies/TlcStrategy.t.sol similarity index 100% rename from protocol/test/forge/v2/strategies/TlcStrategy.t.sol rename to protocol/test/forge/unit/v2/strategies/TlcStrategy.t.sol diff --git a/protocol/test/forge/v2/templeDebtToken/TempleDebtToken.Base.t.sol b/protocol/test/forge/unit/v2/templeDebtToken/TempleDebtToken.Base.t.sol similarity index 100% rename from protocol/test/forge/v2/templeDebtToken/TempleDebtToken.Base.t.sol rename to protocol/test/forge/unit/v2/templeDebtToken/TempleDebtToken.Base.t.sol diff --git a/protocol/test/forge/v2/templeDebtToken/TempleDebtToken.BaseAndDebtorInterest.t.sol b/protocol/test/forge/unit/v2/templeDebtToken/TempleDebtToken.BaseAndDebtorInterest.t.sol similarity index 100% rename from protocol/test/forge/v2/templeDebtToken/TempleDebtToken.BaseAndDebtorInterest.t.sol rename to protocol/test/forge/unit/v2/templeDebtToken/TempleDebtToken.BaseAndDebtorInterest.t.sol diff --git a/protocol/test/forge/v2/templeDebtToken/TempleDebtTokenTest.BaseInterestOnly.t.sol b/protocol/test/forge/unit/v2/templeDebtToken/TempleDebtTokenTest.BaseInterestOnly.t.sol similarity index 100% rename from protocol/test/forge/v2/templeDebtToken/TempleDebtTokenTest.BaseInterestOnly.t.sol rename to protocol/test/forge/unit/v2/templeDebtToken/TempleDebtTokenTest.BaseInterestOnly.t.sol diff --git a/protocol/test/forge/v2/templeDebtToken/TempleDebtTokenTest.DebtorInterestOnly.t.sol b/protocol/test/forge/unit/v2/templeDebtToken/TempleDebtTokenTest.DebtorInterestOnly.t.sol similarity index 100% rename from protocol/test/forge/v2/templeDebtToken/TempleDebtTokenTest.DebtorInterestOnly.t.sol rename to protocol/test/forge/unit/v2/templeDebtToken/TempleDebtTokenTest.DebtorInterestOnly.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TempleLineOfCreditV2.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TempleLineOfCreditV2.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TempleLineOfCreditV2.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TempleLineOfCreditV2.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TlcBaseTest.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TlcBaseTest.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TlcBaseTest.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TlcBaseTest.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TlcBorrow.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TlcBorrow.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TlcBorrow.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TlcBorrow.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TlcCollateral.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TlcCollateral.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TlcCollateral.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TlcCollateral.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TlcLiquidations.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TlcLiquidations.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TlcLiquidations.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TlcLiquidations.t.sol diff --git a/protocol/test/forge/v2/templeLineOfCredit/TlcRepay.t.sol b/protocol/test/forge/unit/v2/templeLineOfCredit/TlcRepay.t.sol similarity index 100% rename from protocol/test/forge/v2/templeLineOfCredit/TlcRepay.t.sol rename to protocol/test/forge/unit/v2/templeLineOfCredit/TlcRepay.t.sol diff --git a/protocol/test/forge/v2/treasuryReservesVault/TrvBase.t.sol b/protocol/test/forge/unit/v2/treasuryReservesVault/TrvBase.t.sol similarity index 100% rename from protocol/test/forge/v2/treasuryReservesVault/TrvBase.t.sol rename to protocol/test/forge/unit/v2/treasuryReservesVault/TrvBase.t.sol diff --git a/protocol/test/forge/v2/treasuryReservesVault/TrvBorrow.t.sol b/protocol/test/forge/unit/v2/treasuryReservesVault/TrvBorrow.t.sol similarity index 100% rename from protocol/test/forge/v2/treasuryReservesVault/TrvBorrow.t.sol rename to protocol/test/forge/unit/v2/treasuryReservesVault/TrvBorrow.t.sol diff --git a/protocol/test/forge/v2/treasuryReservesVault/TrvRepay.t.sol b/protocol/test/forge/unit/v2/treasuryReservesVault/TrvRepay.t.sol similarity index 100% rename from protocol/test/forge/v2/treasuryReservesVault/TrvRepay.t.sol rename to protocol/test/forge/unit/v2/treasuryReservesVault/TrvRepay.t.sol diff --git a/protocol/test/forge/v2/treasuryReservesVault/TrvShutdown.t.sol b/protocol/test/forge/unit/v2/treasuryReservesVault/TrvShutdown.t.sol similarity index 100% rename from protocol/test/forge/v2/treasuryReservesVault/TrvShutdown.t.sol rename to protocol/test/forge/unit/v2/treasuryReservesVault/TrvShutdown.t.sol diff --git a/protocol/test/forge/v2/treasuryReservesVault/TrvViews.t.sol b/protocol/test/forge/unit/v2/treasuryReservesVault/TrvViews.t.sol similarity index 100% rename from protocol/test/forge/v2/treasuryReservesVault/TrvViews.t.sol rename to protocol/test/forge/unit/v2/treasuryReservesVault/TrvViews.t.sol

    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�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%0A*PyZ1g(Cw{78iVm3|74T4rmvf5^j)$LuLs51C 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