Skip to content

feat: add BigDecimal type to CVM (bounty #5)#578

Open
aglichandrap wants to merge 1 commit into
Convex-Dev:developfrom
aglichandrap:feature/bigdecimal
Open

feat: add BigDecimal type to CVM (bounty #5)#578
aglichandrap wants to merge 1 commit into
Convex-Dev:developfrom
aglichandrap:feature/bigdecimal

Conversation

@aglichandrap

Copy link
Copy Markdown

Summary

Implements arbitrary-precision decimal arithmetic for the CVM numeric tower, fulfilling bounty #5.

Changes

  • CVMBigDecimal.java: Wraps java.math.BigDecimal, extends ANumeric

    • Exact decimal arithmetic (add, sub, multiply, divide)
    • Type promotion: Decimal op Integer → Decimal, Decimal op Double → Double
    • CAD3 encoding: tag 0x1a + VLQ signed scale + VLQ byte count + unscaled bytes
    • Canonical if and only if value has meaningful fractional digits (integers stay as Long/BigInteger)
  • Decimal.java: Type class for CVMBigDecimal registered as Types.DECIMAL

  • Core.java: Registers bigdecimal (code 260) constructor and bigdecimal? (code 261) predicate

  • CAD3Encoder.java: Decodes tag 0x1a → reads VLQ scale, VLQ byte count, unscaled bytes → constructs CVMBigDecimal

  • Juice.java: costNumeric() charges proportional to unscaled byte length (same as BigInteger)

  • RT.java: ensureBigDecimal() conversion from any numeric type

  • Tag.java: BIG_DECIMAL = 0x1a

  • Symbols.java: BIGDECIMAL, BIGDECIMAL_Q

Design Decisions

  • Code 260 for bigdecimal constructor, 261 for bigdecimal? predicate
  • Tag 0x1a for wire format (between BIG_INTEGER=0x19 and DOUBLE=0x1D)
  • Canonicality: Only decimals with fractional digits are canonical; integers always reduce to CVMLong/CVMBigInteger
  • Division: Non-terminating decimal division throws ArithmeticException (preserves exactness)
  • Numeric dispatch: CVMBigDecimal handles Integer operands directly; falls back to Double for CVMDouble operands

Fixes #5

Implements arbitrary-precision decimal arithmetic for the CVM numeric tower.

- CVMBigDecimal.java: wraps java.math.BigDecimal, extends ANumeric
  - Exact decimal arithmetic (add, sub, multiply, divide)
  - Type promotion: Decimal op Integer -> Decimal, Decimal op Double -> Double
  - CAD3 encoding: tag 0x1a + VLQ scale + VLQ byte count + unscaled bytes
  - Canonical if and only if value has meaningful fractional digits

- Decimal.java: type class for CVMBigDecimal (Types.DECIMAL)
- Core.java: register 'bigdecimal' (code 260) constructor and 'bigdecimal?' (code 261) predicate
- CAD3Encoder.java: decode tag 0x1a for BigDecimal wire format
- Juice.java: costNumeric() handles CVMBigDecimal (proportional to unscaled byte length)
- RT.java: ensureBigDecimal() conversion utility
- Tag.java: BIG_DECIMAL = 0x1a
- Symbols.java: BIGDECIMAL, BIGDECIMAL_Q

Fixes Convex-Dev#5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Scrypt - if statement

1 participant