D/Labs Docs
Search
⌃K

ERC-3475 Puttable

Puttable bonds are those bonds issued with an embedded option that gives the bondholder the right but not the obligation to sell the bond back to the issuer before they reach the stated maturity date.

Creating a puttable ERC3475 contract

Bondholders may chose to call their bonds when the market interest rates rise, since in that case they can borrow at higher interest rates. The basic ERC-3475 contract does not include the puttable option, however this basic contract can be used to create a Puttable ERC-3475 contract that implements the logic for putting bonds. The Puttable ERC-3475 contract must inherit the basic ERC-3475 in order to inherits all methods and properties of the abstract storage bonds standard EIP-3475.
// SPDX-License-Identifier: CC0-1.0
​
pragma solidity ^0.8.0;
​
import "./ERC3475.sol";
​
contract ERC3475Puttable is ERC3475, IERC3475Puttable {
/**
* add the `put` function that implements the logic for putting bonds
*
* function put(Transaction[] calldata _transactions)
*/
}

Bonds class meta-datas

In addition to the four bonds meta-datas stored in the basic ERC-3475, new meta-datas describing the put option must be stored in the class meta-datas. In the following example the sixth meta-data has been added and set to a boolean value that stores the value true that tells that bonds are puttable.
classMetadatas = [
{stringValue: "", uintValue: couponRate, addressValue: address(0), boolValue: false},
{stringValue: "", uintValue: couponFrequency, addressValue: address(0), boolValue: false},
{stringValue: "", uintValue: 0, addressValue: currencyAddress, boolValue: false},
{stringValue: "", uintValue: bondDuration, addressValue: address(0), boolValue: false},
{stringValue: "", uintValue: bondDenomination, addressValue: address(0), boolValue: false},
{stringValue: "", uintValue: 0, addressValue: address(0), boolValue: true}
];