[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-17-testirovanie-huff-foundry-fork-testy":3},{"article":4,"author":60},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":39,"related_articles":40},"d0000000-0000-0000-0000-000000000217","a0000000-0000-0000-0000-000000000012","Deep EVM #17: Тестирование Huff-контрактов — Foundry, форк-тесты и газ-ассерты","deep-evm-17-testirovanie-huff-foundry-fork-testy","Полное руководство по тестированию Huff-контрактов с помощью Foundry: форк-тесты, газ-снепшоты и дифференциальное тестирование относительно Solidity-реализаций.","## Почему тестирование Huff-контрактов — это особый случай\n\nHuff — это низкоуровневый ассемблерный язык для EVM, дающий прямой контроль над стеком, памятью и хранилищем. Эта мощь имеет свою цену: нет компилятора для перехвата ошибок типов, нет SafeMath, нет автоматической проверки границ. Каждый опкод, который вы пишете, — это именно то, что будет развёрнуто. Это делает тестирование не просто важным, а абсолютно критичным.\n\nВ отличие от Solidity, где компилятор генерирует шаблонный код для диспетчеризации функций, раскладки хранилища и ABI-кодирования, в Huff всё это нужно реализовать вручную. Одна ошибочная инструкция `SWAP` или неверный адрес перехода может привести к утечке средств или навсегда заблокировать контракт.\n\nВ этой статье мы построим полную стратегию тестирования Huff-контрактов с помощью Foundry — юнит-тесты, форк-тесты против состояния мейннета, газ-ассерты и дифференциальное тестирование против Solidity-эталона.\n\n## Настройка проекта\n\nДля начала настроим Foundry-проект с поддержкой Huff. Вам понадобится компилятор Huff (`huffc`) наряду с Foundry:\n\n```bash\ncurl -L get.huff.sh | bash\nhuffup\nforge init huff-testing && cd huff-testing\nforge install huff-language\u002Ffoundry-huff\n```\n\nНастройте `foundry.toml` для использования компилятора Huff:\n\n```toml\n[profile.default]\nsrc = \"src\"\nout = \"out\"\nlibs = [\"lib\"]\nffi = true\n\n[profile.default.fuzz]\nruns = 10000\nmax_test_rejects = 100000\n\n[profile.default.invariant]\nruns = 256\ndepth = 128\n```\n\nФлаг `ffi = true` критически важен, потому что `foundry-huff` использует FFI-вызовы для вызова компилятора Huff во время тестирования.\n\n## Написание Huff-контракта для тестирования\n\nНапишем простой ERC20-подобный токен на Huff:\n\n```huff\n\u002F\u002F src\u002FSimpleToken.huff\n#define function balanceOf(address) view returns (uint256)\n#define function transfer(address, uint256) nonpayable returns (bool)\n\n#define constant BALANCES_SLOT = FREE_STORAGE_POINTER()\n\n#define macro BALANCE_OF() = takes (0) returns (0) {\n    0x04 calldataload           \u002F\u002F [account]\n    BALANCES_SLOT               \u002F\u002F [slot, account]\n    STORE_ELEMENT_FROM_KEYS(0x00) \u002F\u002F [balance_slot]\n    sload                       \u002F\u002F [balance]\n    0x00 mstore\n    0x20 0x00 return\n}\n\n#define macro TRANSFER() = takes (0) returns (0) {\n    0x24 calldataload           \u002F\u002F [amount]\n    0x04 calldataload           \u002F\u002F [to, amount]\n    caller                      \u002F\u002F [from, to, amount]\n    dup1 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    sload                       \u002F\u002F [from_bal, from, to, amount]\n    dup1 dup5 gt fail jumpi\n    dup4 swap1 sub              \u002F\u002F [new_from_bal, from, to, amount]\n    dup2 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    sstore                      \u002F\u002F [from, to, amount]\n    swap1 dup1 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    dup1 sload dup4 add\n    swap1 sstore pop pop\n    0x01 0x00 mstore\n    0x20 0x00 return\n    fail: 0x00 0x00 revert\n}\n```\n\n## Настройка тестов в Foundry для Huff\n\nКлюч к тестированию Huff в Foundry — использование библиотеки `HuffDeployer` из `foundry-huff`:\n\n```solidity\n\u002F\u002F test\u002FSimpleToken.t.sol\npragma solidity ^0.8.19;\n\nimport \"forge-std\u002FTest.sol\";\nimport \"foundry-huff\u002FHuffDeployer.sol\";\n\ninterface ISimpleToken {\n    function balanceOf(address) external view returns (uint256);\n    function transfer(address, uint256) external returns (bool);\n}\n\ncontract SimpleTokenTest is Test {\n    ISimpleToken token;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n\n    function setUp() public {\n        address deployed = HuffDeployer.deploy(\"SimpleToken\");\n        token = ISimpleToken(deployed);\n        bytes32 slot = keccak256(abi.encode(alice, uint256(0)));\n        vm.store(address(token), slot, bytes32(uint256(1000e18)));\n    }\n\n    function test_balanceOf() public view {\n        assertEq(token.balanceOf(alice), 1000e18);\n        assertEq(token.balanceOf(bob), 0);\n    }\n\n    function test_transfer() public {\n        vm.prank(alice);\n        token.transfer(bob, 100e18);\n        assertEq(token.balanceOf(alice), 900e18);\n        assertEq(token.balanceOf(bob), 100e18);\n    }\n}\n```\n\n## Газ-снепшоты и регрессионное тестирование\n\nЭффективность по газу — главная причина писать на Huff. Функция газ-снепшотов Foundry позволяет отслеживать потребление газа между запусками тестов:\n\n```bash\nforge snapshot --match-contract SimpleTokenTest\n```\n\nЭто создаёт файл `.gas-snapshot`:\n\n```\nSimpleTokenTest:test_balanceOf() (gas: 5421)\nSimpleTokenTest:test_transfer() (gas: 28934)\n```\n\nДля CI можно установить порог допуска:\n\n```bash\nforge snapshot --check .gas-snapshot --tolerance 1\n```\n\nЭто провалит сборку, если потребление газа какого-либо теста увеличится более чем на 1%. Коммитьте файл `.gas-snapshot` в репозиторий, чтобы каждый PR проверялся относительно текущего базового уровня.\n\n## Дифференциальное тестирование: Huff vs Solidity\n\nСамая мощная техника тестирования Huff — дифференциальное тестирование. Напишите Solidity-реализацию, которая заведомо корректна, и проверьте, что Huff-контракт выдаёт идентичные результаты для всех входных данных:\n\n```solidity\ncontract DifferentialTest is Test {\n    ISimpleToken huffToken;\n    SolidityToken solToken;\n\n    function setUp() public {\n        huffToken = ISimpleToken(HuffDeployer.deploy(\"SimpleToken\"));\n        solToken = new SolidityToken();\n    }\n\n    function testFuzz_balanceOf_differential(\n        address account, uint256 balance\n    ) public {\n        bytes32 huffSlot = keccak256(abi.encode(account, uint256(0)));\n        vm.store(address(huffToken), huffSlot, bytes32(balance));\n        deal(address(solToken), account, balance);\n        assertEq(\n            huffToken.balanceOf(account),\n            solToken.balanceOf(account),\n            \"balanceOf mismatch\"\n        );\n    }\n}\n```\n\nС `fuzz.runs = 10000` Foundry генерирует 10 000 случайных входных данных и проверяет, что обе реализации совпадают.\n\n## Форк-тестирование против состояния мейннета\n\nФорк-тестирование позволяет проверить ваш Huff-контракт на реальном состоянии мейннета — бесценно для контрактов, взаимодействующих с существующими протоколами:\n\n```bash\nforge test --fork-url https:\u002F\u002Feth-mainnet.g.alchemy.com\u002Fv2\u002FKEY \\\n  --match-test testFork -vvv\n```\n\nФорк-тесты медленнее (сетевые вызовы), но выявляют интеграционные проблемы, которые юнит-тесты пропускают.\n\n## Сравнение газа: Huff vs Solidity vs Yul\n\n| Операция | Solidity | Yul | Huff |\n|----------|----------|-----|------|\n| `balanceOf` | 2 604 | 2 341 | 2 187 |\n| `transfer` | 29 412 | 27 891 | 26 534 |\n| Deploy | 198 234 | 143 892 | 98 421 |\n\nHuff обычно экономит 10-15% газа по сравнению с Yul и 20-30% по сравнению с Solidity на горячих путях. Для MEV-ботов и высокочастотных операций эта экономия складывается в значительное конкурентное преимущество.\n\n## Заключение\n\nТестирование Huff-контрактов требует дисциплинированного, многоуровневого подхода: юнит-тесты для базовой корректности, фазз-тесты для граничных случаев, дифференциальные тесты против Solidity-эталонов, форк-тесты для реальных интеграций и газ-снепшоты для регрессий производительности. Foundry предоставляет все эти возможности в одном инструменте.","\u003Ch2 id=\"huff\">Почему тестирование Huff-контрактов — это особый случай\u003C\u002Fh2>\n\u003Cp>Huff — это низкоуровневый ассемблерный язык для EVM, дающий прямой контроль над стеком, памятью и хранилищем. Эта мощь имеет свою цену: нет компилятора для перехвата ошибок типов, нет SafeMath, нет автоматической проверки границ. Каждый опкод, который вы пишете, — это именно то, что будет развёрнуто. Это делает тестирование не просто важным, а абсолютно критичным.\u003C\u002Fp>\n\u003Cp>В отличие от Solidity, где компилятор генерирует шаблонный код для диспетчеризации функций, раскладки хранилища и ABI-кодирования, в Huff всё это нужно реализовать вручную. Одна ошибочная инструкция \u003Ccode>SWAP\u003C\u002Fcode> или неверный адрес перехода может привести к утечке средств или навсегда заблокировать контракт.\u003C\u002Fp>\n\u003Cp>В этой статье мы построим полную стратегию тестирования Huff-контрактов с помощью Foundry — юнит-тесты, форк-тесты против состояния мейннета, газ-ассерты и дифференциальное тестирование против Solidity-эталона.\u003C\u002Fp>\n\u003Ch2 id=\"\">Настройка проекта\u003C\u002Fh2>\n\u003Cp>Для начала настроим Foundry-проект с поддержкой Huff. Вам понадобится компилятор Huff (\u003Ccode>huffc\u003C\u002Fcode>) наряду с Foundry:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -L get.huff.sh | bash\nhuffup\nforge init huff-testing &amp;&amp; cd huff-testing\nforge install huff-language\u002Ffoundry-huff\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Настройте \u003Ccode>foundry.toml\u003C\u002Fcode> для использования компилятора Huff:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-toml\">[profile.default]\nsrc = \"src\"\nout = \"out\"\nlibs = [\"lib\"]\nffi = true\n\n[profile.default.fuzz]\nruns = 10000\nmax_test_rejects = 100000\n\n[profile.default.invariant]\nruns = 256\ndepth = 128\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Флаг \u003Ccode>ffi = true\u003C\u002Fcode> критически важен, потому что \u003Ccode>foundry-huff\u003C\u002Fcode> использует FFI-вызовы для вызова компилятора Huff во время тестирования.\u003C\u002Fp>\n\u003Ch2 id=\"huff\">Написание Huff-контракта для тестирования\u003C\u002Fh2>\n\u003Cp>Напишем простой ERC20-подобный токен на Huff:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F src\u002FSimpleToken.huff\n#define function balanceOf(address) view returns (uint256)\n#define function transfer(address, uint256) nonpayable returns (bool)\n\n#define constant BALANCES_SLOT = FREE_STORAGE_POINTER()\n\n#define macro BALANCE_OF() = takes (0) returns (0) {\n    0x04 calldataload           \u002F\u002F [account]\n    BALANCES_SLOT               \u002F\u002F [slot, account]\n    STORE_ELEMENT_FROM_KEYS(0x00) \u002F\u002F [balance_slot]\n    sload                       \u002F\u002F [balance]\n    0x00 mstore\n    0x20 0x00 return\n}\n\n#define macro TRANSFER() = takes (0) returns (0) {\n    0x24 calldataload           \u002F\u002F [amount]\n    0x04 calldataload           \u002F\u002F [to, amount]\n    caller                      \u002F\u002F [from, to, amount]\n    dup1 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    sload                       \u002F\u002F [from_bal, from, to, amount]\n    dup1 dup5 gt fail jumpi\n    dup4 swap1 sub              \u002F\u002F [new_from_bal, from, to, amount]\n    dup2 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    sstore                      \u002F\u002F [from, to, amount]\n    swap1 dup1 BALANCES_SLOT\n    STORE_ELEMENT_FROM_KEYS(0x00)\n    dup1 sload dup4 add\n    swap1 sstore pop pop\n    0x01 0x00 mstore\n    0x20 0x00 return\n    fail: 0x00 0x00 revert\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"foundry-huff\">Настройка тестов в Foundry для Huff\u003C\u002Fh2>\n\u003Cp>Ключ к тестированию Huff в Foundry — использование библиотеки \u003Ccode>HuffDeployer\u003C\u002Fcode> из \u003Ccode>foundry-huff\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F test\u002FSimpleToken.t.sol\npragma solidity ^0.8.19;\n\nimport \"forge-std\u002FTest.sol\";\nimport \"foundry-huff\u002FHuffDeployer.sol\";\n\ninterface ISimpleToken {\n    function balanceOf(address) external view returns (uint256);\n    function transfer(address, uint256) external returns (bool);\n}\n\ncontract SimpleTokenTest is Test {\n    ISimpleToken token;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n\n    function setUp() public {\n        address deployed = HuffDeployer.deploy(\"SimpleToken\");\n        token = ISimpleToken(deployed);\n        bytes32 slot = keccak256(abi.encode(alice, uint256(0)));\n        vm.store(address(token), slot, bytes32(uint256(1000e18)));\n    }\n\n    function test_balanceOf() public view {\n        assertEq(token.balanceOf(alice), 1000e18);\n        assertEq(token.balanceOf(bob), 0);\n    }\n\n    function test_transfer() public {\n        vm.prank(alice);\n        token.transfer(bob, 100e18);\n        assertEq(token.balanceOf(alice), 900e18);\n        assertEq(token.balanceOf(bob), 100e18);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">Газ-снепшоты и регрессионное тестирование\u003C\u002Fh2>\n\u003Cp>Эффективность по газу — главная причина писать на Huff. Функция газ-снепшотов Foundry позволяет отслеживать потребление газа между запусками тестов:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge snapshot --match-contract SimpleTokenTest\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Это создаёт файл \u003Ccode>.gas-snapshot\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>SimpleTokenTest:test_balanceOf() (gas: 5421)\nSimpleTokenTest:test_transfer() (gas: 28934)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Для CI можно установить порог допуска:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge snapshot --check .gas-snapshot --tolerance 1\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Это провалит сборку, если потребление газа какого-либо теста увеличится более чем на 1%. Коммитьте файл \u003Ccode>.gas-snapshot\u003C\u002Fcode> в репозиторий, чтобы каждый PR проверялся относительно текущего базового уровня.\u003C\u002Fp>\n\u003Ch2 id=\"huff-vs-solidity\">Дифференциальное тестирование: Huff vs Solidity\u003C\u002Fh2>\n\u003Cp>Самая мощная техника тестирования Huff — дифференциальное тестирование. Напишите Solidity-реализацию, которая заведомо корректна, и проверьте, что Huff-контракт выдаёт идентичные результаты для всех входных данных:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">contract DifferentialTest is Test {\n    ISimpleToken huffToken;\n    SolidityToken solToken;\n\n    function setUp() public {\n        huffToken = ISimpleToken(HuffDeployer.deploy(\"SimpleToken\"));\n        solToken = new SolidityToken();\n    }\n\n    function testFuzz_balanceOf_differential(\n        address account, uint256 balance\n    ) public {\n        bytes32 huffSlot = keccak256(abi.encode(account, uint256(0)));\n        vm.store(address(huffToken), huffSlot, bytes32(balance));\n        deal(address(solToken), account, balance);\n        assertEq(\n            huffToken.balanceOf(account),\n            solToken.balanceOf(account),\n            \"balanceOf mismatch\"\n        );\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>С \u003Ccode>fuzz.runs = 10000\u003C\u002Fcode> Foundry генерирует 10 000 случайных входных данных и проверяет, что обе реализации совпадают.\u003C\u002Fp>\n\u003Ch2 id=\"\">Форк-тестирование против состояния мейннета\u003C\u002Fh2>\n\u003Cp>Форк-тестирование позволяет проверить ваш Huff-контракт на реальном состоянии мейннета — бесценно для контрактов, взаимодействующих с существующими протоколами:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">forge test --fork-url https:\u002F\u002Feth-mainnet.g.alchemy.com\u002Fv2\u002FKEY \\\n  --match-test testFork -vvv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Форк-тесты медленнее (сетевые вызовы), но выявляют интеграционные проблемы, которые юнит-тесты пропускают.\u003C\u002Fp>\n\u003Ch2 id=\"huff-vs-solidity-vs-yul\">Сравнение газа: Huff vs Solidity vs Yul\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Операция\u003C\u002Fth>\u003Cth>Solidity\u003C\u002Fth>\u003Cth>Yul\u003C\u002Fth>\u003Cth>Huff\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>balanceOf\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>2 604\u003C\u002Ftd>\u003Ctd>2 341\u003C\u002Ftd>\u003Ctd>2 187\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>transfer\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>29 412\u003C\u002Ftd>\u003Ctd>27 891\u003C\u002Ftd>\u003Ctd>26 534\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Deploy\u003C\u002Ftd>\u003Ctd>198 234\u003C\u002Ftd>\u003Ctd>143 892\u003C\u002Ftd>\u003Ctd>98 421\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Huff обычно экономит 10-15% газа по сравнению с Yul и 20-30% по сравнению с Solidity на горячих путях. Для MEV-ботов и высокочастотных операций эта экономия складывается в значительное конкурентное преимущество.\u003C\u002Fp>\n\u003Ch2 id=\"\">Заключение\u003C\u002Fh2>\n\u003Cp>Тестирование Huff-контрактов требует дисциплинированного, многоуровневого подхода: юнит-тесты для базовой корректности, фазз-тесты для граничных случаев, дифференциальные тесты против Solidity-эталонов, форк-тесты для реальных интеграций и газ-снепшоты для регрессий производительности. Foundry предоставляет все эти возможности в одном инструменте.\u003C\u002Fp>\n","ru","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:23.884883Z","Тестирование Huff-контрактов — Foundry, форк-тесты и газ-ассерты","Руководство по тестированию Huff-контрактов с Foundry: форк-тесты, газ-снепшоты и дифференциальное тестирование.","тестирование huff контрактов foundry",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000021","Foundry","foundry",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000017","Huff","huff",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000013","Security","security","Блокчейн",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0200000-0000-0000-0000-000000000013","Почему Бали становится хабом импакт-технологий Юго-Восточной Азии в 2026 году","pochemu-bali-stanovitsya-khabom-impakt-tekhnologiy-2026","Бали занимает 16-е место среди стартап-экосистем Юго-Восточной Азии. Растущая концентрация Web3-разработчиков, ИИ-стартапов в области устойчивого развития и компаний в сфере эко-тревел-технологий формирует нишу столицы импакт-технологий региона.","Инженерия","2026-03-28T10:44:37.953039Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0200000-0000-0000-0000-000000000012","Защита данных в ASEAN: чек-лист разработчика для мультистранового комплаенса","zashchita-dannykh-asean-chek-list-razrabotchika-komplaens","Семь стран ASEAN имеют собственные законы о защите данных с разными моделями согласия, требованиями к локализации и штрафами. Практический чек-лист для разработчиков мультистрановых приложений.","2026-03-28T10:44:37.944001Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0200000-0000-0000-0000-000000000011","Цифровая трансформация Индонезии на $29 миллиардов: возможности для софтверных компаний","tsifrovaya-transformatsiya-indonezii-29-milliardov-vozmozhnosti-dlya-kompaniy","Рынок IT-услуг Индонезии вырастет с $24,37 млрд в 2025 году до $29,03 млрд в 2026 году. Облачная инфраструктура, искусственный интеллект, электронная коммерция и дата-центры обеспечивают самый быстрый рост в Юго-Восточной Азии.","2026-03-28T10:44:37.917095Z",{"id":13,"name":61,"slug":62,"bio":63,"photo_url":19,"linkedin":19,"role":64,"created_at":65,"updated_at":65},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]