@@ -1807,6 +1807,7 @@ const (
1807
1807
CreditNoteFieldName = uint32 (1 )
1808
1808
CreditNoteFieldFaceValue = uint32 (2 )
1809
1809
CreditNoteFieldExpirationTimestamp = uint32 (3 )
1810
+ CreditNoteFieldTransfersPermitted = uint32 (4 )
1810
1811
)
1811
1812
1812
1813
// ApplyAmendment updates a CreditNote based on amendment data.
@@ -1824,7 +1825,7 @@ func (a *CreditNote) ApplyAmendment(fip permissions.FieldIndexPath, operation ui
1824
1825
a .Name = string (data )
1825
1826
return permissions .SubPermissions (fip , operation , false )
1826
1827
1827
- case CreditNoteFieldFaceValue : // CurrencyValueField
1828
+ case CreditNoteFieldFaceValue : // FixedCurrencyValueField
1828
1829
if len (fip ) == 1 && len (data ) == 0 {
1829
1830
a .FaceValue = nil
1830
1831
return permissions .SubPermissions (fip [1 :], operation , false )
@@ -1849,6 +1850,19 @@ func (a *CreditNote) ApplyAmendment(fip permissions.FieldIndexPath, operation ui
1849
1850
}
1850
1851
return permissions .SubPermissions (fip , operation , false )
1851
1852
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
+
1852
1866
}
1853
1867
1854
1868
return nil , fmt .Errorf ("Unknown CreditNote amendment field index : %v" , fip )
@@ -1875,7 +1889,7 @@ func (a *CreditNote) CreateAmendments(fip permissions.FieldIndexPath,
1875
1889
})
1876
1890
}
1877
1891
1878
- // FaceValue CurrencyValueField
1892
+ // FaceValue FixedCurrencyValueField
1879
1893
fip = append (ofip , CreditNoteFieldFaceValue )
1880
1894
1881
1895
FaceValueAmendments , err := a .FaceValue .CreateAmendments (fip , newValue .FaceValue )
@@ -1898,6 +1912,20 @@ func (a *CreditNote) CreateAmendments(fip permissions.FieldIndexPath,
1898
1912
})
1899
1913
}
1900
1914
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
+
1901
1929
return result , nil
1902
1930
}
1903
1931
@@ -2242,6 +2270,112 @@ func (a *CurrencyValueField) CreateAmendments(fip permissions.FieldIndexPath,
2242
2270
return result , nil
2243
2271
}
2244
2272
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
+
2245
2379
// RateField Permission / Amendment Field Indices
2246
2380
const (
2247
2381
RateFieldPrecision = uint32 (1 )
0 commit comments