TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1386 647
Погружение в EIP-7702. Часть 7

А теперь пройдемся по тестовым контрактам.

Файл BatchCallAndSponsor.t.sol содержит тесты для контракта BatchCallAndSponsor. Они охватывают сценарии прямого и спонсорского выполнения, защиту от воспроизведения и обработку ошибок.

Тест прямого выполнения

Функция testDirectExecution проверяет прямое исполнение вызовов вызывающей стороной (т. е. Алисой). Она проверяет, что Алиса отправила 1 ETH и 100 токенов Бобу в одной транзакции.

В этом тесте Алиса уполномочивает контракт реализации выполнить транзакцию от ее имени. Мы используем чит-код signAndAttachDelegation, чтобы подписать сообщение авторизации и прикрепить его к транзакции.

Затем вызывается функция execute() на EOA Алисы с массивом вызовов, что невозможно без EIP-7702, самой Алисой.

function testDirectExecution() public {
console2.log("Sending 1 ETH from Alice to Bob and transferring 100 tokens to Bob in a single transaction");
BatchCallAndSponsor.Call[] memory calls = new BatchCallAndSponsor.Call[](2);

// ETH transfer
calls[0] = BatchCallAndSponsor.Call({to: BOB_ADDRESS, value: 1 ether, data: ""});

// Token transfer
calls[1] = BatchCallAndSponsor.Call({
to: address(token),
value: 0,
data: abi.encodeCall(ERC20.transfer, (BOB_ADDRESS, 100e18))
});

vm.signAndAttachDelegation(address(implementation), ALICE_PK);

vm.startPrank(ALICE_ADDRESS);
BatchCallAndSponsor(ALICE_ADDRESS).execute(calls);
vm.stopPrank();

assertEq(BOB_ADDRESS.balance, 1 ether);
assertEq(token.balanceOf(BOB_ADDRESS), 100e18);
}


Тест спонсированного выполнения

Функция testSponsoredExecution() проверяет спонсируемое выполнение вызовов спонсором (т. е. Бобом). Она проверяет, что третья сторона (Боб) может выполнить транзакцию от имени Алисы. Мы проверяем, что отправителем является Боб, а не Алиса, и что получатель получил средства.

В этом тесте Алиса подписывает сообщение, позволяющую реализации выполнять транзакции от ее имени. Боб прикрепляет его от имени Алисы и передает эфир.

Затем Алиса подписывает транзакцию, а Боб исполняет ее через временно назначенный контракт Алисы.

И наконец, функция execute() на EOA Алисы вызывается Бобом, а не Алисой.

function testSponsoredExecution() public {

// Arrange the call(s).
calls[0] = BatchCallAndSponsor.Call({to: recipient, value: 1 ether, data: ""});

// Alice signs a delegation allowing `implementation` to execute transactions on her behalf.
Vm.SignedDelegation memory signedDelegation = vm.signDelegation(address(implementation), ALICE_PK);

// Bob attaches the signed delegation from Alice and broadcasts it.
vm.startBroadcast(BOB_PK);
vm.attachDelegation(signedDelegation);

// Prepare the signature for the transaction.
(uint8 v, bytes32 r, bytes32 s) = vm.sign(ALICE_PK, MessageHashUtils.toEthSignedMessageHash(digest));
bytes memory signature = abi.encodePacked(r, s, v);

// Expect the event. The first parameter should be BOB_ADDRESS.
vm.expectEmit(true, true, true, true);
emit BatchCallAndSponsor.CallExecuted(BOB_ADDRESS, calls[0].to, calls[0].value, calls[0].data);

// As Bob, execute the transaction via Alice's temporarily assigned contract.
BatchCallAndSponsor(ALICE_ADDRESS).execute(calls, signature);

vm.stopBroadcast();

assertEq(recipient.balance, 1 ether);
}


Неверная подпись

Функция testWrongSignature() проверяет сценарий, в котором подпись неверна.

function testWrongSignature() public {
// Bob attaches the signed delegation from Alice and broadcasts it.
vm.startBroadcast(BOB_PK);
vm.attachDelegation(signedDelegation);

// Sign with the wrong key (Bob's instead of Alice's).
(uint8 v, bytes32 r, bytes32 s) = vm.sign(BOB_PK, MessageHashUtils.toEthSignedMessageHash(digest));
bytes memory signature = abi.encodePacked(r, s, v);

vm.expectRevert("Invalid signature");
BatchCallAndSponsor(ALICE_ADDRESS).execute(calls, signature);
vm.stopBroadcast();
}


Тест защиты от воспроизведения
  • 🔥 3
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →