diff --git a/README.md b/README.md index ca6bc69..d6c9c07 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ D-ASA examples deployed on TestNet: | Type | App ID | App Spec | |-------------------|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| Zero Coupon Bond] | [733108734](https://lora.algokit.io/testnet/application/733108734) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json) | -| Fixed Coupon Bond | [733108735](https://lora.algokit.io/testnet/application/733108735) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json) | -| Perpetual Bond | [733108736](https://lora.algokit.io/testnet/application/733108736) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json) | +| Zero Coupon Bond] | [733151482](https://lora.algokit.io/testnet/application/733151482) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json) | +| Fixed Coupon Bond | [733151497](https://lora.algokit.io/testnet/application/733151497) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json) | +| Perpetual Bond | [733151498](https://lora.algokit.io/testnet/application/733151498) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json) | 1. Download the App Spec JSON file; 1. Navigate to the [Lora App Lab](https://lora.algokit.io/testnet/app-lab); diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index cc8b73d..d12e6b7 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -18,7 +18,7 @@ - [Contract]() - [Type](./contract-type.md) - [Denomination](./denomination.md) - - [Principal (Par)](./principal.md) + - [Principal](./principal.md) - [Interests](./interests.md) - [Variable Interests](./variable-interests.md) - [Time Schedule](./time-schedule.md) diff --git a/docs/interests.md b/docs/interests.md index e85a1ec..36105aa 100644 --- a/docs/interests.md +++ b/docs/interests.md @@ -11,7 +11,9 @@ points* (*bps*). ## Interest Rate -The D-ASA **MUST** define a *nominal interest rate* \\([IPNR]\\) (`uint16`). +The D-ASA **MAY** define a nominal *interest rate* \\([IPNR]\\) (`uint16`). + +The *interest rate* **MUST** be set using the `asset_config` method. ## Coupons diff --git a/docs/payment-agent.md b/docs/payment-agent.md index 4af40cc..5bc9f70 100644 --- a/docs/payment-agent.md +++ b/docs/payment-agent.md @@ -11,7 +11,7 @@ > of payees. > Although a single block proposer could order transactions in a block, in a healthy -> network, block proposers are selected randomly by the Algorand consensus. Therefore, +> network block proposers are selected randomly by the Algorand consensus. Therefore, > order of payments in a block is random and unbiased, with no systematic advantage > or precedence of a payee with respect to others. diff --git a/docs/principal.md b/docs/principal.md index 6345520..67a4774 100644 --- a/docs/principal.md +++ b/docs/principal.md @@ -31,29 +31,35 @@ The *discount* **MUST** be set using the `asset_config` method. > Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR paid at maturity > and a minimum denomination of 1,000 EUR. The D-ASA has a principal discount of > 200 bps (2%) at the issuance. Each D-ASA unit is sold on the primary market at -> 980 EUR and will redeem 1,000 EUR of principal at maturity. +> 980 EUR and will be redeemed for 1,000 EUR of principal at maturity. ## Amortization +> ⚠️This section is still subject to major changes and reviews. + > Debt instruments principal may be amortized until maturity, according to an amortization > schedule. If the debt instrument has *principal amortization*, the D-ASA **MUST** define the *amortization rates* as `uint16[]` array, where: -- The length of the array is `N=K+1`, with `K` equal to the **fixed** *total coupons*; +- The length of the array is `N=K+1`, with `K` equal to the **fixed** *total coupons* +(see [Coupons](./interests.md#coupons) section); - The first `K`elements of the array are the *amortizing rates* associated with *coupon* payments; -- The last element of the array is the *amortization rate* associated with *principal* -payment; +- The last element of the array is the *amortization rate* associated with *outstanding +principal* payment at *maturity date*; - The elements of the array are expressed in *basis points* (*bps*); - The sum of all the *amortization rates* is equal to `10,000` *bps*. +The *amortization rates* define the amount of principal \\([PRNXT]\\) paid at the +next payment date. + > 📎 **EXAMPLE** > > A D-ASA with 5 coupons and even principal amortizing rates has the following amortizing diff --git a/docs/reference-implementation.md b/docs/reference-implementation.md index bcaa702..bb67672 100644 --- a/docs/reference-implementation.md +++ b/docs/reference-implementation.md @@ -48,9 +48,9 @@ D-ASA examples deployed on TestNet: | Type | App ID | App Spec | |-------------------------------------------------|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| -| [Zero Coupon Bond](./ref-zero-coupon-bond.md) | 733108734 | ARC-32 | -| [Fixed Coupon Bond](./ref-fixed-coupon-bond.md) | 733108735 | ARC-32 | -| [Perpetual Bond](./ref-perpetual-bond.md) | 733108736 | ARC-32 | +| [Zero Coupon Bond](./ref-zero-coupon-bond.md) | 733151482 | ARC-32 | +| [Fixed Coupon Bond](./ref-fixed-coupon-bond.md) | 733151497 | ARC-32 | +| [Perpetual Bond](./ref-perpetual-bond.md) | 733151498 | ARC-32 | 1. Download the App Spec JSON file; 1. Navigate to the Lora App Lab; diff --git a/docs/time-events.md b/docs/time-events.md index 7d931b8..ce4dbe8 100644 --- a/docs/time-events.md +++ b/docs/time-events.md @@ -1,9 +1,9 @@ -# Time Events {#time-events} +# Time Events > D-ASA *time events* are time on which contractual events are due or on which cyclic > events begin or end. -## Primary Distribution {#primary-distribution} +## Primary Distribution > Debt instruments can be distributed on the primary market during the primary distribution. @@ -11,13 +11,13 @@ The D-ASA **MUST** have a *primary opening* (`uint64`) and *closure date* (`uint64`). -## Issuance {#issuance} +## Issuance > Debt instruments start accruing interest on the issuance date. The D-ASA **MUST** have an *issuance date* \\([IED]\\) (`uint64`). -## Maturity {#maturity} +## Maturity > Debt instruments may have a maturity date, on which the principal is repaid and > the contract obligations expire. @@ -29,7 +29,7 @@ The D-ASA **MAY** have a *maturity date* \\([MD]\\) (`uint64`). The *maturity date* **MAY** be updated in case of early repayment options (see [Early Repayment Options](./early-repayment-options.md) section). -## Time Events array +## Time Events Array The D-ASA **MUST** define *time events* \\([TEV]\\) as `uint64[]` array, where: diff --git a/docs/time-periods.md b/docs/time-periods.md index 2d5b63e..4daa23c 100644 --- a/docs/time-periods.md +++ b/docs/time-periods.md @@ -1,4 +1,4 @@ -# Time Periods {#time-periods} +# Time Periods > D-ASA time periods can be used to define recurring (or "cyclic") events. @@ -56,7 +56,7 @@ events*. > The sum of the 4 coupon *time period durations* must be smaller than the time > period between the *issuance date* and the *maturity date*. -## Unlimited time schedule +## Unlimited Time Schedule If the D-ASA has an **undefined** number of *coupons*, then the *coupon due dates* \\([IP]\\) **MUST** be defined with a *time period* `(uint64,uint64)`. diff --git a/docs/variable-interests.md b/docs/variable-interests.md index 32ee609..13e306f 100644 --- a/docs/variable-interests.md +++ b/docs/variable-interests.md @@ -1,12 +1,25 @@ # Variable Rates -> ⚠️This section may still be subject to major changes and reviews. +> ⚠️This section is still subject to major changes and reviews. > Debt instruments may have variable interest rates, based on external data oracles. If the debt instrument has *variable interest rates*, the D-ASA **MAY** implement the **OPTIONAL** `set_variable_interest` method. +## Interest Update Dates + +The D-ASA **MUST** define *interest update dates* of known \\([RRF]\\) or unknown +\\([RR]\\) with respect to: + +- *time events* if the D-ASA has **fixed** number of *coupons* (see [Time +Events](./time-events.md#time-events-array) section); + +- *time periods* if the D-ASA has **undefined** number of *coupons* (see [Time +Periods](./time-periods.md#unlimited-time-schedule) section). + +The first *interest update date* corresponds to \\([RRANX]\\). + ## Spread > Debt instruments typically define a spread (bps) with respect to an external index @@ -30,7 +43,7 @@ spread* to `0`. > Debt instruments may define limitations to the interest rate variability, either > over the whole contract lifespan or over specific periods. -### Life +### Life Caps The D-ASA **MAY** define a *life cap* \\([RRLC]\\) (`uint16`) in *bps* to apply to the variable *interest rate*. @@ -47,7 +60,7 @@ cap* to `0`. If the debt instrument has no *life floor*, then the D-ASA **MUST** set the *life floor* to `0`. -### Period +### Period Caps The D-ASA **MAY** define a *period cap* \\([RRPC]\\) (`uint16`) in *bps* to apply to the variable *interest rate*.