{"_id":"@alexroan/permit2-tron","_rev":"5-13e52434af99a8901360d5df2c8ef161","name":"@alexroan/permit2-tron","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"@alexroan/permit2-tron","version":"0.0.1","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"author":{"name":"alexroan"},"license":"MIT","_id":"@alexroan/permit2-tron@0.0.1","maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"homepage":"https://github.com/alexroan/permit2-tron","bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"dist":{"shasum":"9d079a398811356a4dcb2ba8fd60297af61b72fe","tarball":"https://registry.npmjs.org/@alexroan/permit2-tron/-/permit2-tron-0.0.1.tgz","fileCount":56,"integrity":"sha512-f9FCkTepMT+LoihkTZn85AntqwoJ6tDCO3iAC6FhW0fxKl+wzDgYfowOfESx6gxKcMr5ZPBH9KJE7fvENxdIzg==","signatures":[{"sig":"MEUCIQDtPysxSLhlE8oWbBcMbcF05JXmw0r9Z8qP5ugmKttR2gIgFIzRoHOQjUJxG0xSQjvqD13SCcXkUBWSUzDzSp+Qecs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4422745},"_from":"file:alexroan-permit2-tron-0.0.1.tgz","engines":{"node":">=20.0.0"},"scripts":{"test":"tronbox test","build":"tronbox compile","clean":"rm -rf build","migrate":"tronbox migrate","migrate:nile":"source .env && tronbox migrate --network nile","migrate:shasta":"source .env && tronbox migrate --network shasta","migrate:mainnet":"source .env && tronbox migrate --network mainnet"},"_npmUser":{"name":"alexroan","email":"alex.roan@hotmail.com"},"_resolved":"/private/var/folders/rv/qjlvywhn06j36crcb2r_l02c0000gn/T/0965a5e180b6eaa59da4bde650be3a95/alexroan-permit2-tron-0.0.1.tgz","_integrity":"sha512-f9FCkTepMT+LoihkTZn85AntqwoJ6tDCO3iAC6FhW0fxKl+wzDgYfowOfESx6gxKcMr5ZPBH9KJE7fvENxdIzg==","repository":{"url":"git+https://github.com/alexroan/permit2-tron.git","type":"git"},"_npmVersion":"10.8.2","description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","directories":{},"_nodeVersion":"20.19.2","dependencies":{"solmate":"^6.8.0"},"_hasShrinkwrap":false,"devDependencies":{"tronbox":"^4.2.2","tronweb":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/permit2-tron_0.0.1_1754323385335_0.7853906623645601","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@alexroan/permit2-tron","version":"0.0.2","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"author":{"name":"alexroan"},"license":"MIT","_id":"@alexroan/permit2-tron@0.0.2","maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"homepage":"https://github.com/alexroan/permit2-tron","bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"dist":{"shasum":"ccd76d18f50835d50e398881e044905196ea2789","tarball":"https://registry.npmjs.org/@alexroan/permit2-tron/-/permit2-tron-0.0.2.tgz","fileCount":60,"integrity":"sha512-mBFjAlSebWQ1NDk7DLuOVzXVaUtftX/GJEC01y8phhHE8P5f8vtfZc4EcPTNvxEc7wBjQIjXfabjpdVZYk6MTA==","signatures":[{"sig":"MEUCIQCgVLfvJ5/VrKLqqUCqdqCsXv1XoWUC4cMctjhx4kycgAIgJrI4BwOqxljjvLp3fR/7iKpo0BfBR68ykzaKTvH81sY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4685350},"_from":"file:alexroan-permit2-tron-0.0.2.tgz","engines":{"node":">=20.0.0"},"scripts":{"test":"tronbox test","build":"tronbox compile","clean":"rm -rf build","migrate":"tronbox migrate","migrate:nile":"source .env && tronbox migrate --network nile","migrate:shasta":"source .env && tronbox migrate --network shasta","migrate:mainnet":"source .env && tronbox migrate --network mainnet"},"_npmUser":{"name":"alexroan","email":"alex.roan@hotmail.com"},"_resolved":"/private/var/folders/rv/qjlvywhn06j36crcb2r_l02c0000gn/T/cf19878670ea4857e18ecfef55c94ebf/alexroan-permit2-tron-0.0.2.tgz","_integrity":"sha512-mBFjAlSebWQ1NDk7DLuOVzXVaUtftX/GJEC01y8phhHE8P5f8vtfZc4EcPTNvxEc7wBjQIjXfabjpdVZYk6MTA==","repository":{"url":"git+https://github.com/alexroan/permit2-tron.git","type":"git"},"_npmVersion":"10.8.2","description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","directories":{},"_nodeVersion":"20.19.2","dependencies":{"solmate":"^6.8.0"},"_hasShrinkwrap":false,"devDependencies":{"tronbox":"^4.2.2","tronweb":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/permit2-tron_0.0.2_1754659194955_0.5116020990213985","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@alexroan/permit2-tron","version":"0.0.3","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"author":{"name":"alexroan"},"license":"MIT","_id":"@alexroan/permit2-tron@0.0.3","maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"homepage":"https://github.com/alexroan/permit2-tron","bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"dist":{"shasum":"56f3e4495e0f66af5028ca24887dd831a56131ad","tarball":"https://registry.npmjs.org/@alexroan/permit2-tron/-/permit2-tron-0.0.3.tgz","fileCount":60,"integrity":"sha512-2EhpYcQFZQsyl34DrJt8jQ7uBSwJrngtzcO0J+h2khX+ptgfGeVtjOMxlb/Ztbsm790MiIOFBhL2LH3N2AsDCA==","signatures":[{"sig":"MEQCH3UtE3xGNAARAmWH8cjcUX1OJVxESyGXGL3LNMJV8tYCIQDWXNLlJfgS4FiBLPPGzNzgLe2YWZ5XXeR1dsvUYqj6BQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4733142},"_from":"file:alexroan-permit2-tron-0.0.3.tgz","engines":{"node":">=20.0.0"},"scripts":{"test":"tronbox test","build":"tronbox compile","clean":"rm -rf build","migrate":"tronbox migrate","migrate:nile":"source .env && tronbox migrate --network nile","migrate:shasta":"source .env && tronbox migrate --network shasta","migrate:mainnet":"source .env && tronbox migrate --network mainnet"},"_npmUser":{"name":"alexroan","email":"alex.roan@hotmail.com"},"_resolved":"/private/var/folders/rv/qjlvywhn06j36crcb2r_l02c0000gn/T/cd2db694b480cb6c1bdd259ceb0b7f0d/alexroan-permit2-tron-0.0.3.tgz","_integrity":"sha512-2EhpYcQFZQsyl34DrJt8jQ7uBSwJrngtzcO0J+h2khX+ptgfGeVtjOMxlb/Ztbsm790MiIOFBhL2LH3N2AsDCA==","repository":{"url":"git+https://github.com/alexroan/permit2-tron.git","type":"git"},"_npmVersion":"10.8.2","description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","directories":{},"_nodeVersion":"20.19.2","dependencies":{"solmate":"^6.8.0"},"_hasShrinkwrap":false,"devDependencies":{"tronbox":"^4.2.2","tronweb":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/permit2-tron_0.0.3_1754663927598_0.4734098823091857","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@alexroan/permit2-tron","version":"0.0.4","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"author":{"name":"alexroan"},"license":"MIT","_id":"@alexroan/permit2-tron@0.0.4","maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"homepage":"https://github.com/alexroan/permit2-tron","bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"dist":{"shasum":"e66ea56b81b423226741b9337fdf761139a5455b","tarball":"https://registry.npmjs.org/@alexroan/permit2-tron/-/permit2-tron-0.0.4.tgz","fileCount":418,"integrity":"sha512-c5qGnUeUci4n0bYy6LqFJO6VWQ47axKhq/azT9PzioJg8P3fNsfiB18G656R/7hM7UWJxJHkA/GO0NBpKhfpDg==","signatures":[{"sig":"MEUCIQD1crbyGsQ1TVm26Uh0yus7abpN7NODqmelk9MplV3a1gIgMXK3HWvkrVCx48UtkY0+4NE19I7913sjxuFZcUt4Rt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14343097},"_from":"file:alexroan-permit2-tron-0.0.4.tgz","engines":{"node":">=20.0.0"},"scripts":{"clean":"rm -rf build","compile":"tronbox compile","migrate":"tronbox migrate","migrate:nile":"source .env && tronbox migrate --network nile","test:tronbox":"tronbox test","migrate:shasta":"source .env && tronbox migrate --network shasta","migrate:mainnet":"source .env && tronbox migrate --network mainnet"},"_npmUser":{"name":"alexroan","email":"alex.roan@hotmail.com"},"_resolved":"/private/var/folders/rv/qjlvywhn06j36crcb2r_l02c0000gn/T/a0850858c2a153abd35b70ac4500bcdb/alexroan-permit2-tron-0.0.4.tgz","_integrity":"sha512-c5qGnUeUci4n0bYy6LqFJO6VWQ47axKhq/azT9PzioJg8P3fNsfiB18G656R/7hM7UWJxJHkA/GO0NBpKhfpDg==","repository":{"url":"git+https://github.com/alexroan/permit2-tron.git","type":"git"},"_npmVersion":"10.8.2","description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","directories":{},"_nodeVersion":"20.19.2","dependencies":{"solmate":"6.8.0","@openzeppelin/contracts":"4.7.0"},"_hasShrinkwrap":false,"devDependencies":{"tronbox":"^4.2.2","tronweb":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/permit2-tron_0.0.4_1755009134362_0.6464306910369071","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@alexroan/permit2-tron","version":"0.0.5","description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"author":{"name":"alexroan"},"license":"MIT","dependencies":{"@openzeppelin/contracts":"4.7.0","solmate":"6.8.0"},"devDependencies":{"tronbox":"^4.2.2","tronweb":"^6.0.4"},"engines":{"node":">=20.0.0"},"repository":{"type":"git","url":"git+https://github.com/alexroan/permit2-tron.git"},"bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"homepage":"https://github.com/alexroan/permit2-tron","scripts":{"compile":"tronbox compile","test:tronbox":"tronbox test","migrate":"tronbox migrate","migrate:shasta":"source .env && tronbox migrate --network shasta","migrate:nile":"source .env && tronbox migrate --network nile","migrate:mainnet":"source .env && tronbox migrate --network mainnet","clean":"rm -rf build"},"_id":"@alexroan/permit2-tron@0.0.5","_integrity":"sha512-KkLp2240C7KiuiFio7J08REGdmRvFD32PMODq0QKTFcxJXJ832LCIFyQns/Y4feUir/N9k5oLGsxaNJcwfFZtw==","_resolved":"/private/var/folders/rv/qjlvywhn06j36crcb2r_l02c0000gn/T/f73e24f339c091b83e269054a1c66a72/alexroan-permit2-tron-0.0.5.tgz","_from":"file:alexroan-permit2-tron-0.0.5.tgz","_nodeVersion":"20.19.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-KkLp2240C7KiuiFio7J08REGdmRvFD32PMODq0QKTFcxJXJ832LCIFyQns/Y4feUir/N9k5oLGsxaNJcwfFZtw==","shasum":"f1b472efe155d0cd517043c7f6a36df5cc2af3f2","tarball":"https://registry.npmjs.org/@alexroan/permit2-tron/-/permit2-tron-0.0.5.tgz","fileCount":419,"unpackedSize":14288516,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCpmwvEuL6NwHLnQwllJ/7ea5b39Zwtq7+LI6vjdRy8SwIgG/EAvYotvmC1JoPtt3fdIMl6J6+KKhVfYbir1iQEhYU="}]},"_npmUser":{"name":"alexroan","email":"alex.roan@hotmail.com"},"directories":{},"maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permit2-tron_0.0.5_1755700445168_0.9126183310119245"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-04T16:03:05.204Z","modified":"2025-08-20T14:34:05.632Z","0.0.1":"2025-08-04T16:03:05.639Z","0.0.2":"2025-08-08T13:19:55.204Z","0.0.3":"2025-08-08T14:38:47.998Z","0.0.4":"2025-08-12T14:32:14.674Z","0.0.5":"2025-08-20T14:34:05.462Z"},"bugs":{"url":"https://github.com/alexroan/permit2-tron/issues"},"author":{"name":"alexroan"},"license":"MIT","homepage":"https://github.com/alexroan/permit2-tron","keywords":["permit2","tron","trc20","tip-712","signatures","meta-transactions","token-approvals"],"repository":{"type":"git","url":"git+https://github.com/alexroan/permit2-tron.git"},"description":"Permit2 implementation for Tron - Next-generation token approval/meta-tx system","maintainers":[{"name":"alexroan","email":"alex.roan@hotmail.com"}],"readme":"# Permit2 for Tron\n\nPermit2 introduces a low-overhead, next-generation token approval/meta-tx system to make token approvals easier, more secure, and more consistent across applications. This is a Tron-compatible implementation that follows the TIP-712 standard for typed data signing.\n\n## Features\n\n- **Signature Based Approvals**: Any TRC20 token can use permit style approvals, enabling single transaction flows by sending a permit signature along with the transaction data\n- **Batched Token Approvals**: Set permissions on different tokens to different spenders with one signature\n- **Signature Based Token Transfers**: Transfer tokens directly via signatures, bypassing allowances and preventing hanging approvals\n- **Batched Token Transfers**: Transfer different tokens to different recipients with one signature  \n- **Safe Arbitrary Data Verification**: Verify extra data through witness hash and witness type following TIP-712 standard\n- **Signature Verification for Contracts**: All signature verification supports contract wallets\n- **Non-monotonic Replay Protection**: Unordered, non-monotonic nonces for flexible transaction ordering\n- **Expiring Approvals**: Time-bound approvals that automatically expire, removing security concerns around hanging approvals\n- **Batch Revoke Allowances**: Remove allowances on any number of tokens and spenders in one transaction\n\n## Key Differences from Ethereum Permit2\n\nThis implementation has been adapted for Tron's blockchain with the following key modifications:\n\n### TIP-712 Compliance\n- Uses masked chainId: `block.chainid & 0xffffffff` \n- Encodes all addresses as `uint160` in structured data hashing\n- Compatible with TronWeb's `_signTypedData` method\n\n### Compilation\n- Built with TronBox instead of Foundry\n- Requires Solidity 0.8.18\n- Uses viaIR optimization like the original\n\n## Architecture\n\nPermit2 combines two main contracts:\n\n### SignatureTransfer\nHandles all signature-based transfers where permissions only last for the duration of the transaction.\n\n### AllowanceTransfer  \nManages persistent allowances with amounts and expiration times.\n\n## Prerequisites\n\n- Node.js v20 (use `nvm use 20` or check `.nvmrc`)\n- pnpm v10.12.1  \n- Docker (for local TRON node)\n- Foundry (for Foundry tests)\n\n## Installation\n\n```bash\n# Install dependencies\nmake install-tronbox  # Installs npm dependencies\nmake install-foundry  # Installs Foundry dependencies\n```\n\n## Setup\n\n1. Copy the sample environment file:\n```bash\ncp sample-env .env\n```\n\n2. Add your private keys to `.env`:\n```\nexport PRIVATE_KEY_MAINNET=your_mainnet_private_key\nexport PRIVATE_KEY_SHASTA=your_shasta_private_key\nexport PRIVATE_KEY_NILE=your_nile_private_key\n```\n\n## Compilation\n\nThis project supports compilation with both Tronbox and Foundry:\n\n### Tronbox Compilation\n```bash\nmake build-tronbox\n# or directly:\npnpm run compile\n```\n\n### Foundry Compilation\n```bash\nmake build-foundry\n# or directly:\nforge build --sizes\n```\n\n## Deployment\n\n### Local Development\n```bash\npnpm migrate\n# or\ntronbox migrate\n```\n\n### Testnet Deployment\n\n**Shasta Testnet**\n```bash\nsource .env && tronbox migrate --network shasta\n```\n\n**Nile Testnet**\n```bash\nsource .env && tronbox migrate --network nile\n```\n\n### Mainnet Deployment\n```bash\nsource .env && tronbox migrate --network mainnet\n```\n\n## Testing\n\nThis project includes comprehensive test suites for both Tronbox (TVM) and Foundry:\n\n### Tronbox Tests (TVM)\n\nRun the full TVM test suite with local TRON node:\n```bash\nmake test-tronbox\n```\n\nThis command will:\n1. Start a local TRON node\n2. Deploy contracts  \n3. Run tests\n4. Stop the node\n\nFor individual steps:\n```bash\nmake tron-node-up        # Start local TRON node\nmake migrate-tronbox     # Deploy contracts\npnpm run test:tronbox    # Run tests only\nmake tron-node-down      # Stop node\n```\n\nThe Tronbox tests demonstrate:\n- Basic permitTransferFrom functionality with TIP-712 signatures\n- Signature validation and spender authorization\n- Error cases (expired deadlines, wrong spenders)\n- Transfer to different recipients\n\n### Foundry Tests\n\nRun the Foundry test suite:\n```bash\nmake test-foundry\n```\n\nOr manually:\n```bash\nforge test -vvv\n```\n\nThe Foundry tests provide:\n- Comprehensive unit tests for all contract functionality\n- Fuzz testing with 10,000 runs per test\n- Gas optimization snapshots\n- Invariant testing for critical properties\n\n## Integration Guide\n\n### For Integrators\n\nBefore using Permit2, users must approve the Permit2 contract on the specific token contract:\n\n```javascript\n// User approves Permit2 to spend their tokens\nawait token.approve(permit2Address, amount).send();\n```\n\n### Signature Generation\n\nGenerate TIP-712 compliant signatures using TronWeb:\n\n```javascript\nconst domain = {\n  name: 'Permit2',\n  chainId: chainId & 0xffffffff, // Masked chainId for TIP-712\n  verifyingContract: permit2Address\n};\n\nconst types = {\n  PermitTransferFrom: [\n    { name: 'permitted', type: 'TokenPermissions' },\n    { name: 'spender', type: 'address' },\n    { name: 'nonce', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' }\n  ],\n  TokenPermissions: [\n    { name: 'token', type: 'address' },\n    { name: 'amount', type: 'uint256' }\n  ]\n};\n\nconst message = {\n  permitted: {\n    token: tokenAddress,\n    amount: amount\n  },\n  spender: spenderAddress, // Must match msg.sender when calling permitTransferFrom\n  nonce: nonce,\n  deadline: deadline\n};\n\nconst signature = await tronWeb.trx._signTypedData(\n  domain,\n  types,\n  message,\n  privateKey\n);\n```\n\n### Using Permit2\n\n```javascript\n// Execute transfer using signature\nawait permit2.permitTransferFrom(\n  permit,           // Permit data\n  transferDetails,  // Transfer details (to, amount)\n  owner,           // Token owner\n  signature        // TIP-712 signature\n).send();\n```\n\n## Contract Addresses\n\n### Testnet Deployments\n\n> ⚠️ **WARNING**: These contracts are for testing purposes only and are NOT ready for production use.\n\n| Network | Address | Status |\n|---------|---------|--------|\n| Nile Testnet | `TGm3CvZSaRvi7iehvZj7utaKLcP6JwpynF` | 🧪 Experimental |\n\n**Important Notes:**\n- This is the first testnet deployment of Permit2 on Tron\n- The contract is under active development and testing\n- Do NOT use for production applications or real value transfers\n- Contract may be redeployed with breaking changes\n\n### Mainnet Deployment\n\nNo mainnet deployment yet. Thorough testing on testnet is required before mainnet deployment.\n\n## Security Considerations\n\n- Always verify the spender in signatures matches the actual caller\n- Set reasonable deadlines for signatures\n- Users should be careful about which contracts they sign permits for\n- Revoke allowances when no longer needed\n\n## Gas Optimization\n\nThe contracts use viaIR compilation with high optimization runs (1,000,000) for minimal gas usage.\n\n## Development\n\n### Dual Testing Framework\n\nThis project uses both Tronbox and Foundry for comprehensive testing:\n\n- **Tronbox**: Used for TVM-specific testing with actual TRON node interaction\n- **Foundry**: Provides fast unit tests, fuzz testing, and gas optimization\n\nBoth test suites are run automatically in CI on every push and pull request.\n\n### Key Commands\n\n| Command | Description |\n|---------|-------------|\n| `make test-tronbox` | Run full TVM test suite |\n| `make test-foundry` | Run Foundry test suite |\n| `make tron-node-up` | Start local TRON node |\n| `make tron-node-down` | Stop local TRON node |\n| `make build-tronbox` | Compile with Tronbox |\n| `make build-foundry` | Compile with Foundry |\n| `make install-tronbox` | Install npm dependencies |\n| `make install-foundry` | Install Foundry dependencies |\n\n### Project Structure\n```\npermit2-tron/\n├── contracts/         # Solidity contracts\n├── migrations/        # Tronbox deployment scripts\n├── test/             # Tronbox test files\n├── foundry_tests/    # Foundry test files\n├── lib/              # Foundry dependencies\n├── scripts/          # Utility scripts\n├── build/            # Tronbox compiled contracts\n├── out/              # Foundry compiled contracts\n├── cache/            # Foundry cache\n├── Makefile          # Build and test commands\n├── foundry.toml      # Foundry configuration\n└── tronbox-config.js # TronBox configuration\n```\n\n## Resources\n\n- [Original Permit2 Repository](https://github.com/Uniswap/permit2)\n- [TIP-712 Specification](https://github.com/tronprotocol/tips/blob/master/tip-712.md)\n- [TronBox Documentation](https://tronbox.io)\n- [Tron Developer Hub](https://developers.tron.network)\n\n## License\n\nThis project maintains the same license as the original Permit2 implementation.\n","readmeFilename":"README.md"}