// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ZeroCouponBond {
address public issuer;
uint256 public faceValue;
uint256 public discountRate;
uint256 public maturity;
uint256 public issuePrice;
uint256 public issueBlock;
mapping(address => uint256) public balances;
constructor() {
issuer = msg.sender;
faceValue = 0.1 ether;
discountRate = 20;
maturity = 10000;
issuePrice = faceValue * (100 - discountRate) / 100;
}
function issue(address buyer) public payable {
require(msg.value == issuePrice, "Incorrect payment amount");
require(balances[buyer] == 0, "Bond already issued to this address");
issueBlock = block.number;
balances[buyer] = faceValue;
}
function redeem() public {
require(block.number >= issueBlock + maturity, "Bond has not matured yet");
require(balances[msg.sender] > 0, "No bond to redeem");
payable(msg.sender).transfer(faceValue);
balances[msg.sender] = 0;
}
}
-
- List item