Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bond module #726

Open
Tracked by #1312
tonda100 opened this issue Feb 7, 2022 · 5 comments · May be fixed by #801
Open
Tracked by #1312

Bond module #726

tonda100 opened this issue Feb 7, 2022 · 5 comments · May be fixed by #801
Labels
Epic Issues that group related issues together Scope: x/bond Issues that update the x/bond module

Comments

@tonda100
Copy link

tonda100 commented Feb 7, 2022

MVP User Stories

These stories will be implemented in the minimal viable product.

Emit Bond

As an bond issuer I want to be able to emit (issue) a bond batch, so that I am able to resell the bonds to the investors.

Sell Bond

As an bond holder I want to be able sell the bond, so that I can liquidate its value.

(Used also for the underwriting - first transfer to the investor based on a contract.)

Additional User Stories

These stories will be implemented in next phase(s) to acheive full functionality.

Issue Carbon Credits

As an band AND credit issuer, I want to issue credits connected to the bonds, so there is a proof of link.

Possibly can be also done by individual credit batch issuance and subsequent linking batch and bond.

Mature Bond

As an issuer, I want to be able to mature the bond (finish the bond lifecycle), so the bond holders can liquidate its value.

Put Bond

As an bond holder, I want to put the bond, so that I can liquidate its value before maturity.

Call Bond

As an issuer, I want to call the bond, so I can buy from the current bond owner the bonds, before the maturity.

Attributes

Bond Emission

Bond emission is single issuance of the bonds of one issuer granted the authority to issue bonds related to one project issued at a single point in time.

Attribute name

Attribute type

Note

Emission denom

unique identifier of the bond emmision

Bond name

text

display name of the bond

Issuer

wallet

Emission value

number

- value of the whole batch. FaceValueAmount?

Emission currency

text

FaceValueCurrency?

Fraction / Precision?

number

to what degree the facevalue can be divided?

Project id

text?

"link" to the project using the bond as financing

Issuance date

date

Date of the issuance of the batch

Maturity date

date

Date of the maturity of the batch

Collateral type

text

What collateral is there on a bond, if any?

Underwriting fee

percentage?

What is the fee for the first sale (issuer → owner). Percentage or flat rate?

Coupon rate

percentage?

Coupon frequency

text

Taxable

bool

Callable

bool

Can the bond be called by the project/issuer before maturity?

Puttable

bool

Can the bond be put by the owner back to the issuer before maturity?

Negotiable

bool

Is the bond tradeable on the secondary market?

Credit Batches

array

IDs of the credit batches

@dtkong
Copy link
Contributor

dtkong commented Feb 7, 2022

Thanks @tonda100 looks like a reasonable starting point!
1/ can a bond be transferred from an investor to another account? once the contract / bond has been initiated? Negotiable implies this is possible.
2/ how should one expect the bond collateralization and the call/puts to work? i personally don't think i would include these features in an MVP as it introduces significant complexity. alternatively, if it were to be included, what is one streamlined use case?

@yddgd
Copy link

yddgd commented Feb 8, 2022

hello @dtkong, I will try to answer that.
ad 1/ yes, it can. the Negotiable can be used for the case when this is not desired. Some secondary market similar to the carbon's "Simple Order Book" would be helpful for human-readable trading.

ad 2/ the idea is to use the same concepts as with regulated bonds, but the functionality itself would not belong to the MVP. The attributes though, I believe, would be useful, so adding the functionlity would not be non-compatible change.

  • collateralization - this would add complexity to the issuer administrative/papework, but also could reduce the risk-rate for the investors. Will need further research whether all would be kept off-chain, or if and what could be on-chain.

  • call - this will give the option (not obligation) to the issuer to buy the bonds before maturity at a before-set price. This would be issuer-initiated non-rejectable action.

  • put - this will give the option (not obligation) to the owner to sell the bonds to the issuer before maturity at a before-set price. This would be owner-initiated non-rejectable action.

@bitsoverflow
Copy link

Hello @dtkong

My thoughts on qu. 2/ bond collateralization could be on-chain ecocredits (ID of credit batches) or a voucher representing a 'forward contract' or agreement to purchase future or ex ante credits by a buyer. That would also require a voucher ID as input field if it is a futures contract on ecocredits. Off-chain collateral is how our off-chain bonds currently work, so there are complexities with liquidating that collateral off-chain, therefore no off-chain collateral at the moment. If these features could be included in an Alpha version, but not functional - is that an option? If it were to be included, one streamlined use case is collateral from ecocredits batch ID or associated ecocredits voucher for future delivery.

@tonda100
Copy link
Author

MVP will include possibility to issue bond and sell bond. When a bond emission happens a single Bond object is created with face value of entire emission and holder is the issuer of the bond. When a part of that bond is sold to an investor a sell operation will close the current bond object and create two new bond object. Sum of face value of new bonds is equal to a value of closed bond. Investor will be a holder of one newly created bond and a seller will be holder of the other bond.

Bond:

  • id (string) - unique ID of bond
  • emission_denom (string) - unique id of emission
  • name (string) - friendly name of bond emission
  • holder (string) - holder account address
  • parent_bond (string) - if a bond object was created by selling, this is a pointer to a parent bond id
  • face_value (number) - face value of a bond
  • face_currency (string) - face value currency of a bond
  • issuance_date (datetimez) - when emission happened
  • maturity_date (datetimez) - when will be paid the face value to an owner
  • creation_date (datetimez) - when a bond object was created (when it was sold to current owner)
  • coupon_rate (number) - annual coupon rate of bond in percentage
  • coupon_frequency (enum) - how often is coupon rate paid to an owner
  • status (enum) - ACTIVE (currently active bond) / CLOSED (bond was sold) / MATURED (bond's face value was paid back)
  • project (string) - project code
  • metadata (string) - space for some extra data

@horavamartin horavamartin linked a pull request Feb 24, 2022 that will close this issue
19 tasks
@robert-zaremba
Copy link
Collaborator

I'm doing a review of the proto, and missing some design information, so created #815 to discuss the design in threads.

@ryanchristo ryanchristo added the Scope: x/bond Issues that update the x/bond module label Mar 4, 2022
@ryanchristo ryanchristo added the Epic Issues that group related issues together label Mar 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Epic Issues that group related issues together Scope: x/bond Issues that update the x/bond module
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants