diff --git a/package-lock.json b/package-lock.json index 2314c4c567..60e4d9aaba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", "@mlabs-haskell/csl-gc-wrapper": "^1.0.1", - "@mlabs-haskell/json-bigint": " 1.0.0", + "@mlabs-haskell/json-bigint": "2.0.0", "@noble/secp256k1": "^1.7.0", "apply-args-browser": "0.0.1", "apply-args-nodejs": "0.0.1", @@ -519,12 +519,9 @@ "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" }, "node_modules/@mlabs-haskell/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-Opo07yXP/OU9mIoGmY5VVuDy5kxmb3fBAG3U9dbC15qK1OCpVLJAlxbdOfBmLOja94SnIfZINUU2xvYtVfk65w==", - "dependencies": { - "bignumber.js": "^9.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" }, "node_modules/@noble/hashes": { "version": "1.3.1", @@ -6654,12 +6651,9 @@ "integrity": "sha512-8pEb4BoQlD5zN+KtOCgtTg62OmLPjMa+DiJvoAzlLcWmp01P3TyJPgbEOtS+xiZpGA+1rRkdyeeLZV3wyw8Xfw==" }, "@mlabs-haskell/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-Opo07yXP/OU9mIoGmY5VVuDy5kxmb3fBAG3U9dbC15qK1OCpVLJAlxbdOfBmLOja94SnIfZINUU2xvYtVfk65w==", - "requires": { - "bignumber.js": "^9.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mlabs-haskell/json-bigint/-/json-bigint-2.0.0.tgz", + "integrity": "sha512-JX9TON+nZbt+1TJ5MNV1Gcpxp3/m56x1/glDwzGtydrzQzyZbKg4XFw9Frib6fh89YVqjSFJ9xmVeIyDJ5DxTQ==" }, "@noble/hashes": { "version": "1.3.1", diff --git a/package.json b/package.json index c627e3f2c5..faa207c349 100755 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@mlabs-haskell/cardano-serialization-lib-gc-browser": "^1.0.6", "@mlabs-haskell/cardano-serialization-lib-gc-nodejs": "^1.0.6", "@mlabs-haskell/csl-gc-wrapper": "^1.0.1", - "@mlabs-haskell/json-bigint": " 1.0.0", + "@mlabs-haskell/json-bigint": "2.0.0", "@noble/secp256k1": "^1.7.0", "apply-args-browser": "0.0.1", "apply-args-nodejs": "0.0.1", diff --git a/packages.dhall b/packages.dhall index bb7e263fba..316e965553 100644 --- a/packages.dhall +++ b/packages.dhall @@ -145,7 +145,7 @@ let additions = , "untagged-union" ] , repo = "https://github.com/mlabs-haskell/purescript-aeson.git" - , version = "1da04ea8ff3656a4954b3ae2414da2d6a73ade82" + , version = "e885fa483ba374f34416049b96be0bb0cd591c0b" } , bignumber = { dependencies = @@ -250,11 +250,7 @@ let additions = , version = "a3c0f67e9fdb0086016d7aebfad35d09a08b4ecd" } , js-bigints = - { dependencies = - [ "integers" - , "maybe" - , "prelude" - ] + { dependencies = [ "integers", "maybe", "prelude" ] , repo = "https://github.com/purescript-contrib/purescript-js-bigints" , version = "36a7d8ac75a7230043ae511f3145f9ed130954a9" } diff --git a/src/Internal/Cardano/Types/Transaction.purs b/src/Internal/Cardano/Types/Transaction.purs index 0a92ad9dd3..3aebed07a5 100644 --- a/src/Internal/Cardano/Types/Transaction.purs +++ b/src/Internal/Cardano/Types/Transaction.purs @@ -95,7 +95,7 @@ import Aeson , caseAesonString , decodeAeson , encodeAeson - , partialFiniteNumber + , finiteNumber ) import Control.Alternative ((<|>)) import Control.Apply (lift2) @@ -605,10 +605,10 @@ instance EncodeAeson MoveInstantaneousReward where encodeAeson = case _ of ToOtherPot r -> encodeTagged' "ToOtherPot" r -- We assume the numbers are finite - { pot = unsafePartial partialFiniteNumber r.pot } + { pot = unsafePartial $ fromJust $ finiteNumber r.pot } ToStakeCreds r -> encodeTagged' "ToStakeCreds" r -- We assume the numbers are finite - { pot = unsafePartial partialFiniteNumber r.pot } + { pot = unsafePartial $ fromJust $ finiteNumber r.pot } type PoolRegistrationParams = { operator :: PoolPubKeyHash -- cwitness (cert) diff --git a/src/Internal/Plutip/Types.purs b/src/Internal/Plutip/Types.purs index 13a880d5b7..d2f7ba78c6 100644 --- a/src/Internal/Plutip/Types.purs +++ b/src/Internal/Plutip/Types.purs @@ -26,7 +26,7 @@ import Aeson , JsonDecodeError(TypeMismatch, UnexpectedValue) , decodeAeson , encodeAeson - , partialFiniteNumber + , finiteNumber , toStringifiedNumbersJson , (.:) ) @@ -41,7 +41,7 @@ import Data.Either (Either(Left), note) import Data.Generic.Rep (class Generic) import Data.Log.Level (LogLevel) import Data.Log.Message (Message) -import Data.Maybe (Maybe) +import Data.Maybe (Maybe, fromJust) import Data.Newtype (class Newtype) import Data.Show.Generic (genericShow) import Data.Time.Duration (Seconds(Seconds)) @@ -94,7 +94,7 @@ instance EncodeAeson ClusterStartupRequest where ) = encodeAeson { keysToGenerate , epochSize - , slotLength: unsafePartial partialFiniteNumber slotLength + , slotLength: unsafePartial $ fromJust $ finiteNumber slotLength , maxTxSize , raiseExUnitsToMax } diff --git a/src/Internal/Service/Blockfrost.purs b/src/Internal/Service/Blockfrost.purs index 81ffa2cbe1..d5f22cc2ce 100644 --- a/src/Internal/Service/Blockfrost.purs +++ b/src/Internal/Service/Blockfrost.purs @@ -63,7 +63,6 @@ import Prelude import Aeson ( class DecodeAeson , Aeson - , Finite , JsonDecodeError(TypeMismatch, MissingValue, AtKey) , decodeAeson , decodeJsonString @@ -74,7 +73,6 @@ import Aeson , isNull , parseJsonStringToAeson , stringifyAeson - , unpackFinite , (.:) , (.:!) ) @@ -214,7 +212,7 @@ import Data.Bifunctor (lmap) import Data.BigNumber (BigNumber, toFraction) import Data.BigNumber as BigNumber import Data.DateTime.Instant (instant, toDateTime) -import Data.Either (Either(Left, Right), either, note) +import Data.Either (Either(Left, Right), either, hush, note) import Data.Foldable (fold) import Data.Generic.Rep (class Generic) import Data.HTTP.Method (Method(GET, POST)) @@ -1237,7 +1235,7 @@ blockfrostStakeCredentialToBech32 = case _ of -- BlockfrostProtocolParameters -------------------------------------------------------------------------------- --- | `Stringed a` decodes an `a` who was encoded as a `String` +-- | `Stringed a` decodes an `a` that was encoded as a `String` newtype Stringed a = Stringed a derive instance Newtype (Stringed a) _ @@ -1245,6 +1243,17 @@ derive instance Newtype (Stringed a) _ instance DecodeAeson a => DecodeAeson (Stringed a) where decodeAeson = decodeAeson >=> decodeJsonString >=> Stringed >>> pure +newtype FiniteBigNumber = FiniteBigNumber BigNumber + +derive instance Newtype FiniteBigNumber _ + +instance DecodeAeson FiniteBigNumber where + decodeAeson aeson = do + number <- decodeAeson aeson + map FiniteBigNumber $ note (TypeMismatch "BigNumber") $ hush + $ BigNumber.parseBigNumber + $ show (number :: Number) + type BlockfrostProtocolParametersRaw = { "min_fee_a" :: UInt , "min_fee_b" :: UInt @@ -1255,9 +1264,9 @@ type BlockfrostProtocolParametersRaw = , "pool_deposit" :: Stringed BigInt , "e_max" :: BigInt , "n_opt" :: UInt - , "a0" :: Finite BigNumber - , "rho" :: Finite BigNumber - , "tau" :: Finite BigNumber + , "a0" :: FiniteBigNumber + , "rho" :: FiniteBigNumber + , "tau" :: FiniteBigNumber , "protocol_major_ver" :: UInt , "protocol_minor_ver" :: UInt , "min_pool_cost" :: Stringed BigInt @@ -1265,8 +1274,8 @@ type BlockfrostProtocolParametersRaw = { "PlutusV1" :: { | CostModelV1 } , "PlutusV2" :: { | CostModelV2 } } - , "price_mem" :: Finite BigNumber - , "price_step" :: Finite BigNumber + , "price_mem" :: FiniteBigNumber + , "price_step" :: FiniteBigNumber , "max_tx_ex_mem" :: Stringed BigInt , "max_tx_ex_steps" :: Stringed BigInt , "max_block_ex_mem" :: Stringed BigInt @@ -1278,15 +1287,15 @@ type BlockfrostProtocolParametersRaw = , "coins_per_utxo_word" :: Maybe (Stringed BigInt) } -toFraction' :: Finite BigNumber -> String /\ String +toFraction' :: BigNumber -> String /\ String toFraction' bn = (BigNumber.toString numerator /\ BigNumber.toString denominator) where - (numerator /\ denominator) = toFraction (unpackFinite bn) + (numerator /\ denominator) = toFraction bn (BigNumber.fromNumber infinity) -bigNumberToRational :: Finite BigNumber -> Either JsonDecodeError Rational -bigNumberToRational bn = note (TypeMismatch "Rational") do +bigNumberToRational :: FiniteBigNumber -> Either JsonDecodeError Rational +bigNumberToRational (FiniteBigNumber bn) = note (TypeMismatch "Rational") do numerator <- BigInt.fromString numerator' denominator <- BigInt.fromString denominator' reduce numerator denominator @@ -1294,9 +1303,9 @@ bigNumberToRational bn = note (TypeMismatch "Rational") do (numerator' /\ denominator') = toFraction' bn bigNumberToPrice - :: Finite BigNumber + :: FiniteBigNumber -> Either JsonDecodeError { numerator :: BigNum, denominator :: BigNum } -bigNumberToPrice bn = note (TypeMismatch "Rational") do +bigNumberToPrice (FiniteBigNumber bn) = note (TypeMismatch "Rational") do numerator <- BigNum.fromString numerator' denominator <- BigNum.fromString denominator' pure { numerator, denominator } diff --git a/src/Internal/Types/EraSummaries.purs b/src/Internal/Types/EraSummaries.purs index e1d11c076e..ae6cf387c5 100644 --- a/src/Internal/Types/EraSummaries.purs +++ b/src/Internal/Types/EraSummaries.purs @@ -15,15 +15,15 @@ import Aeson ( class DecodeAeson , class EncodeAeson , encodeAeson + , finiteNumber , getField - , partialFiniteNumber ) import Ctl.Internal.Helpers (showWithParens) import Ctl.Internal.Serialization.Address (Slot) import Ctl.Internal.Service.Helpers (aesonObject) import Ctl.Internal.Types.Epoch (Epoch) import Data.Generic.Rep (class Generic) -import Data.Maybe (Maybe) +import Data.Maybe (Maybe, fromJust) import Data.Newtype (class Newtype, wrap) import Data.Show.Generic (genericShow) import JS.BigInt (BigInt) @@ -143,7 +143,7 @@ derive newtype instance DecodeAeson RelativeTime instance EncodeAeson RelativeTime where encodeAeson (RelativeTime rt) = -- We assume the numbers are finite. - encodeAeson $ unsafePartial partialFiniteNumber rt + encodeAeson $ unsafePartial $ fromJust $ finiteNumber rt instance Show RelativeTime where show (RelativeTime rt) = showWithParens "RelativeTime" rt @@ -170,7 +170,7 @@ derive newtype instance DecodeAeson SlotLength instance EncodeAeson SlotLength where encodeAeson (SlotLength sl) = -- We assume the numbers are finite. - encodeAeson $ unsafePartial partialFiniteNumber sl + encodeAeson $ unsafePartial $ fromJust $ finiteNumber sl instance Show SlotLength where show (SlotLength slotLength) = showWithParens "SlotLength" slotLength @@ -189,4 +189,3 @@ derive newtype instance EncodeAeson SafeZone instance Show SafeZone where show (SafeZone sz) = showWithParens "SafeZone" sz - diff --git a/src/Internal/Types/Interval.purs b/src/Internal/Types/Interval.purs index 9a957d5eba..69ec8c30e6 100644 --- a/src/Internal/Types/Interval.purs +++ b/src/Internal/Types/Interval.purs @@ -73,9 +73,9 @@ import Aeson , aesonNull , decodeAeson , encodeAeson + , finiteNumber , getField , isNull - , partialFiniteNumber , (.:) ) import Control.Monad.Error.Class (throwError) @@ -652,7 +652,7 @@ instance EncodeAeson SlotToPosixTimeError where slotToPosixTimeErrorStr "endTimeLessThanTime" -- We assume the numbers are finite - [ unsafePartial partialFiniteNumber absTime ] + [ unsafePartial $ fromJust $ finiteNumber absTime ] encodeAeson CannotGetBigIntFromNumber = do encodeAeson $ mkErrorRecord slotToPosixTimeErrorStr