@lunarbase-lab/pmm-math 0.1.0

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/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # @lunarbase-lab/pmm-math
2
+
3
+ N-API binding exposing [`lunarbase-pmm-math`](https://crates.io/crates/lunarbase-pmm-math)
4
+ to Node.js. Bit-exact mirror of the on-chain LunarBase Curve PMM quoting
5
+ math; every quote is verified against deterministic and fuzz vectors
6
+ generated from the on-chain Solidity contract.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install @lunarbase-lab/pmm-math
12
+ ```
13
+
14
+ The native `.node` binary is shipped per-platform via npm's
15
+ `optionalDependencies` mechanism — only the binary matching your OS / arch
16
+ is downloaded.
17
+
18
+ ### Supported platforms
19
+
20
+ | OS | Architecture | Sub-package |
21
+ | ----- | ------------ | ------------------------------------ |
22
+ | macOS | arm64 | `@lunarbase-lab/pmm-math-darwin-arm64` |
23
+ | Linux | x64 (glibc) | `@lunarbase-lab/pmm-math-linux-x64-gnu` |
24
+
25
+ Other targets (`linux-arm64-gnu`, `linux-x64-musl`, `darwin-x64`,
26
+ `win32-x64-msvc`) are not currently shipped — open an issue if you need
27
+ one.
28
+
29
+ ## Usage
30
+
31
+ ```ts
32
+ import { quoteXToY, quoteYToX, type QuoteParams, type QuoteResult } from "@lunarbase-lab/pmm-math";
33
+
34
+ const params: QuoteParams = {
35
+ // Live sqrt-price (uint80, Q32.48). Optional — defaults to anchorSqrtPriceX48.
36
+ sqrtPriceX48: "281474976710656",
37
+ // Operator-published anchor sqrt-price (uint80, Q32.48). Required.
38
+ anchorSqrtPriceX48: "281474976710656",
39
+ // Directional fees (uint24, Q24, where 2^24 represents 100%).
40
+ feeAskX24: 0, // charged on yToX swaps
41
+ feeBidX24: 838860, // charged on xToY swaps (≈ 5%)
42
+ // Reserves (uint112).
43
+ reserveX: "1000000000000000000000",
44
+ reserveY: "1000000000000000000000",
45
+ // Concentration multiplier (uint32) stored in Q20.12.
46
+ // Effective K = concentrationK / 2^12. Legacy plain-int K=5000 maps to
47
+ // 5000 << 12 = 20_480_000 here.
48
+ concentrationK: 5000 << 12,
49
+ // Input amount in the source token (decimal or 0x-hex).
50
+ amountIn: "1000000000000000000",
51
+ // Optional. Defaults to "1" (whitelisted swapper). Pass the on-chain
52
+ // `blacklistFeeMultiplier` for the gated path.
53
+ feeMultiplier: "1",
54
+ };
55
+
56
+ const result: QuoteResult = quoteXToY(params);
57
+ console.log(result.amountOut, result.sqrtPriceNext, result.fee);
58
+ ```
59
+
60
+ All numeric inputs are passed as **strings** — decimal or `0x`-prefixed hex —
61
+ to preserve full `U256` precision. Outputs are decimal strings.
62
+
63
+ ### tsconfig
64
+
65
+ For the imports above to type-check you need `"moduleResolution": "node16"`
66
+ or `"bundler"`. A minimal setup:
67
+
68
+ ```json
69
+ {
70
+ "compilerOptions": {
71
+ "target": "ES2022",
72
+ "module": "ES2022",
73
+ "moduleResolution": "node16",
74
+ "esModuleInterop": true,
75
+ "strict": true
76
+ }
77
+ }
78
+ ```
79
+
80
+ ## Pure-Rust crate
81
+
82
+ The same math is also published on crates.io as
83
+ [`lunarbase-pmm-math`](https://crates.io/crates/lunarbase-pmm-math). Both
84
+ packages share the upstream test vectors and are guaranteed bit-identical.
85
+
86
+ ## Building from source
87
+
88
+ See the [maintainer notes](https://github.com/Lunarbase-Lab/lunarbase-pmm-math/tree/main/math/rust-node/lunarbase-pmm-math-node)
89
+ in the source repository for cross-compilation, musl/Alpine notes, and
90
+ release process.
91
+
92
+ ## License
93
+
94
+ Dual-licensed under MIT or Apache-2.0.
package/index.cjs ADDED
@@ -0,0 +1,316 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /* prettier-ignore */
4
+
5
+ /* auto-generated by NAPI-RS */
6
+
7
+ const { existsSync, readFileSync } = require('fs')
8
+ const { join } = require('path')
9
+
10
+ const { platform, arch } = process
11
+
12
+ let nativeBinding = null
13
+ let localFileExisted = false
14
+ let loadError = null
15
+
16
+ function isMusl() {
17
+ // For Node 10
18
+ if (!process.report || typeof process.report.getReport !== 'function') {
19
+ try {
20
+ const lddPath = require('child_process').execSync('which ldd').toString().trim()
21
+ return readFileSync(lddPath, 'utf8').includes('musl')
22
+ } catch (e) {
23
+ return true
24
+ }
25
+ } else {
26
+ const { glibcVersionRuntime } = process.report.getReport().header
27
+ return !glibcVersionRuntime
28
+ }
29
+ }
30
+
31
+ switch (platform) {
32
+ case 'android':
33
+ switch (arch) {
34
+ case 'arm64':
35
+ localFileExisted = existsSync(join(__dirname, 'lunarbase-pmm-math.android-arm64.node'))
36
+ try {
37
+ if (localFileExisted) {
38
+ nativeBinding = require('./lunarbase-pmm-math.android-arm64.node')
39
+ } else {
40
+ nativeBinding = require('@lunarbase-lab/pmm-math-android-arm64')
41
+ }
42
+ } catch (e) {
43
+ loadError = e
44
+ }
45
+ break
46
+ case 'arm':
47
+ localFileExisted = existsSync(join(__dirname, 'lunarbase-pmm-math.android-arm-eabi.node'))
48
+ try {
49
+ if (localFileExisted) {
50
+ nativeBinding = require('./lunarbase-pmm-math.android-arm-eabi.node')
51
+ } else {
52
+ nativeBinding = require('@lunarbase-lab/pmm-math-android-arm-eabi')
53
+ }
54
+ } catch (e) {
55
+ loadError = e
56
+ }
57
+ break
58
+ default:
59
+ throw new Error(`Unsupported architecture on Android ${arch}`)
60
+ }
61
+ break
62
+ case 'win32':
63
+ switch (arch) {
64
+ case 'x64':
65
+ localFileExisted = existsSync(
66
+ join(__dirname, 'lunarbase-pmm-math.win32-x64-msvc.node')
67
+ )
68
+ try {
69
+ if (localFileExisted) {
70
+ nativeBinding = require('./lunarbase-pmm-math.win32-x64-msvc.node')
71
+ } else {
72
+ nativeBinding = require('@lunarbase-lab/pmm-math-win32-x64-msvc')
73
+ }
74
+ } catch (e) {
75
+ loadError = e
76
+ }
77
+ break
78
+ case 'ia32':
79
+ localFileExisted = existsSync(
80
+ join(__dirname, 'lunarbase-pmm-math.win32-ia32-msvc.node')
81
+ )
82
+ try {
83
+ if (localFileExisted) {
84
+ nativeBinding = require('./lunarbase-pmm-math.win32-ia32-msvc.node')
85
+ } else {
86
+ nativeBinding = require('@lunarbase-lab/pmm-math-win32-ia32-msvc')
87
+ }
88
+ } catch (e) {
89
+ loadError = e
90
+ }
91
+ break
92
+ case 'arm64':
93
+ localFileExisted = existsSync(
94
+ join(__dirname, 'lunarbase-pmm-math.win32-arm64-msvc.node')
95
+ )
96
+ try {
97
+ if (localFileExisted) {
98
+ nativeBinding = require('./lunarbase-pmm-math.win32-arm64-msvc.node')
99
+ } else {
100
+ nativeBinding = require('@lunarbase-lab/pmm-math-win32-arm64-msvc')
101
+ }
102
+ } catch (e) {
103
+ loadError = e
104
+ }
105
+ break
106
+ default:
107
+ throw new Error(`Unsupported architecture on Windows: ${arch}`)
108
+ }
109
+ break
110
+ case 'darwin':
111
+ localFileExisted = existsSync(join(__dirname, 'lunarbase-pmm-math.darwin-universal.node'))
112
+ try {
113
+ if (localFileExisted) {
114
+ nativeBinding = require('./lunarbase-pmm-math.darwin-universal.node')
115
+ } else {
116
+ nativeBinding = require('@lunarbase-lab/pmm-math-darwin-universal')
117
+ }
118
+ break
119
+ } catch {}
120
+ switch (arch) {
121
+ case 'x64':
122
+ localFileExisted = existsSync(join(__dirname, 'lunarbase-pmm-math.darwin-x64.node'))
123
+ try {
124
+ if (localFileExisted) {
125
+ nativeBinding = require('./lunarbase-pmm-math.darwin-x64.node')
126
+ } else {
127
+ nativeBinding = require('@lunarbase-lab/pmm-math-darwin-x64')
128
+ }
129
+ } catch (e) {
130
+ loadError = e
131
+ }
132
+ break
133
+ case 'arm64':
134
+ localFileExisted = existsSync(
135
+ join(__dirname, 'lunarbase-pmm-math.darwin-arm64.node')
136
+ )
137
+ try {
138
+ if (localFileExisted) {
139
+ nativeBinding = require('./lunarbase-pmm-math.darwin-arm64.node')
140
+ } else {
141
+ nativeBinding = require('@lunarbase-lab/pmm-math-darwin-arm64')
142
+ }
143
+ } catch (e) {
144
+ loadError = e
145
+ }
146
+ break
147
+ default:
148
+ throw new Error(`Unsupported architecture on macOS: ${arch}`)
149
+ }
150
+ break
151
+ case 'freebsd':
152
+ if (arch !== 'x64') {
153
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
154
+ }
155
+ localFileExisted = existsSync(join(__dirname, 'lunarbase-pmm-math.freebsd-x64.node'))
156
+ try {
157
+ if (localFileExisted) {
158
+ nativeBinding = require('./lunarbase-pmm-math.freebsd-x64.node')
159
+ } else {
160
+ nativeBinding = require('@lunarbase-lab/pmm-math-freebsd-x64')
161
+ }
162
+ } catch (e) {
163
+ loadError = e
164
+ }
165
+ break
166
+ case 'linux':
167
+ switch (arch) {
168
+ case 'x64':
169
+ if (isMusl()) {
170
+ localFileExisted = existsSync(
171
+ join(__dirname, 'lunarbase-pmm-math.linux-x64-musl.node')
172
+ )
173
+ try {
174
+ if (localFileExisted) {
175
+ nativeBinding = require('./lunarbase-pmm-math.linux-x64-musl.node')
176
+ } else {
177
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-x64-musl')
178
+ }
179
+ } catch (e) {
180
+ loadError = e
181
+ }
182
+ } else {
183
+ localFileExisted = existsSync(
184
+ join(__dirname, 'lunarbase-pmm-math.linux-x64-gnu.node')
185
+ )
186
+ try {
187
+ if (localFileExisted) {
188
+ nativeBinding = require('./lunarbase-pmm-math.linux-x64-gnu.node')
189
+ } else {
190
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-x64-gnu')
191
+ }
192
+ } catch (e) {
193
+ loadError = e
194
+ }
195
+ }
196
+ break
197
+ case 'arm64':
198
+ if (isMusl()) {
199
+ localFileExisted = existsSync(
200
+ join(__dirname, 'lunarbase-pmm-math.linux-arm64-musl.node')
201
+ )
202
+ try {
203
+ if (localFileExisted) {
204
+ nativeBinding = require('./lunarbase-pmm-math.linux-arm64-musl.node')
205
+ } else {
206
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-arm64-musl')
207
+ }
208
+ } catch (e) {
209
+ loadError = e
210
+ }
211
+ } else {
212
+ localFileExisted = existsSync(
213
+ join(__dirname, 'lunarbase-pmm-math.linux-arm64-gnu.node')
214
+ )
215
+ try {
216
+ if (localFileExisted) {
217
+ nativeBinding = require('./lunarbase-pmm-math.linux-arm64-gnu.node')
218
+ } else {
219
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-arm64-gnu')
220
+ }
221
+ } catch (e) {
222
+ loadError = e
223
+ }
224
+ }
225
+ break
226
+ case 'arm':
227
+ if (isMusl()) {
228
+ localFileExisted = existsSync(
229
+ join(__dirname, 'lunarbase-pmm-math.linux-arm-musleabihf.node')
230
+ )
231
+ try {
232
+ if (localFileExisted) {
233
+ nativeBinding = require('./lunarbase-pmm-math.linux-arm-musleabihf.node')
234
+ } else {
235
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-arm-musleabihf')
236
+ }
237
+ } catch (e) {
238
+ loadError = e
239
+ }
240
+ } else {
241
+ localFileExisted = existsSync(
242
+ join(__dirname, 'lunarbase-pmm-math.linux-arm-gnueabihf.node')
243
+ )
244
+ try {
245
+ if (localFileExisted) {
246
+ nativeBinding = require('./lunarbase-pmm-math.linux-arm-gnueabihf.node')
247
+ } else {
248
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-arm-gnueabihf')
249
+ }
250
+ } catch (e) {
251
+ loadError = e
252
+ }
253
+ }
254
+ break
255
+ case 'riscv64':
256
+ if (isMusl()) {
257
+ localFileExisted = existsSync(
258
+ join(__dirname, 'lunarbase-pmm-math.linux-riscv64-musl.node')
259
+ )
260
+ try {
261
+ if (localFileExisted) {
262
+ nativeBinding = require('./lunarbase-pmm-math.linux-riscv64-musl.node')
263
+ } else {
264
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-riscv64-musl')
265
+ }
266
+ } catch (e) {
267
+ loadError = e
268
+ }
269
+ } else {
270
+ localFileExisted = existsSync(
271
+ join(__dirname, 'lunarbase-pmm-math.linux-riscv64-gnu.node')
272
+ )
273
+ try {
274
+ if (localFileExisted) {
275
+ nativeBinding = require('./lunarbase-pmm-math.linux-riscv64-gnu.node')
276
+ } else {
277
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-riscv64-gnu')
278
+ }
279
+ } catch (e) {
280
+ loadError = e
281
+ }
282
+ }
283
+ break
284
+ case 's390x':
285
+ localFileExisted = existsSync(
286
+ join(__dirname, 'lunarbase-pmm-math.linux-s390x-gnu.node')
287
+ )
288
+ try {
289
+ if (localFileExisted) {
290
+ nativeBinding = require('./lunarbase-pmm-math.linux-s390x-gnu.node')
291
+ } else {
292
+ nativeBinding = require('@lunarbase-lab/pmm-math-linux-s390x-gnu')
293
+ }
294
+ } catch (e) {
295
+ loadError = e
296
+ }
297
+ break
298
+ default:
299
+ throw new Error(`Unsupported architecture on Linux: ${arch}`)
300
+ }
301
+ break
302
+ default:
303
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
304
+ }
305
+
306
+ if (!nativeBinding) {
307
+ if (loadError) {
308
+ throw loadError
309
+ }
310
+ throw new Error(`Failed to load native binding`)
311
+ }
312
+
313
+ const { quoteXToY, quoteYToX } = nativeBinding
314
+
315
+ module.exports.quoteXToY = quoteXToY
316
+ module.exports.quoteYToX = quoteYToX
package/index.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ export interface QuoteParams {
7
+ /** sqrtPriceX48 as decimal or hex string */
8
+ sqrtPriceX48: string
9
+ /** anchor sqrtPriceX48 as decimal or hex string. Defaults to sqrtPriceX48 when omitted. */
10
+ anchorSqrtPriceX48?: string
11
+ /** fee charged on Y → X swaps in Q24 (uint24). */
12
+ feeAskX24: number
13
+ /** fee charged on X → Y swaps in Q24 (uint24). */
14
+ feeBidX24: number
15
+ /** reserve X as decimal or hex string */
16
+ reserveX: string
17
+ /** reserve Y as decimal or hex string */
18
+ reserveY: string
19
+ /** concentration multiplier in Q20.12 (uint32). Effective K = concentration_k_q12 / 2^12. */
20
+ concentrationKQ12: number
21
+ /** input amount as decimal or hex string */
22
+ amountIn: string
23
+ }
24
+ export interface QuoteResult {
25
+ /** output amount as decimal string */
26
+ amountOut: string
27
+ /** new sqrt price as decimal string */
28
+ sqrtPriceNext: string
29
+ /** fee amount as decimal string */
30
+ fee: string
31
+ }
32
+ export declare function quoteXToY(params: QuoteParams): QuoteResult
33
+ export declare function quoteYToX(params: QuoteParams): QuoteResult
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@lunarbase-lab/pmm-math",
3
+ "version": "0.1.0",
4
+ "description": "N-API binding exposing lunarbase-pmm-math to Node.js. Bit-exact mirror of the on-chain LunarBase Curve PMM quoting math.",
5
+ "license": "MIT OR Apache-2.0",
6
+ "type": "module",
7
+ "main": "wrapper.js",
8
+ "types": "index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./wrapper.js",
12
+ "require": "./index.cjs",
13
+ "types": "./index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "wrapper.js",
18
+ "index.cjs",
19
+ "index.d.ts",
20
+ "README.md"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/Lunarbase-Lab/lunarbase-pmm-math.git",
25
+ "directory": "math/rust-node/lunarbase-pmm-math-node"
26
+ },
27
+ "homepage": "https://github.com/Lunarbase-Lab/lunarbase-pmm-math#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/Lunarbase-Lab/lunarbase-pmm-math/issues"
30
+ },
31
+ "keywords": [
32
+ "lunarbase",
33
+ "pmm",
34
+ "amm",
35
+ "defi",
36
+ "napi",
37
+ "rust"
38
+ ],
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "registry": "https://registry.npmjs.org/"
42
+ },
43
+ "napi": {
44
+ "name": "lunarbase-pmm-math",
45
+ "triples": {
46
+ "defaults": false,
47
+ "additional": [
48
+ "aarch64-apple-darwin",
49
+ "x86_64-unknown-linux-gnu"
50
+ ]
51
+ }
52
+ },
53
+ "optionalDependencies": {
54
+ "@lunarbase-lab/pmm-math-darwin-arm64": "0.1.0",
55
+ "@lunarbase-lab/pmm-math-linux-x64-gnu": "0.1.0"
56
+ },
57
+ "scripts": {
58
+ "build": "CARGO_TARGET_DIR=target napi build --platform --release && mv -f index.js index.cjs",
59
+ "build:debug": "CARGO_TARGET_DIR=target napi build --platform && mv -f index.js index.cjs",
60
+ "artifacts": "napi artifacts",
61
+ "test": "node --test test/quote.test.mjs",
62
+ "prepublishOnly": "napi prepublish -t npm --skip-gh-release"
63
+ },
64
+ "devDependencies": {
65
+ "@napi-rs/cli": "^2.18.4"
66
+ },
67
+ "engines": {
68
+ "node": ">=18"
69
+ }
70
+ }
package/wrapper.js ADDED
@@ -0,0 +1,9 @@
1
+ // ESM wrapper for the napi-rs native module.
2
+ // index.js is CJS (auto-generated by napi-rs), so we re-export via createRequire.
3
+ import { createRequire } from "node:module";
4
+
5
+ const require = createRequire(import.meta.url);
6
+ const binding = require("./index.cjs");
7
+
8
+ export const quoteXToY = binding.quoteXToY;
9
+ export const quoteYToX = binding.quoteYToX;