@w3lib/solana-batch-call 0.3.0 → 0.5.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/CHANGELOG.md +43 -0
- package/README.md +304 -3
- package/dist/address.d.ts +2 -0
- package/dist/address.d.ts.map +1 -1
- package/dist/address.js +8 -0
- package/dist/address.js.map +1 -1
- package/dist/approvals.d.ts +129 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +221 -0
- package/dist/approvals.js.map +1 -0
- package/dist/fees.d.ts +89 -0
- package/dist/fees.d.ts.map +1 -0
- package/dist/fees.js +166 -0
- package/dist/fees.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +2 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +2 -2
- package/dist/layout.js.map +1 -1
- package/dist/liquidity/amm.d.ts +7 -0
- package/dist/liquidity/amm.d.ts.map +1 -0
- package/dist/liquidity/amm.js +307 -0
- package/dist/liquidity/amm.js.map +1 -0
- package/dist/liquidity/clmm.d.ts +18 -0
- package/dist/liquidity/clmm.d.ts.map +1 -0
- package/dist/liquidity/clmm.js +85 -0
- package/dist/liquidity/clmm.js.map +1 -0
- package/dist/liquidity/common.d.ts +94 -0
- package/dist/liquidity/common.d.ts.map +1 -0
- package/dist/liquidity/common.js +228 -0
- package/dist/liquidity/common.js.map +1 -0
- package/dist/liquidity/index.d.ts +34 -0
- package/dist/liquidity/index.d.ts.map +1 -0
- package/dist/liquidity/index.js +157 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/liquidity/orca.d.ts +6 -0
- package/dist/liquidity/orca.d.ts.map +1 -0
- package/dist/liquidity/orca.js +303 -0
- package/dist/liquidity/orca.js.map +1 -0
- package/dist/liquidity/raydiumClmm.d.ts +6 -0
- package/dist/liquidity/raydiumClmm.d.ts.map +1 -0
- package/dist/liquidity/raydiumClmm.js +307 -0
- package/dist/liquidity/raydiumClmm.js.map +1 -0
- package/dist/liquidity/types.d.ts +150 -0
- package/dist/liquidity/types.d.ts.map +1 -0
- package/dist/liquidity/types.js +2 -0
- package/dist/liquidity/types.js.map +1 -0
- package/dist/lp.d.ts +53 -15
- package/dist/lp.d.ts.map +1 -1
- package/dist/lp.js +15 -38
- package/dist/lp.js.map +1 -1
- package/dist/lpMath.d.ts +45 -0
- package/dist/lpMath.d.ts.map +1 -1
- package/dist/lpMath.js +189 -0
- package/dist/lpMath.js.map +1 -1
- package/dist/names.d.ts +68 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +257 -0
- package/dist/names.js.map +1 -0
- package/dist/pools.d.ts +9 -0
- package/dist/pools.d.ts.map +1 -0
- package/dist/pools.js +45 -0
- package/dist/pools.js.map +1 -0
- package/dist/portfolio.d.ts +64 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +57 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/price.d.ts +90 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +287 -0
- package/dist/price.js.map +1 -0
- package/dist/risk.d.ts +84 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +211 -0
- package/dist/risk.js.map +1 -0
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +33 -9
- package/dist/rpc.js.map +1 -1
- package/dist/subpaths/approvals.d.ts +29 -0
- package/dist/subpaths/approvals.d.ts.map +1 -0
- package/dist/subpaths/approvals.js +30 -0
- package/dist/subpaths/approvals.js.map +1 -0
- package/dist/subpaths/fees.d.ts +23 -0
- package/dist/subpaths/fees.d.ts.map +1 -0
- package/dist/subpaths/fees.js +25 -0
- package/dist/subpaths/fees.js.map +1 -0
- package/dist/subpaths/liquidity.d.ts +23 -0
- package/dist/subpaths/liquidity.d.ts.map +1 -0
- package/dist/subpaths/liquidity.js +19 -0
- package/dist/subpaths/liquidity.js.map +1 -0
- package/dist/subpaths/lp.d.ts +1 -1
- package/dist/subpaths/lp.d.ts.map +1 -1
- package/dist/subpaths/lp.js +1 -1
- package/dist/subpaths/lp.js.map +1 -1
- package/dist/subpaths/names.d.ts +37 -0
- package/dist/subpaths/names.d.ts.map +1 -0
- package/dist/subpaths/names.js +27 -0
- package/dist/subpaths/names.js.map +1 -0
- package/dist/subpaths/price.d.ts +40 -0
- package/dist/subpaths/price.d.ts.map +1 -0
- package/dist/subpaths/price.js +43 -0
- package/dist/subpaths/price.js.map +1 -0
- package/dist/subpaths/risk.d.ts +28 -0
- package/dist/subpaths/risk.d.ts.map +1 -0
- package/dist/subpaths/risk.js +30 -0
- package/dist/subpaths/risk.js.map +1 -0
- package/dist/subpaths/swap.d.ts +22 -0
- package/dist/subpaths/swap.d.ts.map +1 -0
- package/dist/subpaths/swap.js +21 -0
- package/dist/subpaths/swap.js.map +1 -0
- package/dist/subpaths/write.d.ts +1 -1
- package/dist/subpaths/write.d.ts.map +1 -1
- package/dist/subpaths/write.js +1 -1
- package/dist/subpaths/write.js.map +1 -1
- package/dist/swap/amm.d.ts +20 -0
- package/dist/swap/amm.d.ts.map +1 -0
- package/dist/swap/amm.js +77 -0
- package/dist/swap/amm.js.map +1 -0
- package/dist/swap/clmmMath.d.ts +24 -0
- package/dist/swap/clmmMath.d.ts.map +1 -0
- package/dist/swap/clmmMath.js +82 -0
- package/dist/swap/clmmMath.js.map +1 -0
- package/dist/swap/common.d.ts +68 -0
- package/dist/swap/common.d.ts.map +1 -0
- package/dist/swap/common.js +65 -0
- package/dist/swap/common.js.map +1 -0
- package/dist/swap/cpmm.d.ts +28 -0
- package/dist/swap/cpmm.d.ts.map +1 -0
- package/dist/swap/cpmm.js +113 -0
- package/dist/swap/cpmm.js.map +1 -0
- package/dist/swap/index.d.ts +145 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +349 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/orca.d.ts +50 -0
- package/dist/swap/orca.d.ts.map +1 -0
- package/dist/swap/orca.js +382 -0
- package/dist/swap/orca.js.map +1 -0
- package/dist/swap/raydiumClmm.d.ts +62 -0
- package/dist/swap/raydiumClmm.d.ts.map +1 -0
- package/dist/swap/raydiumClmm.js +447 -0
- package/dist/swap/raydiumClmm.js.map +1 -0
- package/dist/tradeCheck.d.ts +45 -0
- package/dist/tradeCheck.d.ts.map +1 -0
- package/dist/tradeCheck.js +131 -0
- package/dist/tradeCheck.js.map +1 -0
- package/dist/write/instructions.d.ts +7 -0
- package/dist/write/instructions.d.ts.map +1 -1
- package/dist/write/instructions.js +24 -1
- package/dist/write/instructions.js.map +1 -1
- package/dist/write/transaction.d.ts +23 -0
- package/dist/write/transaction.d.ts.map +1 -1
- package/dist/write/transaction.js +50 -0
- package/dist/write/transaction.js.map +1 -1
- package/package.json +41 -2
- package/src/address.ts +9 -0
- package/src/approvals.ts +358 -0
- package/src/fees.ts +259 -0
- package/src/index.ts +1 -1
- package/src/layout.ts +2 -2
- package/src/liquidity/amm.ts +353 -0
- package/src/liquidity/clmm.ts +108 -0
- package/src/liquidity/common.ts +285 -0
- package/src/liquidity/index.ts +177 -0
- package/src/liquidity/orca.ts +344 -0
- package/src/liquidity/raydiumClmm.ts +348 -0
- package/src/liquidity/types.ts +158 -0
- package/src/lp.ts +17 -52
- package/src/lpMath.ts +215 -0
- package/src/names.ts +329 -0
- package/src/pools.ts +43 -0
- package/src/portfolio.ts +124 -0
- package/src/price.ts +366 -0
- package/src/risk.ts +243 -0
- package/src/rpc.ts +36 -9
- package/src/subpaths/approvals.ts +47 -0
- package/src/subpaths/fees.ts +41 -0
- package/src/subpaths/liquidity.ts +45 -0
- package/src/subpaths/lp.ts +9 -0
- package/src/subpaths/names.ts +45 -0
- package/src/subpaths/price.ts +62 -0
- package/src/subpaths/risk.ts +36 -0
- package/src/subpaths/swap.ts +41 -0
- package/src/subpaths/write.ts +2 -0
- package/src/swap/amm.ts +88 -0
- package/src/swap/clmmMath.ts +96 -0
- package/src/swap/common.ts +113 -0
- package/src/swap/cpmm.ts +132 -0
- package/src/swap/index.ts +467 -0
- package/src/swap/orca.ts +397 -0
- package/src/swap/raydiumClmm.ts +464 -0
- package/src/tradeCheck.ts +166 -0
- package/src/write/instructions.ts +26 -1
- package/src/write/transaction.ts +62 -0
package/dist/lpMath.d.ts
CHANGED
|
@@ -34,4 +34,49 @@ export declare function getFeesOwed(owed: bigint, liquidity: bigint, growthInsid
|
|
|
34
34
|
export declare function sqrtPriceToPrice(sqrtPrice: bigint, decimals0: number, decimals1: number): number;
|
|
35
35
|
/** tick → token1 / token0 的价格(1.0001^tick,按精度换算,只用于展示) */
|
|
36
36
|
export declare function tickToPrice(tick: number, decimals0: number, decimals1: number): number;
|
|
37
|
+
/** 两个程序允许的 sqrt 价格范围(Raydium:MIN / MAX_SQRT_PRICE_X64;Orca:MIN / MAX_SQRT_PRICE) */
|
|
38
|
+
export declare const RAYDIUM_MIN_SQRT_PRICE = 4295048016n;
|
|
39
|
+
export declare const RAYDIUM_MAX_SQRT_PRICE = 79226673521066979257578248091n;
|
|
40
|
+
export declare const ORCA_MIN_SQRT_PRICE = 4295048016n;
|
|
41
|
+
export declare const ORCA_MAX_SQRT_PRICE = 79226673515401279992447579055n;
|
|
42
|
+
export type ClmmProgram = 'raydium' | 'orca';
|
|
43
|
+
/** tick → sqrt 价格(按程序) */
|
|
44
|
+
export declare function sqrtPriceAtTick(program: ClmmProgram, tick: number): bigint;
|
|
45
|
+
/** sqrt 价格 → tick:满足 sqrtPriceAtTick(tick) <= sqrtPrice 的最大 tick(二分查找,与程序的 get_tick_at_sqrt_price 一致),限制在 [MIN_TICK, MAX_TICK] 内 */
|
|
46
|
+
export declare function tickAtSqrtPrice(program: ClmmProgram, sqrtPrice: bigint): number;
|
|
47
|
+
/** 向上取整的整数除法 */
|
|
48
|
+
export declare const ceilDiv: (a: bigint, b: bigint) => bigint;
|
|
49
|
+
/** 添加流动性 L 时程序收取的两种代币数量(向上取整;按当前 tick 判断区间,与程序一致) */
|
|
50
|
+
export declare function getMintAmounts(tick: number, sqrtPrice: bigint, sqrtLower: bigint, sqrtUpper: bigint, liquidity: bigint, tickLower: number, tickUpper: number): [bigint, bigint];
|
|
51
|
+
/** 区间 [a, b] 内 amount0 个 token0 对应的流动性(向下取整):amount0 · (a · b / 2^64) / (b − a) */
|
|
52
|
+
export declare function getLiquidityForAmount0(a: bigint, b: bigint, amount0: bigint): bigint;
|
|
53
|
+
/** 区间 [a, b] 内 amount1 个 token1 对应的流动性(向下取整):amount1 · 2^64 / (b − a) */
|
|
54
|
+
export declare function getLiquidityForAmount1(a: bigint, b: bigint, amount1: bigint): bigint;
|
|
55
|
+
/**
|
|
56
|
+
* 最多用 amount0 / amount1 时能添加的流动性:两边都给时取较小的;只给一边时只按这一边算(另一边要多少由 getMintAmounts 算)。
|
|
57
|
+
* 区间在当前价格之外时只需要一种代币,给的是另一种时返回 0
|
|
58
|
+
*/
|
|
59
|
+
export declare function getLiquidityForAmounts(tick: number, sqrtPrice: bigint, sqrtLower: bigint, sqrtUpper: bigint, amount0: bigint | undefined, amount1: bigint | undefined, tickLower: number, tickUpper: number): bigint;
|
|
60
|
+
/** 整数平方根(向下取整,牛顿迭代从不小于平方根的值开始) */
|
|
61
|
+
export declare function sqrtBigInt(value: bigint): bigint;
|
|
62
|
+
/** 十进制数('1.5'、'2e-7'、1.5)→ 分子 / 分母,精确,不经过浮点 */
|
|
63
|
+
export declare function parseDecimal(value: string | number): {
|
|
64
|
+
num: bigint;
|
|
65
|
+
den: bigint;
|
|
66
|
+
};
|
|
67
|
+
/** 价格(token1 / token0,按精度换算)→ Q64.64 sqrt 价格(向下取整);num / den 是价格的分子分母 */
|
|
68
|
+
export declare function ratioToSqrtPrice(num: bigint, den: bigint, decimals0: number, decimals1: number): bigint;
|
|
69
|
+
/** 价格(token1 / token0,按精度换算)→ tick(按程序;满足价格 >= tick 价格的最大 tick) */
|
|
70
|
+
export declare function priceToTick(program: ClmmProgram, price: string | number, decimals0: number, decimals1: number): number;
|
|
71
|
+
/** 最近的可用 tick(tickSpacing 的整数倍),限制在 [MIN_TICK, MAX_TICK] 内 */
|
|
72
|
+
export declare function nearestUsableTick(tick: number, tickSpacing: number): number;
|
|
73
|
+
/** 价格按 slippage 上下浮动后的 sqrt 价格和对应的 tick,限制在程序允许的范围内(slippage 是比例,精确到百万分之一) */
|
|
74
|
+
export declare function sqrtPriceBounds(program: ClmmProgram, sqrtPrice: bigint, slippage: number): Array<{
|
|
75
|
+
sqrtPrice: bigint;
|
|
76
|
+
tick: number;
|
|
77
|
+
}>;
|
|
78
|
+
/** 价格在 slippage 范围内变动时,流动性 L 至少对应多少代币(移除时的最小数量,向下取整) */
|
|
79
|
+
export declare function getMinAmounts(program: ClmmProgram, sqrtPrice: bigint, tickLower: number, tickUpper: number, liquidity: bigint, slippage: number): [bigint, bigint];
|
|
80
|
+
/** 价格在 slippage 范围内变动时,添加流动性 L 最多需要多少代币(amountMax,向上取整) */
|
|
81
|
+
export declare function getMaxAmounts(program: ClmmProgram, sqrtPrice: bigint, tickLower: number, tickUpper: number, liquidity: bigint, slippage: number): [bigint, bigint];
|
|
37
82
|
//# sourceMappingURL=lpMath.d.ts.map
|
package/dist/lpMath.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lpMath.d.ts","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,QAAQ,UAAU,CAAA;AAC/B,eAAO,MAAM,QAAQ,SAAS,CAAA;AA+B9B,0CAA0C;AAC1C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3D;AA8CD,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWvL;AAcD,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,CAAC,MAAM,EAAE,MAAM,CAAC,CAYlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAG7G;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIhG;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtF"}
|
|
1
|
+
{"version":3,"file":"lpMath.d.ts","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"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"}
|
package/dist/lpMath.js
CHANGED
|
@@ -173,4 +173,193 @@ export function sqrtPriceToPrice(sqrtPrice, decimals0, decimals1) {
|
|
|
173
173
|
export function tickToPrice(tick, decimals0, decimals1) {
|
|
174
174
|
return 1.0001 ** tick * 10 ** (decimals0 - decimals1);
|
|
175
175
|
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// 添加 / 移除流动性用到的计算(两个程序公式相同,tick ↔ 价格按各自的换算)
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
/** 两个程序允许的 sqrt 价格范围(Raydium:MIN / MAX_SQRT_PRICE_X64;Orca:MIN / MAX_SQRT_PRICE) */
|
|
180
|
+
export const RAYDIUM_MIN_SQRT_PRICE = 4295048016n;
|
|
181
|
+
export const RAYDIUM_MAX_SQRT_PRICE = 79226673521066979257578248091n;
|
|
182
|
+
export const ORCA_MIN_SQRT_PRICE = 4295048016n;
|
|
183
|
+
export const ORCA_MAX_SQRT_PRICE = 79226673515401279992447579055n;
|
|
184
|
+
const sqrtAtTick = (program) => (program === 'raydium' ? raydiumSqrtPriceAtTick : orcaSqrtPriceAtTick);
|
|
185
|
+
const sqrtRange = (program) => (program === 'raydium' ? [RAYDIUM_MIN_SQRT_PRICE, RAYDIUM_MAX_SQRT_PRICE] : [ORCA_MIN_SQRT_PRICE, ORCA_MAX_SQRT_PRICE]);
|
|
186
|
+
/** tick → sqrt 价格(按程序) */
|
|
187
|
+
export function sqrtPriceAtTick(program, tick) {
|
|
188
|
+
return sqrtAtTick(program)(tick);
|
|
189
|
+
}
|
|
190
|
+
/** sqrt 价格 → tick:满足 sqrtPriceAtTick(tick) <= sqrtPrice 的最大 tick(二分查找,与程序的 get_tick_at_sqrt_price 一致),限制在 [MIN_TICK, MAX_TICK] 内 */
|
|
191
|
+
export function tickAtSqrtPrice(program, sqrtPrice) {
|
|
192
|
+
const at = sqrtAtTick(program);
|
|
193
|
+
if (sqrtPrice < at(MIN_TICK)) {
|
|
194
|
+
return MIN_TICK;
|
|
195
|
+
}
|
|
196
|
+
let lo = MIN_TICK;
|
|
197
|
+
let hi = MAX_TICK;
|
|
198
|
+
while (lo < hi) {
|
|
199
|
+
const mid = Math.floor((lo + hi + 1) / 2);
|
|
200
|
+
if (at(mid) <= sqrtPrice) {
|
|
201
|
+
lo = mid;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
hi = mid - 1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return lo;
|
|
208
|
+
}
|
|
209
|
+
/** 向上取整的整数除法 */
|
|
210
|
+
export const ceilDiv = (a, b) => (a + b - 1n) / b;
|
|
211
|
+
/** 添加流动性 L 时程序收取的 token0(向上取整):ceil(L · 2^64 · (b − a) / (a · b)) */
|
|
212
|
+
function amount0Up(a, b, liquidity) {
|
|
213
|
+
const [lo, hi] = a < b ? [a, b] : [b, a];
|
|
214
|
+
return ceilDiv((liquidity << 64n) * (hi - lo), lo * hi);
|
|
215
|
+
}
|
|
216
|
+
/** 添加流动性 L 时程序收取的 token1(向上取整):ceil(L · (b − a) / 2^64) */
|
|
217
|
+
function amount1Up(a, b, liquidity) {
|
|
218
|
+
const [lo, hi] = a < b ? [a, b] : [b, a];
|
|
219
|
+
return ceilDiv(liquidity * (hi - lo), Q64);
|
|
220
|
+
}
|
|
221
|
+
/** 添加流动性 L 时程序收取的两种代币数量(向上取整;按当前 tick 判断区间,与程序一致) */
|
|
222
|
+
export function getMintAmounts(tick, sqrtPrice, sqrtLower, sqrtUpper, liquidity, tickLower, tickUpper) {
|
|
223
|
+
if (liquidity === 0n) {
|
|
224
|
+
return [0n, 0n];
|
|
225
|
+
}
|
|
226
|
+
if (tick < tickLower) {
|
|
227
|
+
return [amount0Up(sqrtLower, sqrtUpper, liquidity), 0n];
|
|
228
|
+
}
|
|
229
|
+
if (tick < tickUpper) {
|
|
230
|
+
return [amount0Up(sqrtPrice, sqrtUpper, liquidity), amount1Up(sqrtLower, sqrtPrice, liquidity)];
|
|
231
|
+
}
|
|
232
|
+
return [0n, amount1Up(sqrtLower, sqrtUpper, liquidity)];
|
|
233
|
+
}
|
|
234
|
+
/** 区间 [a, b] 内 amount0 个 token0 对应的流动性(向下取整):amount0 · (a · b / 2^64) / (b − a) */
|
|
235
|
+
export function getLiquidityForAmount0(a, b, amount0) {
|
|
236
|
+
const [lo, hi] = a < b ? [a, b] : [b, a];
|
|
237
|
+
return (amount0 * ((lo * hi) / Q64)) / (hi - lo);
|
|
238
|
+
}
|
|
239
|
+
/** 区间 [a, b] 内 amount1 个 token1 对应的流动性(向下取整):amount1 · 2^64 / (b − a) */
|
|
240
|
+
export function getLiquidityForAmount1(a, b, amount1) {
|
|
241
|
+
const [lo, hi] = a < b ? [a, b] : [b, a];
|
|
242
|
+
return (amount1 * Q64) / (hi - lo);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* 最多用 amount0 / amount1 时能添加的流动性:两边都给时取较小的;只给一边时只按这一边算(另一边要多少由 getMintAmounts 算)。
|
|
246
|
+
* 区间在当前价格之外时只需要一种代币,给的是另一种时返回 0
|
|
247
|
+
*/
|
|
248
|
+
export function getLiquidityForAmounts(tick, sqrtPrice, sqrtLower, sqrtUpper, amount0, amount1, tickLower, tickUpper) {
|
|
249
|
+
let l0 = null;
|
|
250
|
+
let l1 = null;
|
|
251
|
+
// 价格正好在下限(tick == tickLower 且 sqrtPrice == sqrtLower)时也只需要 token0:按下方处理,避免除以 0
|
|
252
|
+
if (tick < tickLower || sqrtPrice <= sqrtLower) {
|
|
253
|
+
l0 = amount0 === undefined ? null : getLiquidityForAmount0(sqrtLower, sqrtUpper, amount0);
|
|
254
|
+
l1 = amount1 === undefined ? null : amount0 === undefined ? 0n : null;
|
|
255
|
+
}
|
|
256
|
+
else if (tick < tickUpper && sqrtPrice < sqrtUpper) {
|
|
257
|
+
// 价格正好在上限(向下穿过 tick 后 tick = tickUpper − 1、sqrtPrice = 上限)时只需要 token1:按上方处理
|
|
258
|
+
l0 = amount0 === undefined ? null : getLiquidityForAmount0(sqrtPrice, sqrtUpper, amount0);
|
|
259
|
+
l1 = amount1 === undefined ? null : getLiquidityForAmount1(sqrtLower, sqrtPrice, amount1);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
l1 = amount1 === undefined ? null : getLiquidityForAmount1(sqrtLower, sqrtUpper, amount1);
|
|
263
|
+
l0 = amount0 === undefined ? null : amount1 === undefined ? 0n : null;
|
|
264
|
+
}
|
|
265
|
+
if (l0 === null)
|
|
266
|
+
return l1 ?? 0n;
|
|
267
|
+
if (l1 === null)
|
|
268
|
+
return l0;
|
|
269
|
+
return l0 < l1 ? l0 : l1;
|
|
270
|
+
}
|
|
271
|
+
/** 整数平方根(向下取整,牛顿迭代从不小于平方根的值开始) */
|
|
272
|
+
export function sqrtBigInt(value) {
|
|
273
|
+
if (value < 0n) {
|
|
274
|
+
throw new RangeError('square root of a negative number');
|
|
275
|
+
}
|
|
276
|
+
if (value < 2n) {
|
|
277
|
+
return value;
|
|
278
|
+
}
|
|
279
|
+
let x = 1n << BigInt((value.toString(2).length + 1) >> 1);
|
|
280
|
+
for (;;) {
|
|
281
|
+
const y = (x + value / x) >> 1n;
|
|
282
|
+
if (y >= x) {
|
|
283
|
+
return x;
|
|
284
|
+
}
|
|
285
|
+
x = y;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/** 十进制数('1.5'、'2e-7'、1.5)→ 分子 / 分母,精确,不经过浮点 */
|
|
289
|
+
export function parseDecimal(value) {
|
|
290
|
+
const text = typeof value === 'number' ? (Number.isFinite(value) ? String(value) : '') : value.trim();
|
|
291
|
+
const m = /^\+?(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/.exec(text);
|
|
292
|
+
if (!m || (!m[1] && !m[2])) {
|
|
293
|
+
throw new Error(`Invalid number: ${String(value)}`);
|
|
294
|
+
}
|
|
295
|
+
const frac = m[2] ?? '';
|
|
296
|
+
const exp = Number(m[3] ?? 0) - frac.length;
|
|
297
|
+
if (Math.abs(exp) > 400) {
|
|
298
|
+
throw new RangeError(`Number out of range: ${String(value)}`);
|
|
299
|
+
}
|
|
300
|
+
const digits = BigInt(`${m[1] ?? ''}${frac}` || '0');
|
|
301
|
+
return exp >= 0 ? { num: digits * 10n ** BigInt(exp), den: 1n } : { num: digits, den: 10n ** BigInt(-exp) };
|
|
302
|
+
}
|
|
303
|
+
/** 价格(token1 / token0,按精度换算)→ Q64.64 sqrt 价格(向下取整);num / den 是价格的分子分母 */
|
|
304
|
+
export function ratioToSqrtPrice(num, den, decimals0, decimals1) {
|
|
305
|
+
if (num <= 0n || den <= 0n) {
|
|
306
|
+
throw new RangeError('price must be greater than 0');
|
|
307
|
+
}
|
|
308
|
+
const scale = decimals1 - decimals0;
|
|
309
|
+
return sqrtBigInt((num * (scale > 0 ? 10n ** BigInt(scale) : 1n) * 2n ** 128n) / (den * (scale < 0 ? 10n ** BigInt(-scale) : 1n)));
|
|
310
|
+
}
|
|
311
|
+
/** 价格(token1 / token0,按精度换算)→ tick(按程序;满足价格 >= tick 价格的最大 tick) */
|
|
312
|
+
export function priceToTick(program, price, decimals0, decimals1) {
|
|
313
|
+
const { num, den } = parseDecimal(price);
|
|
314
|
+
return tickAtSqrtPrice(program, ratioToSqrtPrice(num, den, decimals0, decimals1));
|
|
315
|
+
}
|
|
316
|
+
/** 最近的可用 tick(tickSpacing 的整数倍),限制在 [MIN_TICK, MAX_TICK] 内 */
|
|
317
|
+
export function nearestUsableTick(tick, tickSpacing) {
|
|
318
|
+
if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) {
|
|
319
|
+
throw new RangeError(`invalid tickSpacing: ${tickSpacing}`);
|
|
320
|
+
}
|
|
321
|
+
const rounded = Math.round(tick / tickSpacing) * tickSpacing;
|
|
322
|
+
if (rounded < MIN_TICK) {
|
|
323
|
+
return rounded + tickSpacing;
|
|
324
|
+
}
|
|
325
|
+
if (rounded > MAX_TICK) {
|
|
326
|
+
return rounded - tickSpacing;
|
|
327
|
+
}
|
|
328
|
+
return rounded;
|
|
329
|
+
}
|
|
330
|
+
/** 价格按 slippage 上下浮动后的 sqrt 价格和对应的 tick,限制在程序允许的范围内(slippage 是比例,精确到百万分之一) */
|
|
331
|
+
export function sqrtPriceBounds(program, sqrtPrice, slippage) {
|
|
332
|
+
if (!(slippage >= 0 && slippage < 1)) {
|
|
333
|
+
throw new RangeError(`slippage must be in [0, 1): ${slippage}`);
|
|
334
|
+
}
|
|
335
|
+
const [min, max] = sqrtRange(program);
|
|
336
|
+
const ppm = BigInt(Math.round(slippage * 1e6));
|
|
337
|
+
const square = sqrtPrice * sqrtPrice;
|
|
338
|
+
return [1000000n - ppm, 1000000n + ppm].map((factor) => {
|
|
339
|
+
let s = sqrtBigInt((square * factor) / 1000000n);
|
|
340
|
+
s = s < min ? min : s >= max ? max - 1n : s;
|
|
341
|
+
return { sqrtPrice: s, tick: tickAtSqrtPrice(program, s) };
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/** 价格在 slippage 范围内变动时,流动性 L 至少对应多少代币(移除时的最小数量,向下取整) */
|
|
345
|
+
export function getMinAmounts(program, sqrtPrice, tickLower, tickUpper, liquidity, slippage) {
|
|
346
|
+
const [lower, upper] = sqrtPriceBounds(program, sqrtPrice, slippage);
|
|
347
|
+
const a = sqrtPriceAtTick(program, tickLower);
|
|
348
|
+
const b = sqrtPriceAtTick(program, tickUpper);
|
|
349
|
+
// token0 随价格上涨而减少,取上限价格时的;token1 取下限价格时的
|
|
350
|
+
return [
|
|
351
|
+
getAmountsForLiquidity(upper.tick, upper.sqrtPrice, a, b, liquidity, tickLower, tickUpper)[0],
|
|
352
|
+
getAmountsForLiquidity(lower.tick, lower.sqrtPrice, a, b, liquidity, tickLower, tickUpper)[1],
|
|
353
|
+
];
|
|
354
|
+
}
|
|
355
|
+
/** 价格在 slippage 范围内变动时,添加流动性 L 最多需要多少代币(amountMax,向上取整) */
|
|
356
|
+
export function getMaxAmounts(program, sqrtPrice, tickLower, tickUpper, liquidity, slippage) {
|
|
357
|
+
const [lower, upper] = sqrtPriceBounds(program, sqrtPrice, slippage);
|
|
358
|
+
const a = sqrtPriceAtTick(program, tickLower);
|
|
359
|
+
const b = sqrtPriceAtTick(program, tickUpper);
|
|
360
|
+
return [
|
|
361
|
+
getMintAmounts(lower.tick, lower.sqrtPrice, a, b, liquidity, tickLower, tickUpper)[0],
|
|
362
|
+
getMintAmounts(upper.tick, upper.sqrtPrice, a, b, liquidity, tickLower, tickUpper)[1],
|
|
363
|
+
];
|
|
364
|
+
}
|
|
176
365
|
//# sourceMappingURL=lpMath.js.map
|
package/dist/lpMath.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lpMath.js","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lpMath.js","sourceRoot":"","sources":["../src/lpMath.ts"],"names":[],"mappings":"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"}
|
package/dist/names.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { RequestOptions, SolanaClient } from './client.js';
|
|
2
|
+
/** SPL Name Service 程序 */
|
|
3
|
+
export declare const NAME_PROGRAM_ID = "namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX";
|
|
4
|
+
/** SNS 顶级域(`.sns`,2026-10 之前叫 `.sol`,链上是同一批账户)的根账户 */
|
|
5
|
+
export declare const SNS_ROOT_DOMAIN = "58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx";
|
|
6
|
+
export interface NamesOptions extends RequestOptions {
|
|
7
|
+
/**
|
|
8
|
+
* 也按 SNS 解析 `.sol` 名字(当作同名的 `.sns`)。默认 false:`.sol` 正在迁到另一个注册服务(SRS),
|
|
9
|
+
* SNS 官方 SDK 从 slot 452,825,395(约 2026-10-15)起不再解析 `.sol`,以后同一个 `.sol` 名字可能属于别人
|
|
10
|
+
*/
|
|
11
|
+
legacySol?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* 域名的 owner 是 PDA(程序账户,不是钱包)时也作为地址返回,默认 false(与官方 SDK 一致:转给 PDA 的资产可能取不出来,address 为 null)
|
|
14
|
+
*/
|
|
15
|
+
allowPda?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 地址的来源(与 SNS 官方 SDK 的解析顺序相同):
|
|
19
|
+
* - nft:域名代币化成了 NFT,地址是 NFT 的持有人(要用 getTokenLargestAccounts 找,节点不支持时 address 为 null)
|
|
20
|
+
* - record-v2 / record-v1:域名设置的 SOL 记录(V2 要求 owner 验证过、没有过期;V1 要求 owner 的签名)
|
|
21
|
+
* - owner:域名的 owner
|
|
22
|
+
*/
|
|
23
|
+
export type NameSource = 'nft' | 'record-v2' | 'record-v1' | 'owner';
|
|
24
|
+
export interface ResolvedName {
|
|
25
|
+
/** 传入的名字(原样) */
|
|
26
|
+
name: string;
|
|
27
|
+
/** 规范化后的名字(小写、去掉空格,后缀为 .sns);名字不合法时为 null */
|
|
28
|
+
normalized: string | null;
|
|
29
|
+
/** 解析出的地址(SOL 记录,没有时为 owner);没有注册、名字不合法、记录不合法时为 null */
|
|
30
|
+
address: string | null;
|
|
31
|
+
/** 域名的 owner(代币化的域名是 NFT 的持有人) */
|
|
32
|
+
owner: string | null;
|
|
33
|
+
source: NameSource | null;
|
|
34
|
+
/** 解析这个名字的服务('sns');名字不归 SNS 管时为 null */
|
|
35
|
+
service: 'sns' | null;
|
|
36
|
+
}
|
|
37
|
+
export interface AddressName {
|
|
38
|
+
/** 传入的地址(原样) */
|
|
39
|
+
address: string;
|
|
40
|
+
/** 主域名(如 'bonfida.sns'),核对过属于这个地址;没有设置或已经转给别人时为 null */
|
|
41
|
+
name: string | null;
|
|
42
|
+
service: 'sns' | null;
|
|
43
|
+
}
|
|
44
|
+
/** 域名对应的名字账户:'bonfida' 或子域名 'sub.bonfida'(不带后缀);子域名的种子是 '\0' + 子域名,parent 是父域名 */
|
|
45
|
+
export declare function snsDomainKey(domain: string): {
|
|
46
|
+
key: string;
|
|
47
|
+
parent: string | null;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 名字 → 地址(一次 getMultipleAccounts 读域名、NFT 记录、两版 SOL 记录;代币化的域名另外找 NFT 持有人)。
|
|
51
|
+
* 解析顺序同官方 SDK:代币化 → NFT 持有人;V2 SOL 记录(验证过、没过期);V1 SOL 记录(owner 签过名);owner(是 PDA 时默认不返回)
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* await resolveNames(client, ['bonfida.sns', 'toly.sns'])
|
|
55
|
+
* // [{ name: 'bonfida.sns', normalized: 'bonfida.sns', address: 'Fw1E…Lb1v', owner: 'Fw1E…Lb1v', source: 'owner', service: 'sns' }, …]
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveNames(client: SolanaClient, names: readonly string[], options?: NamesOptions): Promise<ResolvedName[]>;
|
|
59
|
+
/**
|
|
60
|
+
* 地址 → 主域名:读地址设置的主域名(favourite domain),再读域名和反查记录拼出名字,核对名字确实推导出这个域名账户、
|
|
61
|
+
* 并且域名属于这个地址(owner 是它,或代币化后它持有 NFT)——换了 owner 的旧设置不算。通常两次 getMultipleAccounts(子域名三次)
|
|
62
|
+
*
|
|
63
|
+
* ```ts
|
|
64
|
+
* await lookupAddresses(client, [wallet]) // [{ address: wallet, name: 'bonfida.sns', service: 'sns' }]
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function lookupAddresses(client: SolanaClient, addresses: readonly string[], options?: RequestOptions): Promise<AddressName[]>;
|
|
68
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/D,0BAA0B;AAC1B,eAAO,MAAM,eAAe,gDAAgD,CAAA;AAC5E,sDAAsD;AACtD,eAAO,MAAM,eAAe,iDAAiD,CAAA;AAe7E,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,CAAA;AAEpE,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,wDAAwD;IACxD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,yCAAyC;IACzC,OAAO,EAAE,KAAK,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,KAAK,GAAG,IAAI,CAAA;CACtB;AASD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAUnF;AA4HD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCtI;AAeD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8C9I"}
|
package/dist/names.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 域名解析(子路径 `@w3lib/solana-batch-call/names`):SNS(Solana Name Service,Bonfida),名字 → 地址、地址 → 主域名(反查后核对)。
|
|
3
|
+
* 账户地址都在本地按 PDA 推导,读取合成 getMultipleAccounts,不需要索引节点(代币化的域名除外)
|
|
4
|
+
*/
|
|
5
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
6
|
+
import { decodeAddress, encodeAddress, findProgramAddress, getAssociatedTokenAddress, isAddress, isOnCurve } from './address.js';
|
|
7
|
+
import { TOKEN_PROGRAM_ID } from './constants.js';
|
|
8
|
+
/** SPL Name Service 程序 */
|
|
9
|
+
export const NAME_PROGRAM_ID = 'namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX';
|
|
10
|
+
/** SNS 顶级域(`.sns`,2026-10 之前叫 `.sol`,链上是同一批账户)的根账户 */
|
|
11
|
+
export const SNS_ROOT_DOMAIN = '58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx';
|
|
12
|
+
/** 反查记录的 class(同时是 SNS 注册程序的中心状态账户) */
|
|
13
|
+
const REVERSE_LOOKUP_CLASS = '33m47vH6Eav6jr5Ry86XjhRft2jRBLDnDgPSHoquXi2Z';
|
|
14
|
+
/** V2 记录的 class:sns-records 程序(HP3D4D1Z…)的中心状态 PDA */
|
|
15
|
+
const RECORDS_V2_CLASS = '2pMnqHvei2N5oDcVGCRdZx48gqti199wr5CsyTTafsbo';
|
|
16
|
+
/** 主域名(favourite domain)所在的程序 */
|
|
17
|
+
const PRIMARY_DOMAIN_PROGRAM = '85iDfUvr3HJyLM2zcq5BXSiDvUWfw6cSE1FfNBo8Ap29';
|
|
18
|
+
/** 域名代币化(NFT)程序 */
|
|
19
|
+
const NAME_TOKENIZER_ID = 'nftD3vbNkNqfj2Sd3HZwbpw4BxxKWr4AjGb9X38JeZk';
|
|
20
|
+
/** 名字账户的头部:parent(32)+ owner(32)+ class(32),之后是数据 */
|
|
21
|
+
const HEADER_LEN = 96;
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
const ZERO = new Uint8Array(32);
|
|
24
|
+
const hashName = (name) => sha256(encoder.encode(`SPL Name Service${name}`));
|
|
25
|
+
/** 名字账户:sha256('SPL Name Service' + name)、class、parent 推导的 PDA(没有 class / parent 时用 32 个 0) */
|
|
26
|
+
function nameAccount(name, nameClass, parent) {
|
|
27
|
+
return findProgramAddress([hashName(name), nameClass ? decodeAddress(nameClass) : ZERO, parent ? decodeAddress(parent) : ZERO], NAME_PROGRAM_ID);
|
|
28
|
+
}
|
|
29
|
+
/** 域名对应的名字账户:'bonfida' 或子域名 'sub.bonfida'(不带后缀);子域名的种子是 '\0' + 子域名,parent 是父域名 */
|
|
30
|
+
export function snsDomainKey(domain) {
|
|
31
|
+
const labels = domain.split('.');
|
|
32
|
+
if (labels.length === 2) {
|
|
33
|
+
const parent = nameAccount(labels[1], undefined, SNS_ROOT_DOMAIN);
|
|
34
|
+
return { key: nameAccount(`\0${labels[0]}`, undefined, parent), parent };
|
|
35
|
+
}
|
|
36
|
+
if (labels.length !== 1) {
|
|
37
|
+
throw new Error(`Invalid SNS domain: ${domain}`);
|
|
38
|
+
}
|
|
39
|
+
return { key: nameAccount(domain, undefined, SNS_ROOT_DOMAIN), parent: null };
|
|
40
|
+
}
|
|
41
|
+
/** 反查记录:sha256 的是名字账户地址的 base58,class 是 REVERSE_LOOKUP_CLASS,子域名的 parent 是父域名 */
|
|
42
|
+
function reverseKey(domainKey, parent) {
|
|
43
|
+
return nameAccount(domainKey, REVERSE_LOOKUP_CLASS, parent ?? undefined);
|
|
44
|
+
}
|
|
45
|
+
/** 规范化:小写、去掉首尾空格;只认 name.sns / sub.name.sns(legacySol 时也认 .sol),返回不带后缀的部分 */
|
|
46
|
+
function parseName(name, legacySol) {
|
|
47
|
+
const n = name.trim().toLowerCase();
|
|
48
|
+
const suffix = n.endsWith('.sns') ? '.sns' : legacySol && n.endsWith('.sol') ? '.sol' : null;
|
|
49
|
+
if (!suffix) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const domain = n.slice(0, -suffix.length);
|
|
53
|
+
const labels = domain.split('.');
|
|
54
|
+
if (labels.length > 2 || labels.some((l) => !l || l.includes('\0'))) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return { domain, normalized: `${domain}.sns` };
|
|
58
|
+
}
|
|
59
|
+
function registryOf(account) {
|
|
60
|
+
if (!account || account.owner !== NAME_PROGRAM_ID || account.data.length < HEADER_LEN) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { parent: encodeAddress(account.data.slice(0, 32)), owner: encodeAddress(account.data.slice(32, 64)), data: account.data.slice(HEADER_LEN) };
|
|
64
|
+
}
|
|
65
|
+
/** NftRecord:tag(1)+ nonce(1)+ 名字账户(32)+ owner(32)+ NFT mint(32);tag 2 表示域名正在代币化 */
|
|
66
|
+
function tokenized(account) {
|
|
67
|
+
return !!account && account.owner === NAME_TOKENIZER_ID && account.data[0] === 2;
|
|
68
|
+
}
|
|
69
|
+
const nftRecordKey = (domainKey) => findProgramAddress([encoder.encode('nft_record'), decodeAddress(domainKey)], NAME_TOKENIZER_ID);
|
|
70
|
+
const nftMint = (domainKey) => findProgramAddress([encoder.encode('tokenized_name'), decodeAddress(domainKey)], NAME_TOKENIZER_ID);
|
|
71
|
+
/** 记录账户:V1 的种子是 '\x01' + 记录名,parent 是域名;V2 是 '\x02' + 记录名,class 是 RECORDS_V2_CLASS */
|
|
72
|
+
const recordV1Key = (domainKey, record) => nameAccount(`\x01${record}`, undefined, domainKey);
|
|
73
|
+
const recordV2Key = (domainKey, record) => nameAccount(`\x02${record}`, RECORDS_V2_CLASS, domainKey);
|
|
74
|
+
/** V2 记录的验证方式和对应 id 的长度:0 None,1 Solana(32),2 Ethereum(20),3 UnverifiedSolana(32) */
|
|
75
|
+
const VALIDATION_LENGTH = [0, 32, 20, 32];
|
|
76
|
+
const VALIDATION_SOLANA = 1;
|
|
77
|
+
/**
|
|
78
|
+
* V2 的 SOL 记录(与官方 SDK 相同):数据是 u16 过期验证方式 + u16 关联验证方式 + u32 内容长度,然后是两个验证 id 和内容。
|
|
79
|
+
* 返回记录的地址;记录过期(过期验证的 id 不是当前 owner)时为 undefined(继续看 V1 / owner);记录不合法时为 null(不解析)
|
|
80
|
+
*/
|
|
81
|
+
function solRecordV2(registry, owner) {
|
|
82
|
+
if (!registry || registry.data.length < 8) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const view = new DataView(registry.data.buffer, registry.data.byteOffset, registry.data.byteLength);
|
|
86
|
+
const staleness = view.getUint16(0, true);
|
|
87
|
+
const roa = view.getUint16(2, true);
|
|
88
|
+
const stalenessLength = VALIDATION_LENGTH[staleness];
|
|
89
|
+
const roaLength = VALIDATION_LENGTH[roa];
|
|
90
|
+
if (stalenessLength === undefined || roaLength === undefined) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const body = registry.data.slice(8);
|
|
94
|
+
const content = body.slice(stalenessLength + roaLength);
|
|
95
|
+
if (content.length !== 32 || staleness !== VALIDATION_SOLANA || roa !== VALIDATION_SOLANA) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
if (encodeAddress(body.slice(0, 32)) !== owner) {
|
|
99
|
+
return undefined; // owner 换了:记录过期
|
|
100
|
+
}
|
|
101
|
+
// 关联验证的 id 必须就是内容本身(内容地址签过名)
|
|
102
|
+
return encodeAddress(body.slice(32, 64)) === encodeAddress(content) ? encodeAddress(content) : null;
|
|
103
|
+
}
|
|
104
|
+
/** V1 的 SOL 记录:32 字节地址 + 64 字节 owner 的签名(签的是 hex(地址 ‖ 记录账户地址) 的 UTF-8);签名不对时为 null */
|
|
105
|
+
async function solRecordV1(registry, recordKey, owner) {
|
|
106
|
+
if (!registry || registry.data.length < 96) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const target = registry.data.slice(0, 32);
|
|
110
|
+
const signature = registry.data.slice(32, 96);
|
|
111
|
+
const hex = [...target, ...decodeAddress(recordKey)].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
112
|
+
return (await verifyEd25519(decodeAddress(owner), signature, encoder.encode(hex))) ? encodeAddress(target) : null;
|
|
113
|
+
}
|
|
114
|
+
/** Ed25519 验签(WebCrypto);运行环境不支持时当作验签失败 */
|
|
115
|
+
async function verifyEd25519(publicKey, signature, message) {
|
|
116
|
+
const subtle = globalThis.crypto?.subtle;
|
|
117
|
+
if (!subtle)
|
|
118
|
+
return false;
|
|
119
|
+
try {
|
|
120
|
+
const key = await subtle.importKey('raw', publicKey, { name: 'Ed25519' }, false, ['verify']);
|
|
121
|
+
return await subtle.verify('Ed25519', key, signature, message);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 代币化域名的 NFT 持有人:getTokenLargestAccounts 找到唯一的持有账户,再读出它的 owner(与官方 SDK 相同)。
|
|
129
|
+
* 免费公共节点大多不支持 getTokenLargestAccounts,这时为 null
|
|
130
|
+
*/
|
|
131
|
+
async function nftHolders(client, domainKeys, signal) {
|
|
132
|
+
const largest = await Promise.all(domainKeys.map((key) => client
|
|
133
|
+
.request('getTokenLargestAccounts', [nftMint(key), { commitment: client.commitment }], { signal })
|
|
134
|
+
.then((res) => res.value.find((a) => a.amount === '1')?.address ?? null)
|
|
135
|
+
.catch((err) => {
|
|
136
|
+
if (signal?.aborted)
|
|
137
|
+
throw err;
|
|
138
|
+
return null;
|
|
139
|
+
})));
|
|
140
|
+
const holders = largest.filter((a) => a !== null);
|
|
141
|
+
const accounts = holders.length ? await client.accounts(holders, { signal }) : [];
|
|
142
|
+
const ownerOf = new Map(holders.map((a, i) => [a, accounts[i]?.owner === TOKEN_PROGRAM_ID ? encodeAddress(accounts[i].data.slice(32, 64)) : null]));
|
|
143
|
+
return new Map(domainKeys.map((key, i) => [key, largest[i] ? (ownerOf.get(largest[i]) ?? null) : null]));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 名字 → 地址(一次 getMultipleAccounts 读域名、NFT 记录、两版 SOL 记录;代币化的域名另外找 NFT 持有人)。
|
|
147
|
+
* 解析顺序同官方 SDK:代币化 → NFT 持有人;V2 SOL 记录(验证过、没过期);V1 SOL 记录(owner 签过名);owner(是 PDA 时默认不返回)
|
|
148
|
+
*
|
|
149
|
+
* ```ts
|
|
150
|
+
* await resolveNames(client, ['bonfida.sns', 'toly.sns'])
|
|
151
|
+
* // [{ name: 'bonfida.sns', normalized: 'bonfida.sns', address: 'Fw1E…Lb1v', owner: 'Fw1E…Lb1v', source: 'owner', service: 'sns' }, …]
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export async function resolveNames(client, names, options = {}) {
|
|
155
|
+
const { signal, legacySol = false, allowPda = false } = options;
|
|
156
|
+
const items = names.map((name) => {
|
|
157
|
+
const parsed = parseName(name, legacySol);
|
|
158
|
+
if (!parsed)
|
|
159
|
+
return { name, parsed: null, key: null };
|
|
160
|
+
const { key } = snsDomainKey(parsed.domain);
|
|
161
|
+
return { name, parsed, key, nft: nftRecordKey(key), v1: recordV1Key(key, 'SOL'), v2: recordV2Key(key, 'SOL') };
|
|
162
|
+
});
|
|
163
|
+
const keys = items.flatMap((x) => (x.key ? [x.key, x.nft, x.v1, x.v2] : []));
|
|
164
|
+
const accounts = keys.length ? await client.accounts(keys, { signal }) : [];
|
|
165
|
+
const byKey = new Map(keys.map((k, i) => [k, accounts[i] ?? null]));
|
|
166
|
+
const nfts = items.filter((x) => x.key && registryOf(byKey.get(x.key)) && tokenized(byKey.get(x.nft))).map((x) => x.key);
|
|
167
|
+
const holders = nfts.length ? await nftHolders(client, nfts, signal) : new Map();
|
|
168
|
+
return Promise.all(items.map(async (x) => {
|
|
169
|
+
const base = { name: x.name, normalized: x.parsed?.normalized ?? null, service: x.parsed ? 'sns' : null };
|
|
170
|
+
const registry = x.key ? registryOf(byKey.get(x.key)) : null;
|
|
171
|
+
if (!x.key || !registry) {
|
|
172
|
+
return { ...base, address: null, owner: null, source: null };
|
|
173
|
+
}
|
|
174
|
+
if (holders.has(x.key)) {
|
|
175
|
+
const holder = holders.get(x.key) ?? null;
|
|
176
|
+
return { ...base, address: holder, owner: holder, source: 'nft' };
|
|
177
|
+
}
|
|
178
|
+
const owner = registry.owner;
|
|
179
|
+
const v2 = solRecordV2(registryOf(byKey.get(x.v2)), owner);
|
|
180
|
+
if (v2 !== undefined) {
|
|
181
|
+
return { ...base, address: v2, owner, source: 'record-v2' };
|
|
182
|
+
}
|
|
183
|
+
const v1 = await solRecordV1(registryOf(byKey.get(x.v1)), x.v1, owner);
|
|
184
|
+
if (v1) {
|
|
185
|
+
return { ...base, address: v1, owner, source: 'record-v1' };
|
|
186
|
+
}
|
|
187
|
+
return { ...base, address: allowPda || isOnCurve(decodeAddress(owner)) ? owner : null, owner, source: 'owner' };
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
/** 反查记录的数据:u32 长度 + 名字(子域名的以 \0 开头) */
|
|
191
|
+
function reverseName(account) {
|
|
192
|
+
const registry = registryOf(account);
|
|
193
|
+
if (!registry || registry.data.length < 4) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const length = new DataView(registry.data.buffer, registry.data.byteOffset).getUint32(0, true);
|
|
197
|
+
if (registry.data.length < 4 + length) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
return new TextDecoder().decode(registry.data.slice(4, 4 + length)).replace(/^\0/, '') || null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 地址 → 主域名:读地址设置的主域名(favourite domain),再读域名和反查记录拼出名字,核对名字确实推导出这个域名账户、
|
|
204
|
+
* 并且域名属于这个地址(owner 是它,或代币化后它持有 NFT)——换了 owner 的旧设置不算。通常两次 getMultipleAccounts(子域名三次)
|
|
205
|
+
*
|
|
206
|
+
* ```ts
|
|
207
|
+
* await lookupAddresses(client, [wallet]) // [{ address: wallet, name: 'bonfida.sns', service: 'sns' }]
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
export async function lookupAddresses(client, addresses, options = {}) {
|
|
211
|
+
const { signal } = options;
|
|
212
|
+
const wallets = [...new Set(addresses.filter((a) => isAddress(a)))];
|
|
213
|
+
const primaryKeys = wallets.map((w) => findProgramAddress([encoder.encode('favourite_domain'), decodeAddress(w)], PRIMARY_DOMAIN_PROGRAM));
|
|
214
|
+
const primaries = primaryKeys.length ? await client.accounts(primaryKeys, { signal }) : [];
|
|
215
|
+
// 主域名账户:tag(1)+ 名字账户(32)
|
|
216
|
+
const chosen = wallets.flatMap((wallet, i) => {
|
|
217
|
+
const a = primaries[i];
|
|
218
|
+
return a && a.owner === PRIMARY_DOMAIN_PROGRAM && a.data.length >= 33 ? [{ wallet, domain: encodeAddress(a.data.slice(1, 33)) }] : [];
|
|
219
|
+
});
|
|
220
|
+
// 先按顶级域名读反查记录(大多数情况);是子域名时再读一次
|
|
221
|
+
const round2 = chosen.flatMap((c) => [c.domain, reverseKey(c.domain), getAssociatedTokenAddress(c.wallet, nftMint(c.domain), TOKEN_PROGRAM_ID)]);
|
|
222
|
+
const accounts2 = round2.length ? await client.accounts(round2, { signal }) : [];
|
|
223
|
+
const found = chosen.map((c, i) => ({ ...c, registry: registryOf(accounts2[3 * i]), reverse: accounts2[3 * i + 1] ?? null, nft: accounts2[3 * i + 2] ?? null }));
|
|
224
|
+
const subs = found.filter((f) => f.registry && f.registry.parent !== SNS_ROOT_DOMAIN);
|
|
225
|
+
const round3 = subs.flatMap((f) => [reverseKey(f.domain, f.registry?.parent), reverseKey(f.registry?.parent)]);
|
|
226
|
+
const accounts3 = round3.length ? await client.accounts(round3, { signal }) : [];
|
|
227
|
+
const subNames = new Map(subs.map((f, i) => {
|
|
228
|
+
const [sub, parent] = [reverseName(accounts3[2 * i]), reverseName(accounts3[2 * i + 1])];
|
|
229
|
+
return [f, sub && parent ? `${sub}.${parent}` : null];
|
|
230
|
+
}));
|
|
231
|
+
const names = new Map();
|
|
232
|
+
for (const f of found) {
|
|
233
|
+
if (!f.registry)
|
|
234
|
+
continue;
|
|
235
|
+
const domain = f.registry.parent === SNS_ROOT_DOMAIN ? reverseName(f.reverse) : (subNames.get(f) ?? null);
|
|
236
|
+
if (!domain)
|
|
237
|
+
continue;
|
|
238
|
+
// 正查核对:名字推导出的账户就是主域名指向的账户(反查记录的内容格式不对时不会拼出别的名字)
|
|
239
|
+
let key;
|
|
240
|
+
try {
|
|
241
|
+
key = snsDomainKey(domain).key;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// 代币化的域名:钱包的 ATA 里有这个域名的 NFT(数量 1)
|
|
247
|
+
const holdsNft = !!f.nft && f.nft.owner === TOKEN_PROGRAM_ID && f.nft.data.length >= 72 && new DataView(f.nft.data.buffer, f.nft.data.byteOffset).getBigUint64(64, true) === 1n;
|
|
248
|
+
if (key === f.domain && (f.registry.owner === f.wallet || holdsNft)) {
|
|
249
|
+
names.set(f.wallet, `${domain}.sns`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return addresses.map((address) => {
|
|
253
|
+
const name = names.get(address) ?? null;
|
|
254
|
+
return { address, name, service: name ? 'sns' : null };
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=names.js.map
|