mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
96 lines
2.4 KiB
Go
96 lines
2.4 KiB
Go
/*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package commercialpaper
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
|
)
|
|
|
|
// Contract chaincode that defines
|
|
// the business logic for managing commercial
|
|
// paper
|
|
type Contract struct {
|
|
contractapi.Contract
|
|
}
|
|
|
|
// Instantiate does nothing
|
|
func (c *Contract) Instantiate() {
|
|
fmt.Println("Instantiated")
|
|
}
|
|
|
|
// Issue creates a new commercial paper and stores it in the world state
|
|
func (c *Contract) Issue(ctx TransactionContextInterface, issuer string, paperNumber string, issueDateTime string, maturityDateTime string, faceValue int) (*CommercialPaper, error) {
|
|
paper := CommercialPaper{PaperNumber: paperNumber, Issuer: issuer, IssueDateTime: issueDateTime, FaceValue: faceValue, MaturityDateTime: maturityDateTime, Owner: issuer}
|
|
paper.SetIssued()
|
|
|
|
err := ctx.GetPaperList().AddPaper(&paper)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &paper, nil
|
|
}
|
|
|
|
// Buy updates a commercial paper to be in trading status and sets the new owner
|
|
func (c *Contract) Buy(ctx TransactionContextInterface, issuer string, paperNumber string, currentOwner string, newOwner string, price int, purchaseDateTime string) (*CommercialPaper, error) {
|
|
paper, err := ctx.GetPaperList().GetPaper(issuer, paperNumber)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if paper.Owner != currentOwner {
|
|
return nil, fmt.Errorf("Paper %s:%s is not owned by %s", issuer, paperNumber, currentOwner)
|
|
}
|
|
|
|
if paper.IsIssued() {
|
|
paper.SetTrading()
|
|
}
|
|
|
|
if !paper.IsTrading() {
|
|
return nil, fmt.Errorf("Paper %s:%s is not trading. Current state = %s", issuer, paperNumber, paper.GetState())
|
|
}
|
|
|
|
paper.Owner = newOwner
|
|
|
|
err = ctx.GetPaperList().UpdatePaper(paper)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return paper, nil
|
|
}
|
|
|
|
// Redeem updates a commercial paper status to be redeemed
|
|
func (c *Contract) Redeem(ctx TransactionContextInterface, issuer string, paperNumber string, redeemingOwner string, redeenDateTime string) (*CommercialPaper, error) {
|
|
paper, err := ctx.GetPaperList().GetPaper(issuer, paperNumber)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if paper.Owner != redeemingOwner {
|
|
return nil, fmt.Errorf("Paper %s:%s is not owned by %s", issuer, paperNumber, redeemingOwner)
|
|
}
|
|
|
|
if paper.IsRedeemed() {
|
|
return nil, fmt.Errorf("Paper %s:%s is already redeemed", issuer, paperNumber)
|
|
}
|
|
|
|
paper.Owner = paper.Issuer
|
|
paper.SetRedeemed()
|
|
|
|
err = ctx.GetPaperList().UpdatePaper(paper)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return paper, nil
|
|
}
|