@paraswap/dex-lib 4.8.37-native-dex-math.1 → 4.8.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/abi/pancakeswap-infinity/cl-pool-manager.json +80 -0
- package/build/dex/aave-gsm/config.js +2 -2
- package/build/dex/fluid-dex/scripts/measure-calc-time.js +178 -0
- package/build/dex/fluid-dex/scripts/measure-calc-time.js.map +1 -0
- package/build/dex/idex.d.ts +1 -1
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/{infusion → pancakeswap-infinity}/config.d.ts +2 -2
- package/build/dex/pancakeswap-infinity/config.js +14 -0
- package/build/dex/pancakeswap-infinity/config.js.map +1 -0
- package/build/dex/pancakeswap-infinity/encoder.d.ts +4 -0
- package/build/dex/pancakeswap-infinity/encoder.js +218 -0
- package/build/dex/pancakeswap-infinity/encoder.js.map +1 -0
- package/build/dex/pancakeswap-infinity/pancakeswap-infinity.d.ts +21 -0
- package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js +102 -0
- package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js.map +1 -0
- package/build/dex/pancakeswap-infinity/subgraph.d.ts +7 -0
- package/build/dex/pancakeswap-infinity/subgraph.js +64 -0
- package/build/dex/pancakeswap-infinity/subgraph.js.map +1 -0
- package/build/dex/pancakeswap-infinity/types.d.ts +39 -0
- package/build/dex/pancakeswap-infinity/types.js.map +1 -0
- package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.d.ts +0 -2
- package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js +0 -5
- package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js.map +1 -1
- package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +3 -6
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js +9 -85
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
- package/build/dex/solidly-v3/solidly-v3-pool.d.ts +0 -3
- package/build/dex/solidly-v3/solidly-v3-pool.js +0 -8
- package/build/dex/solidly-v3/solidly-v3-pool.js.map +1 -1
- package/build/dex/solidly-v3/solidly-v3.d.ts +2 -5
- package/build/dex/solidly-v3/solidly-v3.js +8 -84
- package/build/dex/solidly-v3/solidly-v3.js.map +1 -1
- package/build/dex/uniswap-v3/scripts/measure-calc-time.js +110 -222
- package/build/dex/uniswap-v3/scripts/measure-calc-time.js.map +1 -1
- package/build/dex/uniswap-v3/types.d.ts +0 -1
- package/build/dex/uniswap-v3/types.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +0 -2
- package/build/dex/uniswap-v3/uniswap-v3-pool.js +0 -5
- package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3.d.ts +3 -11
- package/build/dex/uniswap-v3/uniswap-v3.js +9 -86
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/build/dex/uniswap-v4/api-go/compare-pricing.d.ts +1 -0
- package/build/dex/uniswap-v4/api-go/compare-pricing.js +187 -0
- package/build/dex/uniswap-v4/api-go/compare-pricing.js.map +1 -0
- package/build/dex/uniswap-v4/api-go/compare-states.d.ts +1 -0
- package/build/dex/uniswap-v4/api-go/compare-states.js +149 -0
- package/build/dex/uniswap-v4/api-go/compare-states.js.map +1 -0
- package/build/dex/uniswap-v4/api-go/fetch-pool-key.d.ts +0 -0
- package/build/dex/uniswap-v4/api-go/fetch-pool-key.js +140 -0
- package/build/dex/uniswap-v4/api-go/fetch-pool-key.js.map +1 -0
- package/build/dex/uniswap-v4/types.d.ts +0 -1
- package/build/dex/uniswap-v4/uniswap-v4-pool-manager.d.ts +0 -2
- package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js +0 -3
- package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js.map +1 -1
- package/build/dex/uniswap-v4/uniswap-v4-pool.d.ts +0 -3
- package/build/dex/uniswap-v4/uniswap-v4-pool.js +0 -18
- package/build/dex/uniswap-v4/uniswap-v4-pool.js.map +1 -1
- package/build/dex/uniswap-v4/uniswap-v4.d.ts +1 -3
- package/build/dex/uniswap-v4/uniswap-v4.js +14 -74
- package/build/dex/uniswap-v4/uniswap-v4.js.map +1 -1
- package/build/pricing-helper.d.ts +1 -1
- package/build/pricing-helper.js +2 -2
- package/build/pricing-helper.js.map +1 -1
- package/package.json +3 -3
- package/build/abi/BProtocol.json +0 -1155
- package/build/abi/Jarvis.json +0 -1172
- package/build/abi/MStableAsset.json +0 -1545
- package/build/abi/OneInchLp.json +0 -1304
- package/build/abi/Onebit.json +0 -736
- package/build/abi/Shell.json +0 -1294
- package/build/abi/TraderJoeV2Router.json +0 -50
- package/build/abi/idle-dao/idle-cdo-factory.json +0 -38
- package/build/abi/idle-dao/idle-cdo.json +0 -1245
- package/build/abi/infusion/InfusionFactory.json +0 -147
- package/build/abi/infusion/InfusionPair.json +0 -658
- package/build/abi/infusion/InfusionRouter.json +0 -442
- package/build/abi/maker-psm/pot.json +0 -322
- package/build/abi/maker-psm/psm.json +0 -243
- package/build/abi/maker-psm/vat.json +0 -363
- package/build/abi/nomiswap-v2/nomiswap-v2-pool.json +0 -773
- package/build/abi/quick-perps/fast-price-events.json +0 -70
- package/build/abi/quick-perps/fast-price-feed.json +0 -741
- package/build/abi/quick-perps/reader.json +0 -313
- package/build/abi/quick-perps/vault-price-feed.json +0 -323
- package/build/abi/quick-perps/vault.json +0 -1953
- package/build/abi/uniswap-v2/excalibur-pool.json +0 -881
- package/build/abi/uniswap-v2/mdex-factory.json +0 -759
- package/build/abi/wUSDM.json +0 -757
- package/build/abi/zrx.v2.json +0 -1967
- package/build/abi/zrx.v3.json +0 -3454
- package/build/abi/zrx.v4.json +0 -2193
- package/build/dex/OneInchLp.d.ts +0 -24
- package/build/dex/OneInchLp.js +0 -43
- package/build/dex/OneInchLp.js.map +0 -1
- package/build/dex/bProtocol/bProtocol.d.ts +0 -15
- package/build/dex/bProtocol/bProtocol.js +0 -56
- package/build/dex/bProtocol/bProtocol.js.map +0 -1
- package/build/dex/bProtocol/types.d.ts +0 -11
- package/build/dex/bProtocol/types.js +0 -8
- package/build/dex/bProtocol/types.js.map +0 -1
- package/build/dex/ekubo/pools/base-pool.d.ts +0 -47
- package/build/dex/ekubo/pools/base-pool.js +0 -184
- package/build/dex/ekubo/pools/base-pool.js.map +0 -1
- package/build/dex/ekubo/pools/iface.d.ts +0 -46
- package/build/dex/ekubo/pools/iface.js +0 -75
- package/build/dex/ekubo/pools/iface.js.map +0 -1
- package/build/dex/ekubo/pools/math/price.d.ts +0 -7
- package/build/dex/ekubo/pools/math/price.js +0 -112
- package/build/dex/ekubo/pools/math/price.js.map +0 -1
- package/build/dex/ekubo/pools/oracle-pool.d.ts +0 -10
- package/build/dex/ekubo/pools/oracle-pool.js +0 -19
- package/build/dex/ekubo/pools/oracle-pool.js.map +0 -1
- package/build/dex/ekubo/pools/pool-utils.d.ts +0 -44
- package/build/dex/ekubo/pools/pool-utils.js +0 -240
- package/build/dex/ekubo/pools/pool-utils.js.map +0 -1
- package/build/dex/idle-dao/config.d.ts +0 -5
- package/build/dex/idle-dao/config.js +0 -24
- package/build/dex/idle-dao/config.js.map +0 -1
- package/build/dex/idle-dao/idle-dao.d.ts +0 -42
- package/build/dex/idle-dao/idle-dao.js +0 -279
- package/build/dex/idle-dao/idle-dao.js.map +0 -1
- package/build/dex/idle-dao/token_list.d.ts +0 -4
- package/build/dex/idle-dao/token_list.js +0 -289
- package/build/dex/idle-dao/token_list.js.map +0 -1
- package/build/dex/idle-dao/tokens.d.ts +0 -9
- package/build/dex/idle-dao/tokens.js +0 -68
- package/build/dex/idle-dao/tokens.js.map +0 -1
- package/build/dex/idle-dao/types.d.ts +0 -35
- package/build/dex/idle-dao/types.js +0 -11
- package/build/dex/idle-dao/types.js.map +0 -1
- package/build/dex/idle-dao/utils.d.ts +0 -8
- package/build/dex/idle-dao/utils.js +0 -149
- package/build/dex/idle-dao/utils.js.map +0 -1
- package/build/dex/infusion/config.js +0 -20
- package/build/dex/infusion/config.js.map +0 -1
- package/build/dex/infusion/infusion-stable-pool.d.ts +0 -4
- package/build/dex/infusion/infusion-stable-pool.js +0 -74
- package/build/dex/infusion/infusion-stable-pool.js.map +0 -1
- package/build/dex/infusion/infusion.d.ts +0 -51
- package/build/dex/infusion/infusion.js +0 -500
- package/build/dex/infusion/infusion.js.map +0 -1
- package/build/dex/infusion/types.d.ts +0 -45
- package/build/dex/infusion/types.js.map +0 -1
- package/build/dex/infusion/utils/isStablePair.d.ts +0 -2
- package/build/dex/infusion/utils/isStablePair.js +0 -18
- package/build/dex/infusion/utils/isStablePair.js.map +0 -1
- package/build/dex/jarvis.d.ts +0 -56
- package/build/dex/jarvis.js +0 -163
- package/build/dex/jarvis.js.map +0 -1
- package/build/dex/mStable.d.ts +0 -44
- package/build/dex/mStable.js +0 -75
- package/build/dex/mStable.js.map +0 -1
- package/build/dex/maker-psm/config.d.ts +0 -11
- package/build/dex/maker-psm/config.js +0 -53
- package/build/dex/maker-psm/config.js.map +0 -1
- package/build/dex/maker-psm/maker-psm.d.ts +0 -103
- package/build/dex/maker-psm/maker-psm.js +0 -493
- package/build/dex/maker-psm/maker-psm.js.map +0 -1
- package/build/dex/maker-psm/types.d.ts +0 -39
- package/build/dex/maker-psm/types.js +0 -3
- package/build/dex/maker-psm/types.js.map +0 -1
- package/build/dex/onebit/onebit.d.ts +0 -16
- package/build/dex/onebit/onebit.js +0 -61
- package/build/dex/onebit/onebit.js.map +0 -1
- package/build/dex/onebit/types.d.ts +0 -14
- package/build/dex/onebit/types.js +0 -8
- package/build/dex/onebit/types.js.map +0 -1
- package/build/dex/quick-perps/config.d.ts +0 -11
- package/build/dex/quick-perps/config.js +0 -27
- package/build/dex/quick-perps/config.js.map +0 -1
- package/build/dex/quick-perps/fast-price-feed.d.ts +0 -26
- package/build/dex/quick-perps/fast-price-feed.js +0 -184
- package/build/dex/quick-perps/fast-price-feed.js.map +0 -1
- package/build/dex/quick-perps/pool.d.ts +0 -21
- package/build/dex/quick-perps/pool.js +0 -229
- package/build/dex/quick-perps/pool.js.map +0 -1
- package/build/dex/quick-perps/quick-perps.d.ts +0 -53
- package/build/dex/quick-perps/quick-perps.js +0 -247
- package/build/dex/quick-perps/quick-perps.js.map +0 -1
- package/build/dex/quick-perps/types.d.ts +0 -98
- package/build/dex/quick-perps/types.js +0 -3
- package/build/dex/quick-perps/types.js.map +0 -1
- package/build/dex/quick-perps/usdq.d.ts +0 -15
- package/build/dex/quick-perps/usdq.js +0 -62
- package/build/dex/quick-perps/usdq.js.map +0 -1
- package/build/dex/quick-perps/vault-price-feed.d.ts +0 -43
- package/build/dex/quick-perps/vault-price-feed.js +0 -203
- package/build/dex/quick-perps/vault-price-feed.js.map +0 -1
- package/build/dex/quick-perps/vault-utils.d.ts +0 -8
- package/build/dex/quick-perps/vault-utils.js +0 -42
- package/build/dex/quick-perps/vault-utils.js.map +0 -1
- package/build/dex/quick-perps/vault.d.ts +0 -46
- package/build/dex/quick-perps/vault.js +0 -182
- package/build/dex/quick-perps/vault.js.map +0 -1
- package/build/dex/se-vlr/config.d.ts +0 -3
- package/build/dex/se-vlr/config.js +0 -24
- package/build/dex/se-vlr/config.js.map +0 -1
- package/build/dex/se-vlr/se-vlr-pool.d.ts +0 -39
- package/build/dex/se-vlr/se-vlr-pool.js +0 -70
- package/build/dex/se-vlr/se-vlr-pool.js.map +0 -1
- package/build/dex/se-vlr/se-vlr.d.ts +0 -35
- package/build/dex/se-vlr/se-vlr.js +0 -131
- package/build/dex/se-vlr/se-vlr.js.map +0 -1
- package/build/dex/se-vlr/types.d.ts +0 -6
- package/build/dex/se-vlr/types.js +0 -3
- package/build/dex/se-vlr/types.js.map +0 -1
- package/build/dex/shell.d.ts +0 -25
- package/build/dex/shell.js +0 -41
- package/build/dex/shell.js.map +0 -1
- package/build/dex/solidly/forks-override/aerodrome.d.ts +0 -14
- package/build/dex/solidly/forks-override/aerodrome.js +0 -46
- package/build/dex/solidly/forks-override/aerodrome.js.map +0 -1
- package/build/dex/solidly/forks-override/chronos.d.ts +0 -23
- package/build/dex/solidly/forks-override/chronos.js +0 -141
- package/build/dex/solidly/forks-override/chronos.js.map +0 -1
- package/build/dex/solidly/forks-override/usdfi.d.ts +0 -8
- package/build/dex/solidly/forks-override/usdfi.js +0 -15
- package/build/dex/solidly/forks-override/usdfi.js.map +0 -1
- package/build/dex/solidly/forks-override/velocimeter.d.ts +0 -23
- package/build/dex/solidly/forks-override/velocimeter.js +0 -77
- package/build/dex/solidly/forks-override/velocimeter.js.map +0 -1
- package/build/dex/trader-joe-v2.d.ts +0 -40
- package/build/dex/trader-joe-v2.js +0 -74
- package/build/dex/trader-joe-v2.js.map +0 -1
- package/build/dex/uniswap-v2/dfyn.d.ts +0 -19
- package/build/dex/uniswap-v2/dfyn.js +0 -61
- package/build/dex/uniswap-v2/dfyn.js.map +0 -1
- package/build/dex/uniswap-v2/excalibur.d.ts +0 -24
- package/build/dex/uniswap-v2/excalibur.js +0 -47
- package/build/dex/uniswap-v2/excalibur.js.map +0 -1
- package/build/dex/uniswap-v2/mdex.d.ts +0 -24
- package/build/dex/uniswap-v2/mdex.js +0 -50
- package/build/dex/uniswap-v2/mdex.js.map +0 -1
- package/build/dex/uniswap-v2/nomiswap-v2.d.ts +0 -24
- package/build/dex/uniswap-v2/nomiswap-v2.js +0 -57
- package/build/dex/uniswap-v2/nomiswap-v2.js.map +0 -1
- package/build/dex/uniswap-v3/scripts/bench-all-dexes.js +0 -160
- package/build/dex/uniswap-v3/scripts/bench-all-dexes.js.map +0 -1
- package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +0 -94
- package/build/dex/uniswap-v3/uniswap-v3-new.js +0 -923
- package/build/dex/uniswap-v3/uniswap-v3-new.js.map +0 -1
- package/build/dex/uniswap-v4/contract-math/Position.d.ts +0 -3
- package/build/dex/uniswap-v4/contract-math/Position.js +0 -10
- package/build/dex/uniswap-v4/contract-math/Position.js.map +0 -1
- package/build/dex/usual-bond/config.d.ts +0 -3
- package/build/dex/usual-bond/config.js +0 -13
- package/build/dex/usual-bond/config.js.map +0 -1
- package/build/dex/usual-bond/types.d.ts +0 -7
- package/build/dex/usual-bond/types.js +0 -3
- package/build/dex/usual-bond/types.js.map +0 -1
- package/build/dex/usual-bond/usual-bond.d.ts +0 -35
- package/build/dex/usual-bond/usual-bond.js +0 -176
- package/build/dex/usual-bond/usual-bond.js.map +0 -1
- package/build/dex/wusdm/config.d.ts +0 -3
- package/build/dex/wusdm/config.js +0 -43
- package/build/dex/wusdm/config.js.map +0 -1
- package/build/dex/wusdm/constants.d.ts +0 -2
- package/build/dex/wusdm/constants.js +0 -6
- package/build/dex/wusdm/constants.js.map +0 -1
- package/build/dex/wusdm/types.d.ts +0 -18
- package/build/dex/wusdm/types.js +0 -11
- package/build/dex/wusdm/types.js.map +0 -1
- package/build/dex/wusdm/wusdm-pool.d.ts +0 -21
- package/build/dex/wusdm/wusdm-pool.js +0 -74
- package/build/dex/wusdm/wusdm-pool.js.map +0 -1
- package/build/dex/wusdm/wusdm.d.ts +0 -46
- package/build/dex/wusdm/wusdm.js +0 -243
- package/build/dex/wusdm/wusdm.js.map +0 -1
- package/build/dex/zerox/config.d.ts +0 -2
- package/build/dex/zerox/config.js +0 -33
- package/build/dex/zerox/config.js.map +0 -1
- package/build/dex/zerox/index.d.ts +0 -22
- package/build/dex/zerox/index.js +0 -225
- package/build/dex/zerox/index.js.map +0 -1
- package/build/dex/zerox/order.d.ts +0 -88
- package/build/dex/zerox/order.js +0 -53
- package/build/dex/zerox/order.js.map +0 -1
- package/build/dex/zerox/types.d.ts +0 -73
- package/build/dex/zerox/types.js +0 -21
- package/build/dex/zerox/types.js.map +0 -1
- package/native/Cargo.lock +0 -331
- package/native/Cargo.toml +0 -22
- package/native/build.rs +0 -5
- package/native/package-lock.json +0 -32
- package/native/package.json +0 -20
- package/native/src/config.rs +0 -73
- package/native/src/lib.rs +0 -528
- package/native/src/math/bit_math.rs +0 -177
- package/native/src/math/full_math.rs +0 -217
- package/native/src/math/liquidity_math.rs +0 -72
- package/native/src/math/mod.rs +0 -10
- package/native/src/math/oracle.rs +0 -493
- package/native/src/math/sqrt_price_math.rs +0 -272
- package/native/src/math/swap_math.rs +0 -306
- package/native/src/math/tick.rs +0 -239
- package/native/src/math/tick_bitmap.rs +0 -312
- package/native/src/math/tick_math.rs +0 -321
- package/native/src/math/unsafe_math.rs +0 -67
- package/native/src/pool_state.rs +0 -41
- package/native/src/query_outputs.rs +0 -379
- package/native/src/v4_query_outputs.rs +0 -255
- /package/build/dex/{uniswap-v3/scripts/bench-all-dexes.d.ts → fluid-dex/scripts/measure-calc-time.d.ts} +0 -0
- /package/build/dex/{infusion → pancakeswap-infinity}/types.js +0 -0
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
use ethnum::U256;
|
|
2
|
-
|
|
3
|
-
/// Calculates floor(a * b / denominator).
|
|
4
|
-
///
|
|
5
|
-
/// The TS version uses BigInt which has arbitrary precision, so `a * b` never
|
|
6
|
-
/// overflows. We replicate this by widening to 512-bit via two U256 halves.
|
|
7
|
-
///
|
|
8
|
-
/// Panics if the result exceeds U256::MAX or denominator is zero.
|
|
9
|
-
pub fn mul_div(a: U256, b: U256, denominator: U256) -> U256 {
|
|
10
|
-
assert!(denominator > U256::ZERO, "denominator must be > 0");
|
|
11
|
-
let (lo, hi) = widening_mul(a, b);
|
|
12
|
-
let (quot, _) = div_512_by_256(lo, hi, denominator);
|
|
13
|
-
quot
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/// Calculates ceil(a * b / denominator).
|
|
17
|
-
///
|
|
18
|
-
/// Panics if the result exceeds U256::MAX or denominator is zero.
|
|
19
|
-
pub fn mul_div_rounding_up(a: U256, b: U256, denominator: U256) -> U256 {
|
|
20
|
-
assert!(denominator > U256::ZERO, "denominator must be > 0");
|
|
21
|
-
// result = (a * b + denominator - 1) / denominator
|
|
22
|
-
let (lo, hi) = widening_mul(a, b);
|
|
23
|
-
// add (denominator - 1) to the 512-bit product
|
|
24
|
-
let addend = denominator - U256::ONE;
|
|
25
|
-
let (lo2, carry) = lo.overflowing_add(addend);
|
|
26
|
-
let hi2 = if carry { hi + U256::ONE } else { hi };
|
|
27
|
-
let (quot, _) = div_512_by_256(lo2, hi2, denominator);
|
|
28
|
-
quot
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/// Returns (lo, hi) such that a * b = hi * 2^256 + lo.
|
|
32
|
-
fn widening_mul(a: U256, b: U256) -> (U256, U256) {
|
|
33
|
-
let mask128 = (U256::ONE << 128) - U256::ONE;
|
|
34
|
-
|
|
35
|
-
let a_lo = a & mask128;
|
|
36
|
-
let a_hi = a >> 128;
|
|
37
|
-
let b_lo = b & mask128;
|
|
38
|
-
let b_hi = b >> 128;
|
|
39
|
-
|
|
40
|
-
let p0: U256 = a_lo * b_lo;
|
|
41
|
-
let p1: U256 = a_lo * b_hi;
|
|
42
|
-
let p2: U256 = a_hi * b_lo;
|
|
43
|
-
let p3: U256 = a_hi * b_hi;
|
|
44
|
-
|
|
45
|
-
let lo: U256 = p0;
|
|
46
|
-
let hi: U256 = p3;
|
|
47
|
-
|
|
48
|
-
// Add p1 << 128
|
|
49
|
-
let p1_lo = p1 << 128;
|
|
50
|
-
let p1_hi = p1 >> 128;
|
|
51
|
-
let (lo, c1) = lo.overflowing_add(p1_lo);
|
|
52
|
-
let hi = hi + p1_hi + if c1 { U256::ONE } else { U256::ZERO };
|
|
53
|
-
|
|
54
|
-
// Add p2 << 128
|
|
55
|
-
let p2_lo = p2 << 128;
|
|
56
|
-
let p2_hi = p2 >> 128;
|
|
57
|
-
let (lo, c2) = lo.overflowing_add(p2_lo);
|
|
58
|
-
let hi = hi + p2_hi + if c2 { U256::ONE } else { U256::ZERO };
|
|
59
|
-
|
|
60
|
-
(lo, hi)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/// Divides a 512-bit number (lo + hi * 2^256) by a 256-bit denominator.
|
|
64
|
-
/// Returns (quotient, remainder). Panics if quotient overflows U256.
|
|
65
|
-
fn div_512_by_256(lo: U256, hi: U256, d: U256) -> (U256, U256) {
|
|
66
|
-
assert!(d > U256::ZERO, "division by zero");
|
|
67
|
-
|
|
68
|
-
if hi == U256::ZERO {
|
|
69
|
-
return (lo / d, lo % d);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
assert!(hi < d, "mul_div result overflows U256");
|
|
73
|
-
|
|
74
|
-
// Split lo into two 128-bit halves and do two rounds of division.
|
|
75
|
-
let mask128 = (U256::ONE << 128) - U256::ONE;
|
|
76
|
-
let lo_hi = (lo >> 128) & mask128;
|
|
77
|
-
let lo_lo = lo & mask128;
|
|
78
|
-
|
|
79
|
-
// First round: divide (hi * 2^128 + lo_hi) by d
|
|
80
|
-
let (q_hi, r1) = div_384_by_256(lo_hi, hi, d);
|
|
81
|
-
|
|
82
|
-
// Second round: divide (r1 * 2^128 + lo_lo) by d
|
|
83
|
-
let (q_lo, rem) = div_384_by_256(lo_lo, r1, d);
|
|
84
|
-
|
|
85
|
-
let quotient = (q_hi << 128) + q_lo;
|
|
86
|
-
(quotient, rem)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/// Divides (hi * 2^128 + lo_128) by d, where hi < d and lo_128 < 2^128.
|
|
90
|
-
/// Returns (quotient, remainder).
|
|
91
|
-
fn div_384_by_256(lo_128: U256, hi: U256, d: U256) -> (U256, U256) {
|
|
92
|
-
let mask128 = (U256::ONE << 128) - U256::ONE;
|
|
93
|
-
let hi_upper = hi >> 128;
|
|
94
|
-
|
|
95
|
-
if hi_upper == U256::ZERO {
|
|
96
|
-
// hi fits in 128 bits, so hi * 2^128 + lo_128 fits in 256 bits
|
|
97
|
-
let numerator = (hi << 128) | lo_128;
|
|
98
|
-
return (numerator / d, numerator % d);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// hi doesn't fit in 128 bits. Use bit-by-bit long division.
|
|
102
|
-
// The quotient fits in at most ~129 bits (since hi < d).
|
|
103
|
-
let _ = mask128;
|
|
104
|
-
let mut remainder = hi;
|
|
105
|
-
let mut quotient = U256::ZERO;
|
|
106
|
-
|
|
107
|
-
for i in (0..128).rev() {
|
|
108
|
-
let bit = (lo_128 >> i) & U256::ONE;
|
|
109
|
-
|
|
110
|
-
// Check if shifting left would overflow
|
|
111
|
-
let overflow = remainder >> 255 != U256::ZERO;
|
|
112
|
-
remainder = (remainder << 1) | bit;
|
|
113
|
-
|
|
114
|
-
if overflow || remainder >= d {
|
|
115
|
-
remainder = remainder.wrapping_sub(d);
|
|
116
|
-
quotient = quotient | (U256::ONE << i);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
(quotient, remainder)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
#[cfg(test)]
|
|
124
|
-
mod tests {
|
|
125
|
-
use super::*;
|
|
126
|
-
|
|
127
|
-
#[test]
|
|
128
|
-
fn test_mul_div_simple() {
|
|
129
|
-
assert_eq!(
|
|
130
|
-
mul_div(U256::from(6u64), U256::from(7u64), U256::from(3u64)),
|
|
131
|
-
U256::from(14u64)
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
#[test]
|
|
136
|
-
fn test_mul_div_large() {
|
|
137
|
-
assert_eq!(
|
|
138
|
-
mul_div(U256::MAX, U256::ONE, U256::ONE),
|
|
139
|
-
U256::MAX
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
#[test]
|
|
144
|
-
fn test_mul_div_rounding_up_exact() {
|
|
145
|
-
assert_eq!(
|
|
146
|
-
mul_div_rounding_up(U256::from(6u64), U256::from(7u64), U256::from(3u64)),
|
|
147
|
-
U256::from(14u64)
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
#[test]
|
|
152
|
-
fn test_mul_div_rounding_up_rounds() {
|
|
153
|
-
// 5 * 7 / 3 = 35/3 = 11.666... -> ceil = 12
|
|
154
|
-
assert_eq!(
|
|
155
|
-
mul_div_rounding_up(U256::from(5u64), U256::from(7u64), U256::from(3u64)),
|
|
156
|
-
U256::from(12u64)
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
#[test]
|
|
161
|
-
fn test_mul_div_floor() {
|
|
162
|
-
// 5 * 7 / 3 = 35/3 = 11.666... -> floor = 11
|
|
163
|
-
assert_eq!(
|
|
164
|
-
mul_div(U256::from(5u64), U256::from(7u64), U256::from(3u64)),
|
|
165
|
-
U256::from(11u64)
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
#[test]
|
|
170
|
-
fn test_mul_div_large_product() {
|
|
171
|
-
let a = U256::ONE << 200;
|
|
172
|
-
let b = U256::ONE << 200;
|
|
173
|
-
let d = U256::ONE << 200;
|
|
174
|
-
assert_eq!(mul_div(a, b, d), U256::ONE << 200);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
#[test]
|
|
178
|
-
fn test_mul_div_max_times_max() {
|
|
179
|
-
assert_eq!(mul_div(U256::MAX, U256::MAX, U256::MAX), U256::MAX);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
#[test]
|
|
183
|
-
#[should_panic]
|
|
184
|
-
fn test_mul_div_overflow() {
|
|
185
|
-
mul_div(U256::MAX, U256::MAX, U256::ONE);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
#[test]
|
|
189
|
-
fn test_mul_div_rounding_up_large() {
|
|
190
|
-
let a = U256::ONE << 128;
|
|
191
|
-
let b = U256::ONE << 128;
|
|
192
|
-
let d = (U256::ONE << 128) + U256::ONE;
|
|
193
|
-
let result = mul_div_rounding_up(a, b, d);
|
|
194
|
-
assert!(result > U256::ZERO);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
#[test]
|
|
198
|
-
fn test_widening_mul_simple() {
|
|
199
|
-
let (lo, hi) = widening_mul(U256::from(3u64), U256::from(7u64));
|
|
200
|
-
assert_eq!(lo, U256::from(21u64));
|
|
201
|
-
assert_eq!(hi, U256::ZERO);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
#[test]
|
|
205
|
-
fn test_widening_mul_large() {
|
|
206
|
-
let (lo, hi) = widening_mul(U256::MAX, U256::from(2u64));
|
|
207
|
-
assert_eq!(hi, U256::ONE);
|
|
208
|
-
assert_eq!(lo, U256::MAX - U256::ONE);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
#[test]
|
|
212
|
-
fn test_mul_div_uniswap_style() {
|
|
213
|
-
// Test case from Uniswap V3: mulDiv(Q128, Q128, Q128) = Q128
|
|
214
|
-
let q128 = U256::ONE << 128;
|
|
215
|
-
assert_eq!(mul_div(q128, q128, q128), q128);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
use ethnum::{I256, U256};
|
|
2
|
-
|
|
3
|
-
/// Adds a signed liquidity delta to an unsigned liquidity value.
|
|
4
|
-
///
|
|
5
|
-
/// In Solidity, when y < 0:
|
|
6
|
-
/// z = x - uint128(-y); require(z < x)
|
|
7
|
-
/// When y >= 0:
|
|
8
|
-
/// z = x + uint128(y); require(z >= x)
|
|
9
|
-
///
|
|
10
|
-
/// Panics with "LS" if y < 0 and the subtraction underflows.
|
|
11
|
-
/// Panics with "LA" if y >= 0 and the addition overflows.
|
|
12
|
-
pub fn add_delta(x: U256, y: I256) -> U256 {
|
|
13
|
-
let mask_128: U256 = (U256::ONE << 128) - U256::ONE;
|
|
14
|
-
|
|
15
|
-
if y < I256::ZERO {
|
|
16
|
-
// _y = BigInt.asUintN(128, -y)
|
|
17
|
-
// (-y) is positive I256; reinterpret as U256 and mask to 128 bits
|
|
18
|
-
let neg_y_u256 = (-y).as_u256();
|
|
19
|
-
let _y = neg_y_u256 & mask_128;
|
|
20
|
-
let z = x.checked_sub(_y).expect("LS");
|
|
21
|
-
assert!(z < x, "LS");
|
|
22
|
-
z
|
|
23
|
-
} else {
|
|
24
|
-
// _y = BigInt.asUintN(128, y)
|
|
25
|
-
let _y = y.as_u256() & mask_128;
|
|
26
|
-
let z = x.checked_add(_y).expect("LA");
|
|
27
|
-
assert!(z >= x, "LA");
|
|
28
|
-
z
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
#[cfg(test)]
|
|
33
|
-
mod tests {
|
|
34
|
-
use super::*;
|
|
35
|
-
|
|
36
|
-
#[test]
|
|
37
|
-
fn test_add_positive_delta() {
|
|
38
|
-
let x = U256::from(100u64);
|
|
39
|
-
let y = I256::new(50);
|
|
40
|
-
assert_eq!(add_delta(x, y), U256::from(150u64));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
#[test]
|
|
44
|
-
fn test_add_negative_delta() {
|
|
45
|
-
let x = U256::from(100u64);
|
|
46
|
-
let y = I256::new(-50);
|
|
47
|
-
assert_eq!(add_delta(x, y), U256::from(50u64));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
#[test]
|
|
51
|
-
fn test_add_zero_delta() {
|
|
52
|
-
let x = U256::from(100u64);
|
|
53
|
-
let y = I256::ZERO;
|
|
54
|
-
assert_eq!(add_delta(x, y), U256::from(100u64));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
#[test]
|
|
58
|
-
#[should_panic(expected = "LS")]
|
|
59
|
-
fn test_subtract_too_much() {
|
|
60
|
-
let x = U256::from(50u64);
|
|
61
|
-
let y = I256::new(-100);
|
|
62
|
-
add_delta(x, y);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
#[test]
|
|
66
|
-
#[should_panic(expected = "LA")]
|
|
67
|
-
fn test_add_overflow() {
|
|
68
|
-
let x = U256::MAX;
|
|
69
|
-
let y = I256::new(1);
|
|
70
|
-
add_delta(x, y);
|
|
71
|
-
}
|
|
72
|
-
}
|