{"id":20640521,"url":"https://github.com/kovart/forta-attack-simulation","last_synced_at":"2025-10-06T17:55:30.597Z","repository":{"id":44327278,"uuid":"509510969","full_name":"kovart/forta-attack-simulation","owner":"kovart","description":"🦠🔬 Forta bot that detects deployment of smart contracts containing exploits","archived":false,"fork":false,"pushed_at":"2023-06-05T17:49:55.000Z","size":403,"stargazers_count":50,"open_issues_count":3,"forks_count":8,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-15T23:02:11.646Z","etag":null,"topics":["agent","attack","blockchain","bot","ethereum","exploit","forta","prevention","simulation"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kovart.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-07-01T15:50:59.000Z","updated_at":"2025-03-11T12:49:29.000Z","dependencies_parsed_at":"2024-11-16T15:31:15.178Z","dependency_job_id":"ffbb96ed-376c-4929-babe-0560970099ea","html_url":"https://github.com/kovart/forta-attack-simulation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kovart/forta-attack-simulation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kovart%2Fforta-attack-simulation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kovart%2Fforta-attack-simulation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kovart%2Fforta-attack-simulation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kovart%2Fforta-attack-simulation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kovart","download_url":"https://codeload.github.com/kovart/forta-attack-simulation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kovart%2Fforta-attack-simulation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278655139,"owners_count":26022967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","attack","blockchain","bot","ethereum","exploit","forta","prevention","simulation"],"created_at":"2024-11-16T15:29:46.602Z","updated_at":"2025-10-06T17:55:30.565Z","avatar_url":"https://github.com/kovart.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Attack Simulation Bot\n\n## Description\n\nThe agent detects deployment of smart contracts containing an exploit function.\n\nUsing a [simulation-based approach](https://forta.org/blog/attack-simulation/),\nthe bot predicts the result of function execution within a local blockchain fork\nand tracks any changes in balances of EOAs and the attacker's contract, allowing it to detect a potential attack before it occurs.\n\n---\n\nThis bot keeps track of all the changes in the balances of the native, ERC20, ERC721 and ERC1155 tokens that have left their traces in the transaction logs.\nIt also takes into account negative changes in balances, as they help detect attacked projects,\nas well as include these addresses in the alert, which can notify projects before the exploit is used, keeping the assets intact.\n\n\u003e At the moment, due to Ganache limitations, the bot cannot track changes in the native balance of EOAs (e.g. ETH, MATIC),\n\u003e unless the EOAs were seen in ERC20, ERC721, ERC1155 token events.\n\n---\n\nThe bot scans each transaction for contract creation (including contracts created by contracts).\nAs soon as new contracts are detected, their code is fetched and translated into OPCODE.\nThis instruction machine code allows to find possible function selectors (4bytes) without having the [contract ABI](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html).\n\nThe bot then launches a local fork of the blockchain, within which it tries to mimic the execution of the functions observing changes in the token balances.\nTo bring the simulation closer to real life, the bot performs transactions on behalf of the account that deployed the contract.\n\nWhile most exploit functions do not take any parameters, the bot tries to cover cases where the function can take up to 5 different parameters.\nIt uses a clever way of determining the number of parameters, after which it is fuzzing them, shuffling potential values in various quantities.\n\nThe bot also supports calling of `payable` functions, to which it sends the amount of ether specified in the [configuration file](./bot-config.json).\n\n## Configuration\n\nYou can configure the agent in the [bot-config.json](./bot-config.json) file.\nSupported token standards: native (e.g. ETH, MATIC), ERC20, ERC721, ERC1155.\n\nFor native and ERC20 tokens, the threshold value is specified in dollars. \nAs soon as the total amount of dollars exceeds the threshold, the bot fires an alert.\nYou can specify this threshold value in `totalUsdTransferThreshold` field.\n\nTo determine the USD value of tokens, the [DefiLlama Api](https://defillama.com/docs/api) is used.\n\nFor tokens ERC721, ERC1155, the bot uses a threshold based on the total number of transferred tokens.\nFor example, by setting `threshold` to `10` for an ERC721 token, the bot will fire an alert if it detects that an account has taken ownership of 11 different tokens (token IDs). \nFor ERC1155 tokens, the bot also takes into account the value of each of the internal tokens, and sums them into one number.\n\n\n#### Example\n\n```json\n{\n  \"developerAbbreviation\": \"AK\",\n  \"payableFunctionEtherValue\": \"10\",\n  \"totalUsdTransferThreshold\": \"30000\",\n  \"totalTokensThresholdsByChain\": {\n    \"1\": {\n      \"0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85\": {\n        \"name\": \"ENS\",\n        \"threshold\": 10\n      },\n      \"0x495f947276749Ce646f68AC8c248420045cb7b5e\": {\n        \"name\": \"OpenSea Shared Storefront\",\n        \"threshold\": 10\n      }\n    }\n  }\n}\n```\n\n## Supported Chains\n\nChains with support for [Trace API](https://openethereum.github.io/JSONRPC-trace-module).\n\n- Ethereum (1)\n- BSC (56)\n- Polygon (137)\n- Arbitrum (42161)\n- Optimism (10)\n- Fantom (250)\n- Avalanche (43114)\n\n## Alerts\n\n- AK-ATTACK-SIMULATION-0\n  - Fired when an invoking function causes a large balance increase in an EOA or the contract containing the invoked function\n  - Severity is always set to `critical`\n  - Type is always set to `exploit`\n  - Metadata:\n    - `sighash` - function selector\n    - `calldata` - function calldata\n    - `contractAddress` - address of the deployed contract\n    - `deployerAddress` - address of the contract deployer\n    - `fundedAddress` - address where the significant increase in the balance has been found\n    - `balanceChanges` - map object with arrays of balance changes for each account\n\n## Test Data\n\nYou can verify the work of the agent by running it with the following transactions:\n\n```bash\n$ npm run tx 0x494b578bce7572e4fb8b1357ddf12754a28eec3439a62f6b14432dacda9cbb76\n```\n\nThe result should be a finding of the Saddle Finance attack.\n\n```js\nFinding {\n  \"name\": \"Potential Exploit Function\",\n  \"description\": \"Invocation of the function 0xaf8271f7 of the created contract 0x7336f819775b1d31ea472681d70ce7a903482191 leads to large balance increase in the contract deployer or function invoker account. Tokens transferred: 3,375.538166306826437272 WETH\",\n  \"alertId\": \"AK-ATTACK-SIMULATION-0\",\n  \"protocol\": \"ethereum\",\n  \"severity\": \"Critical\",\n  \"type\": \"Exploit\",\n  \"metadata\": {\n    \"sighash\": \"0xaf8271f7\",\n    \"calldata\": \"\",\n    \"contractAddress\": \"0x7336f819775b1d31ea472681d70ce7a903482191\",\n    \"deployerAddress\": \"0x63341ba917de90498f3903b199df5699b4a55ac0\",\n    \"balanceChanges\": \"{\\\"0x27182842e098f60e3d576794a5bffb0777e025d3\\\":[{\\\"name\\\":\\\"USDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\",\\\"value\\\":\\\"0\\\"}],\\\"0x7336f819775b1d31ea472681d70ce7a903482191\\\":[{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"USDT\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xdac17f958d2ee523a2206206994597c13d831ec7\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"DAI\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x6b175474e89094c44da98b954eedeac495271d0f\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"saddleUSD-V2\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x5f86558387293b6009d7896a61fcc86c17808d62\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"sUSD\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x57ab1ec28d129707052df4df418d58a2d46d5f51\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"dUSDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0x84721a3db22eb852233aeae74f9bc8477f8bcc42\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"USDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\",\\\"value\\\":\\\"0\\\"}],\\\"0x0000000000000000000000000000000000000000\\\":[{\\\"name\\\":\\\"saddleUSD-V2\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x5f86558387293b6009d7896a61fcc86c17808d62\\\",\\\"value\\\":\\\"5.016537096730963109713838e+24\\\"},{\\\"name\\\":\\\"ETH\\\",\\\"type\\\":\\\"native\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"native\\\",\\\"value\\\":\\\"1817975000000000\\\"},{\\\"name\\\":\\\"dUSDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0x84721a3db22eb852233aeae74f9bc8477f8bcc42\\\",\\\"value\\\":\\\"0\\\"}],\\\"0xa5407eae9ba41422680e2e00537571bcc53efbfd\\\":[{\\\"name\\\":\\\"sUSD\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x57ab1ec28d129707052df4df418d58a2d46d5f51\\\",\\\"value\\\":\\\"5.288082139740971886935251e+24\\\"},{\\\"name\\\":\\\"DAI\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x6b175474e89094c44da98b954eedeac495271d0f\\\",\\\"value\\\":\\\"1.810723455638732389504479e+24\\\"},{\\\"name\\\":\\\"USDT\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xdac17f958d2ee523a2206206994597c13d831ec7\\\",\\\"value\\\":\\\"1530488975938\\\"},{\\\"name\\\":\\\"USDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\",\\\"value\\\":\\\"-8600828847387\\\"}],\\\"0x824dcd7b044d60df2e89b1bb888e66d8bcf41491\\\":[{\\\"name\\\":\\\"saddleUSD-V2\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x5f86558387293b6009d7896a61fcc86c17808d62\\\",\\\"value\\\":\\\"-5.016537096730963109713838e+24\\\"},{\\\"name\\\":\\\"sUSD\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x57ab1ec28d129707052df4df418d58a2d46d5f51\\\",\\\"value\\\":\\\"-5.288082139740971886935251e+24\\\"}],\\\"0xacb83e0633d6605c5001e2ab59ef3c745547c8c7\\\":[{\\\"name\\\":\\\"USDT\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xdac17f958d2ee523a2206206994597c13d831ec7\\\",\\\"value\\\":\\\"-1530488975938\\\"},{\\\"name\\\":\\\"USDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\",\\\"value\\\":\\\"-1691981791323\\\"},{\\\"name\\\":\\\"DAI\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0x6b175474e89094c44da98b954eedeac495271d0f\\\",\\\"value\\\":\\\"-1.810723455638732389504479e+24\\\"}],\\\"0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc\\\":[{\\\"name\\\":\\\"USDC\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":6,\\\"address\\\":\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\",\\\"value\\\":\\\"10292810638710\\\"},{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"-3.375538166306826437272e+21\\\"}],\\\"0x63341ba917de90498f3903b199df5699b4a55ac0\\\":[{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"3.375538166306826437272e+21\\\"}]}\"\n  },\n  \"addresses\": [\n    \"0x63341ba917de90498f3903b199df5699b4a55ac0\",\n    \"0x7336f819775b1d31ea472681d70ce7a903482191\",\n    \"0x27182842e098f60e3d576794a5bffb0777e025d3\",\n    \"0x0000000000000000000000000000000000000000\",\n    \"0xa5407eae9ba41422680e2e00537571bcc53efbfd\",\n    \"0x824dcd7b044d60df2e89b1bb888e66d8bcf41491\",\n    \"0xacb83e0633d6605c5001e2ab59ef3c745547c8c7\",\n    \"0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc\",\n    \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n    \"0x84721a3db22eb852233aeae74f9bc8477f8bcc42\",\n    \"0x57ab1ec28d129707052df4df418d58a2d46d5f51\",\n    \"0xdac17f958d2ee523a2206206994597c13d831ec7\",\n    \"0x6b175474e89094c44da98b954eedeac495271d0f\",\n    \"0x5f86558387293b6009d7896a61fcc86c17808d62\",\n    \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\"\n  ]\n}\n\n```\n\n---\n\n```bash\n$ npm run tx 0xb00e71f0e812d383b618cf316a9ccf30a0c9c7f0036a469a32e651aba591bd7d\n```\n\nThe result should be a finding of the Devour attack.\n\n```js\nFinding {\n  \"name\": \"Potential Exploit Function\",\n  \"description\": \"Invocation of the function 0x58581246 of the created contract 0x9e7f9123ce12060ec844ac56de047cc50a827201 leads to large balance increase in the contract deployer or function invoker account. Tokens transferred: 12.597815986560374826 ETH\",\n  \"alertId\": \"AK-ATTACK-SIMULATION-0\",\n  \"protocol\": \"ethereum\",\n  \"severity\": \"Critical\",\n  \"type\": \"Exploit\",\n  \"metadata\": {\n    \"sighash\": \"0x58581246\",\n    \"calldata\": \"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\",\n    \"contractAddress\": \"0x9e7f9123ce12060ec844ac56de047cc50a827201\",\n    \"deployerAddress\": \"0x9448368ff76b6698c59ca940b1ee2bf7fba0bc21\",\n    \"balanceChanges\": \"{\\\"0x7a250d5630b4cf539739df2c5dacb4c659f2488d\\\":[{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"12597815986560374826\\\"}],\\\"0xf0fce5d65a42470a314fb440327cf564cca7c9d9\\\":[{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"133700055419679093\\\"},{\\\"name\\\":\\\"RESTAURANTS\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\",\\\"value\\\":\\\"-9.7e+30\\\"}],\\\"0x9e7f9123ce12060ec844ac56de047cc50a827201\\\":[{\\\"name\\\":\\\"DPAY\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78\\\",\\\"value\\\":\\\"0\\\"},{\\\"name\\\":\\\"RESTAURANTS\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\",\\\"value\\\":\\\"-2.70081024307292187656296889e+27\\\"}],\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\":[{\\\"name\\\":\\\"RESTAURANTS\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\",\\\"value\\\":\\\"5e+29\\\"}],\\\"0x000000000000000000000000000000000000dead\\\":[{\\\"name\\\":\\\"RESTAURANTS\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\",\\\"value\\\":\\\"2e+29\\\"}],\\\"0x308ad7d6e99a36a516ca311510f62052c336084d\\\":[{\\\"name\\\":\\\"RESTAURANTS\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xdffc63f92c939deb112d88735ade3b4d21b6d491\\\",\\\"value\\\":\\\"9.00270081024307292187656296889e+30\\\"},{\\\"name\\\":\\\"DPAY\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78\\\",\\\"value\\\":\\\"-9.002700810243072921876562e+24\\\"}],\\\"0x4cbcff3e46a106793a972ea7051dfd028f34517a\\\":[{\\\"name\\\":\\\"DPAY\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78\\\",\\\"value\\\":\\\"9.002700810243072921876562e+24\\\"},{\\\"name\\\":\\\"WETH\\\",\\\"type\\\":\\\"ERC20\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\\\",\\\"value\\\":\\\"-12731516041980053919\\\"}],\\\"0x9448368ff76b6698c59ca940b1ee2bf7fba0bc21\\\":[{\\\"name\\\":\\\"ETH\\\",\\\"type\\\":\\\"native\\\",\\\"decimals\\\":18,\\\"address\\\":\\\"native\\\",\\\"value\\\":\\\"12597815986560374826\\\"}]}\"\n  },\n  \"addresses\": [\n    \"0x9448368ff76b6698c59ca940b1ee2bf7fba0bc21\",\n    \"0x9e7f9123ce12060ec844ac56de047cc50a827201\",\n    \"0x7a250d5630b4cf539739df2c5dacb4c659f2488d\",\n    \"0xf0fce5d65a42470a314fb440327cf564cca7c9d9\",\n    \"0xdffc63f92c939deb112d88735ade3b4d21b6d491\",\n    \"0x000000000000000000000000000000000000dead\",\n    \"0x308ad7d6e99a36a516ca311510f62052c336084d\",\n    \"0x4cbcff3e46a106793a972ea7051dfd028f34517a\",\n    \"0xe5a733681bbe6cd8c764bb8078ef8e13a576dd78\",\n    \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\"\n  ]\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkovart%2Fforta-attack-simulation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkovart%2Fforta-attack-simulation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkovart%2Fforta-attack-simulation/lists"}