Skip to content

Commit 83f0a96

Browse files
Make CRN Credit Note use fixed currency value and add TransfersPermitted.
1 parent bbe0b66 commit 83f0a96

File tree

19 files changed

+973
-95
lines changed

19 files changed

+973
-95
lines changed

dist/golang/instruments/amendments.go

Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,6 +1807,7 @@ const (
18071807
CreditNoteFieldName = uint32(1)
18081808
CreditNoteFieldFaceValue = uint32(2)
18091809
CreditNoteFieldExpirationTimestamp = uint32(3)
1810+
CreditNoteFieldTransfersPermitted = uint32(4)
18101811
)
18111812

18121813
// ApplyAmendment updates a CreditNote based on amendment data.
@@ -1824,7 +1825,7 @@ func (a *CreditNote) ApplyAmendment(fip permissions.FieldIndexPath, operation ui
18241825
a.Name = string(data)
18251826
return permissions.SubPermissions(fip, operation, false)
18261827

1827-
case CreditNoteFieldFaceValue: // CurrencyValueField
1828+
case CreditNoteFieldFaceValue: // FixedCurrencyValueField
18281829
if len(fip) == 1 && len(data) == 0 {
18291830
a.FaceValue = nil
18301831
return permissions.SubPermissions(fip[1:], operation, false)
@@ -1849,6 +1850,19 @@ func (a *CreditNote) ApplyAmendment(fip permissions.FieldIndexPath, operation ui
18491850
}
18501851
return permissions.SubPermissions(fip, operation, false)
18511852

1853+
case CreditNoteFieldTransfersPermitted: // bool
1854+
if len(fip) > 1 {
1855+
return nil, fmt.Errorf("Amendment field index path too deep for TransfersPermitted : %v", fip)
1856+
}
1857+
if len(data) != 1 {
1858+
return nil, fmt.Errorf("TransfersPermitted amendment value is wrong size : %d", len(data))
1859+
}
1860+
buf := bytes.NewBuffer(data)
1861+
if err := binary.Read(buf, binary.LittleEndian, &a.TransfersPermitted); err != nil {
1862+
return nil, fmt.Errorf("TransfersPermitted amendment value failed to deserialize : %s", err)
1863+
}
1864+
return permissions.SubPermissions(fip, operation, false)
1865+
18521866
}
18531867

18541868
return nil, fmt.Errorf("Unknown CreditNote amendment field index : %v", fip)
@@ -1875,7 +1889,7 @@ func (a *CreditNote) CreateAmendments(fip permissions.FieldIndexPath,
18751889
})
18761890
}
18771891

1878-
// FaceValue CurrencyValueField
1892+
// FaceValue FixedCurrencyValueField
18791893
fip = append(ofip, CreditNoteFieldFaceValue)
18801894

18811895
FaceValueAmendments, err := a.FaceValue.CreateAmendments(fip, newValue.FaceValue)
@@ -1898,6 +1912,20 @@ func (a *CreditNote) CreateAmendments(fip permissions.FieldIndexPath,
18981912
})
18991913
}
19001914

1915+
// TransfersPermitted bool
1916+
fip = append(ofip, CreditNoteFieldTransfersPermitted)
1917+
if a.TransfersPermitted != newValue.TransfersPermitted {
1918+
var buf bytes.Buffer
1919+
if err := binary.Write(&buf, binary.LittleEndian, newValue.TransfersPermitted); err != nil {
1920+
return nil, errors.Wrap(err, "TransfersPermitted")
1921+
}
1922+
1923+
result = append(result, &internal.Amendment{
1924+
FIP: fip,
1925+
Data: buf.Bytes(),
1926+
})
1927+
}
1928+
19011929
return result, nil
19021930
}
19031931

@@ -2242,6 +2270,112 @@ func (a *CurrencyValueField) CreateAmendments(fip permissions.FieldIndexPath,
22422270
return result, nil
22432271
}
22442272

