fabric-samples/commercial-paper/organization/digibank/contract-go/commercial-paper/papercontract.go
Andrew Hurt 5b93dd0cc0 [FAB-17140] Add go commercial paper contract (#102)
Signed-off-by: Andrew Hurt <andrew.hurt1@ibm.com>
2020-01-24 14:12:30 +00:00

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
}