Почему мой тест на хардхат терпит неудачу при возвращении транзакции после использования evm_increasetime?Javascript

Форум по Javascript
Ответить
Anonymous
 Почему мой тест на хардхат терпит неудачу при возвращении транзакции после использования evm_increasetime?

Сообщение Anonymous »

Я тестирую интеллектуальный контракт с дилидиальностью для проекта. Пользователь покупает краткосрочную политику, которая истекает за 5 секунд. После увеличения времени на блокчейн на 10 секунд я пытаюсь назвать претензию (), но транзакция продолжает возвращаться. rete () После истечения срока действия
• Ожидайте, что выплата достигнет успеха, если запуск сбоя был достигнут < /p>
⸻ < /p>
Контракт солидности (CrashInsurance.sol): < /p>
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract CrashInsurance {
address public owner;

struct Policy {
uint256 payout;
uint256 pricePaid;
uint256 expiresAt;
uint256 triggerPrice;
bool claimed;
}

mapping(address => Policy) public policies;

constructor() {
owner = msg.sender;
}

function buyPolicy(uint256 payout, uint256 triggerPrice, uint256 expiresAt) external payable {
require(policies[msg.sender].expiresAt < block.timestamp, "Policy already active");
require(msg.value > 0, "Must send ETH to buy");

policies[msg.sender] = Policy({
payout: payout,
pricePaid: msg.value,
expiresAt: expiresAt,
triggerPrice: triggerPrice,
claimed: false
});
}

function claim(uint256 currentPrice) external {
Policy storage policy = policies[msg.sender];
require(block.timestamp >= policy.expiresAt, "Policy still active");
require(!policy.claimed, "Already claimed");
require(currentPrice
И вот тестовый скрипт (testcrashinsurance.js): < /p>
const hre = require("hardhat");

async function main() {
const [owner, user] = await hre.ethers.getSigners();

const CrashInsurance = await hre.ethers.getContractFactory("CrashInsurance");
const crash = await CrashInsurance.deploy();
await crash.waitForDeployment();
console.log(`✅ Contract deployed at: ${crash.address}`);

const payout = hre.ethers.parseEther("0.1");
const premium = hre.ethers.parseEther("0.01");
const triggerPrice = 1600;

const latestBlock = await hre.ethers.provider.getBlock("latest");
const expiresAt = latestBlock.timestamp + 5;
console.log("📅 Policy expires at:", expiresAt);

const tx = await crash.connect(user).buyPolicy(payout, triggerPrice, expiresAt, { value: premium });
await tx.wait();
console.log(`✅ Policy purchased by: ${user.address}`);

console.log("⏳ Advancing blockchain time by 10 seconds...");
await hre.network.provider.send("evm_increaseTime", [10]);
await hre.network.provider.send("evm_mine");

const newBlock = await hre.ethers.provider.getBlock("latest");
console.log("🕒 Current block timestamp:", newBlock.timestamp);

console.log("💸 Attempting to claim...");
try {
const claimTx = await crash.connect(user).claim(1500);
await claimTx.wait();
console.log("💰 User successfully claimed payout!");
} catch (err) {
console.error("❌ Claim failed:", err.message);
}
}

main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
< /code>
И вот выход сообщения об ошибке: < /p>
Error: Transaction reverted: function call failed to execute
at CrashInsurance.claim (contracts/CrashInsurance.sol:46)
at EdrProviderWrapper.request (.../node_modules/hardhat/src/internal/hardhat-network/provider/provider.ts:359:41)
at HardhatEthersSigner.sendTransaction (.../node_modules/@nomicfoundation/hardhat-ethers/src/signers.ts:125:18)
at send (.../node_modules/ethers/src.ts/contract/contract.ts:313:20)
at Proxy.claim (.../node_modules/ethers/src.ts/contract/contract.ts:352:16)
at main (.../scripts/testCrashInsurance.js:23:19)
< /code>
Это команда, которую я запускаю в терминале: < /p>
npx hardhat run scripts/testCrashInsurance.js
< /code>
Вопросы:
• Почему претензия возвращается даже после того, как я продвигаю время блокчейна на 10 секунд? Инструкции < /p>
Я развернул контракт с аварийной страховой, используя хардхат. Я написал тестовый скрипт, где пользователь покупает политику, которая истекает за 5 секунд. Затем я продвинул время блокчейна на 10 секунд, используя evm_increasetime и evm_mine. После этого я позвонил в функцию претензий (), ожидая, что претензия достигнет успеха с тех пор, как истек срок действия политики, а цена триггера с аварий была выполнена. < /P>
Однако транзакция вернулась с ошибкой, в которой «Функциональный вызов не удалось выполнить». Это было нераздельно, потому что время блокчейна было продвинуто после истечения срока действия политики, поэтому я ожидал, что претензии пройдет. и проверка времени контракта во время тестов.

Подробнее здесь: https://stackoverflow.com/questions/796 ... m-increase
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»