• Ожидайте, что выплата достигнет успеха, если запуск сбоя был достигнут < /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(`
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("
const tx = await crash.connect(user).buyPolicy(payout, triggerPrice, expiresAt, { value: premium });
await tx.wait();
console.log(`
console.log("
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("
console.log("
try {
const claimTx = await crash.connect(user).claim(1500);
await claimTx.wait();
console.log("
} catch (err) {
console.error("
}
}
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
Мобильная версия