2273+
// FixedCurrencyValueField Permission / Amendment Field Indices
2274+
const (
2275+
FixedCurrencyValueFieldValue = uint32(1)
2276+
FixedCurrencyValueFieldCurrencyCode = uint32(2)
2277+
FixedCurrencyValueFieldPrecision = uint32(3)
2278+
)
2279+
2280+
// ApplyAmendment updates a FixedCurrencyValueField based on amendment data.
2281+
// Note: This does not check permissions or data validity. This does check data format.
2282+
// fip must have at least one value.
2283+
func (a *FixedCurrencyValueField) ApplyAmendment(fip permissions.FieldIndexPath, operation uint32,
2284+
data []byte, permissions permissions.Permissions) (permissions.Permissions, error) {
2285+
2286+
if len(fip) == 0 {
2287+
return nil, errors.New("Empty FixedCurrencyValue amendment field index path")
2288+
}
2289+
2290+
switch fip[0] {
2291+
case FixedCurrencyValueFieldValue: // uint64
2292+
2293+
if len(fip) > 1 {
2294+
return nil, fmt.Errorf("Amendment field index path too deep for Value : %v", fip)
2295+
}
2296+
buf := bytes.NewBuffer(data)
2297+
if value, err := bitcoin.ReadBase128VarInt(buf); err != nil {
2298+
return nil, fmt.Errorf("Value amendment value failed to deserialize : %s", err)
2299+
} else {
2300+
a.Value = uint64(value)
2301+
}
2302+
return permissions.SubPermissions(fip, operation, false)
2303+
case FixedCurrencyValueFieldCurrencyCode: // string
2304+
2305+
if CurrenciesData(a.CurrencyCode) == nil {
2306+
return nil, fmt.Errorf("Currencies resource value not defined : %v", a.CurrencyCode)
2307+
}
2308+
a.CurrencyCode = string(data)
2309+
return permissions.SubPermissions(fip, operation, false)
2310+
case FixedCurrencyValueFieldPrecision: // uint32
2311+
2312+
if len(fip) > 1 {
2313+
return nil, fmt.Errorf("Amendment field index path too deep for Precision : %v", fip)
2314+
}
2315+
buf := bytes.NewBuffer(data)
2316+
if value, err := bitcoin.ReadBase128VarInt(buf); err != nil {
2317+
return nil, fmt.Errorf("Precision amendment value failed to deserialize : %s", err)
2318+
} else {
2319+
a.Precision = uint32(value)
2320+
}
2321+
return permissions.SubPermissions(fip, operation, false)
2322+
}
2323+
2324+
return nil, fmt.Errorf("Unknown FixedCurrencyValue amendment field index : %v", fip)
2325+
}
2326+
2327+
// CreateAmendments determines the differences between two FixedCurrencyValues and returns
2328+
// amendment data.
2329+
func (a *FixedCurrencyValueField) CreateAmendments(fip permissions.FieldIndexPath,
2330+
newValue *FixedCurrencyValueField) ([]*internal.Amendment, error) {
2331+
2332+
if a.Equal(newValue) {
2333+
return nil, nil
2334+
}
2335+
2336+
var result []*internal.Amendment
2337+
ofip := fip.Copy() // save original to be appended for each field
2338+
2339+
// Value uint64
2340+
fip = append(ofip, FixedCurrencyValueFieldValue)
2341+
if a.Value != newValue.Value {
2342+
var buf bytes.Buffer
2343+
if err := bitcoin.WriteBase128VarInt(&buf, uint64(newValue.Value)); err != nil {
2344+
return nil, errors.Wrap(err, "Value")
2345+
}
2346+
2347+
result = append(result, &internal.Amendment{
2348+
FIP: fip,
2349+
Data: buf.Bytes(),
2350+
})
2351+
}
2352+
2353+
// CurrencyCode string
2354+
fip = append(ofip, FixedCurrencyValueFieldCurrencyCode)
2355+
if a.CurrencyCode != newValue.CurrencyCode {
2356+
result = append(result, &internal.Amendment{
2357+
FIP: fip,
2358+
Data: []byte(newValue.CurrencyCode),
2359+
})
2360+
}
2361+
2362+
// Precision uint32
2363+
fip = append(ofip, FixedCurrencyValueFieldPrecision)
2364+
if a.Precision != newValue.Precision {
2365+
var buf bytes.Buffer
2366+
if err := bitcoin.WriteBase128VarInt(&buf, uint64(newValue.Precision)); err != nil {
2367+
return nil, errors.Wrap(err, "Precision")
2368+
}
2369+
2370+
result = append(result, &internal.Amendment{
2371+
FIP: fip,
2372+
Data: buf.Bytes(),
2373+
})
2374+
}
2375+
2376+
return result, nil
2377+
}
2378+
22452379
// RateField Permission / Amendment Field Indices
22462380
const (
22472381
RateFieldPrecision = uint32(1)

dist/golang/instruments/binary_marshal.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,39 @@ func (a *CurrencyValueField) UnmarshalBinary(data []byte) error {
442442
return nil
443443
}
444444

445+
func (a *FixedCurrencyValueField) MarshalBinary() (data []byte, err error) {
446+
b, err := proto.Marshal(a)
447+
if err != nil {
448+
return nil, errors.Wrap(err, "marshal")
449+
}
450+
451+
return append([]byte{binaryVersion}, b...), nil
452+
}
453+
454+
func (a *FixedCurrencyValueField) UnmarshalBinary(data []byte) error {
455+
if len(data) == 0 {
456+
return nil // empty result
457+
}
458+
459+
if len(data) == 1 && data[0] == bitcoin.OP_FALSE {
460+
return nil // empty result
461+
}
462+
463+
if len(data) < 2 {
464+
return errors.New("Data too small, missing version or data")
465+
}
466+
467+
if data[0] != binaryVersion {
468+
return fmt.Errorf("Wrong data version: got %d, want %d", data[0], binaryVersion)
469+
}
470+
471+
if err := proto.Unmarshal(data[1:], a); err != nil {
472+
return errors.Wrap(err, "protobuf unmarshal")
473+
}
474+
475+
return nil
476+
}
477+
445478
func (a *RateField) MarshalBinary() (data []byte, err error) {
446479
b, err := proto.Marshal(a)
447480
if err != nil {

dist/golang/instruments/copy.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,12 +298,15 @@ func (a *CreditNote) Copy() *CreditNote {
298298
// Field Name - varchar
299299
result.Name = a.Name
300300

301-
// Field FaceValue - CurrencyValue
301+
// Field FaceValue - FixedCurrencyValue
302302
result.FaceValue = a.FaceValue.Copy()
303303

304304
// Field ExpirationTimestamp - uint
305305
result.ExpirationTimestamp = a.ExpirationTimestamp
306306

307+
// Field TransfersPermitted - bool
308+
result.TransfersPermitted = a.TransfersPermitted
309+
307310
return result
308311
}
309312

@@ -367,6 +370,25 @@ func (a *CurrencyValueField) Copy() *CurrencyValueField {
367370
return result
368371
}
369372

373+
func (a *FixedCurrencyValueField) Copy() *FixedCurrencyValueField {
374+
if a == nil {
375+
return nil
376+
}
377+
378+
result := &FixedCurrencyValueField{}
379+
380+
// Field Value - uint
381+
result.Value = a.Value
382+
383+
// Field CurrencyCode - fixedchar
384+
result.CurrencyCode = a.CurrencyCode
385+
386+
// Field Precision - uint
387+
result.Precision = a.Precision
388+
389+
return result
390+
}
391+
370392
func (a *RateField) Copy() *RateField {
371393
if a == nil {
372394
return nil

dist/golang/instruments/equal.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ func (l *CreditNote) Equal(right proto.Message) bool {
536536
return false // fmt.Errorf("Name string mismatched")
537537
}
538538

539-
// Field FaceValue - CurrencyValue
539+
// Field FaceValue - FixedCurrencyValue
540540
if !c.FaceValue.Equal(r.FaceValue) {
541541
return false // fmt.Errorf("FaceValue : %s", err)
542542
}
@@ -546,6 +546,11 @@ func (l *CreditNote) Equal(right proto.Message) bool {
546546
return false // fmt.Errorf("ExpirationTimestamp integer mismatched")
547547
}
548548

549+
// Field TransfersPermitted - bool
550+
if c.TransfersPermitted != r.TransfersPermitted {
551+
return false // fmt.Errorf("TransfersPermitted boolean mismatched")
552+
}
553+
549554
return true
550555
}
551556

@@ -659,6 +664,41 @@ func (l *CurrencyValueField) Equal(right proto.Message) bool {
659664
return true
660665
}
661666

667+
func (l *FixedCurrencyValueField) Equal(right proto.Message) bool {
668+
c := l
669+
if c == nil {
670+
if right == nil {
671+
return true
672+
}
673+
c = &FixedCurrencyValueField{}
674+
}
675+
r, ok := right.(*FixedCurrencyValueField)
676+
if !ok {
677+
return false
678+
}
679+
680+
if r == nil {
681+
r = &FixedCurrencyValueField{}
682+
}
683+
684+
// Field Value - uint
685+
if c.Value != r.Value {
686+
return false // fmt.Errorf("Value integer mismatched")
687+
}
688+
689+
// Field CurrencyCode - fixedchar
690+
if c.CurrencyCode != r.CurrencyCode {
691+
return false // fmt.Errorf("CurrencyCode string mismatched")
692+
}
693+
694+
// Field Precision - uint
695+
if c.Precision != r.Precision {
696+
return false // fmt.Errorf("Precision integer mismatched")
697+
}
698+
699+
return true
700+
}
701+
662702
func (l *RateField) Equal(right proto.Message) bool {
663703
c := l
664704
if c == nil {

0 commit comments

Comments
 (0)