@ninsei-labs/sdk 0.39.0 → 0.39.2

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.
@@ -365,7 +365,16 @@ export const CHAINS = [
365
365
  // селектор predict 0x3d81fc01) и касса 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 (573 байта, но ДРУГОЙ
366
366
  // сборки - keccak 0x5c32bb9c…): её код не совпадал с канонической кассой, и эскроу отверг бы такой ордер
367
367
  // по #122 - поэтому касса развёрнута заново тем же заходом.
368
- escrow: { address: "0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", mode: "live", cashier: "0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f" },
368
+ // ХЕШ КОДА РЕАЛИЗАЦИИ ЭСКРОУ (#114): то, что исполняет клон каждого ордера и что интерфейс обязан
369
+ // сверить сам, а не только довериться фабрике. Значение - keccak256 runtime-кода NinseiEscrow, взято
370
+ // из СВОЕЙ сборки: forge inspect NinseiEscrow deployedBytecode --root mvp/contracts и keccak (совпало
371
+ // с keccak256(type(NinseiEscrow).runtimeCode), которое записывает фабрика, и с артефактом out/).
372
+ // У реализации НЕТ immutables, поэтому это КОНСТАНТА ПРОТОКОЛА - один и тот же хеш в любой сети со
373
+ // сборкой #114. Лежит при сети, а не одним общим числом, потому что политика может отсутствовать: сеть
374
+ // со СТАРОЙ фабрикой (без implementation()) обязана остаться БЕЗ политики, иначе чтение пары откажет и
375
+ // живые котировки этой сети встанут. Так и есть у arbitrum-sepolia: развёрнутая там фабрика сборки #114
376
+ // не знает (оба геттера revert-ят), поэтому у неё поля НЕТ; включается тем же заходом, что и новый деплой.
377
+ escrow: { address: "0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", mode: "live", cashier: "0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f", implementationCodeHash: "0xfd1ef12c1d96d3ee7060bd5901e06108723783403fad00c9630dcdeb6193674b" },
369
378
  // Токенов в песочнице нет: расплата идёт нейтивом. Пустой список - это факт о песочнице, а не забывчивость.
370
379
  tokens: [],
371
380
  // Uniswap в песочнице не развёрнут и не нужен: тут своя цепочка для сквозных прогонов, а DEX-нога
@@ -692,6 +701,18 @@ export function knownFactoryCodesFor(chainOrId) {
692
701
  return list.map((h) => String(h).toLowerCase());
693
702
  }
694
703
 
704
+ // СПИСОК ИЗВЕСТНЫХ СБОРОК РЕАЛИЗАЦИИ ЭСКРОУ - ПОЛИТИКА ИНТЕРФЕЙСА (#114), при самой сети, где живёт адрес
705
+ // фабрики (escrow.address). Хеш её кода - КОНСТАНТА ПРОТОКОЛА (у реализации нет immutables), но политика
706
+ // может быть не задана: у сети без поля implementationCodeHash её НЕТ (старая фабрика пары не отдаёт).
707
+ // Пусто = политики нет; непусто = интерфейс торгует только через фабрики, ведущие на эту сборку.
708
+ export function knownImplementationCodesFor(chainOrId) {
709
+ const id = typeof chainOrId === "string" ? chainOrId : chainOrId && chainOrId.id;
710
+ const chain = CHAINS.find((c) => c.id === id) || chainById(id);
711
+ const pinned = chain && chain.escrow ? chain.escrow.implementationCodeHash : null;
712
+ if (typeof pinned !== "string" || !/^0x[0-9a-fA-F]{64}$/.test(pinned)) return null;
713
+ return [pinned.toLowerCase()];
714
+ }
715
+
695
716
  export function chainById(id) {
696
717
  return CHAINS.find((c) => c.id === id) || CHAINS.find((c) => c.id === DEFAULT_CHAIN) || CHAINS[0];
697
718
  }
@@ -795,7 +816,13 @@ export const API = {
795
816
  // но это только вредило: адреса в мок-режиме выглядели как mainnet (префикс 4), а живая нода -
796
817
  // stagenet (префикс 5), и в одном UI соседствовали две цепи. Смешение цепей в свопе означает
797
818
  // потерянные деньги (см. monero/address.js), поэтому теперь и мок, и живой режим - stagenet.
798
- export const XMR_NETWORKS = { app: "stagenet", mock: "stagenet" };
819
+ //
820
+ // ПЛЮС ЗНАКОМОЕ ИМЯ REGTEST. Ключи app/mock отвечают на вопрос «в какой сети кошелёк этого источника».
821
+ // Третья запись источника не имеет: fakechain - официальное имя regtest-режима monerod, которым нода
822
+ // называет себя на контуре CI. Она нужна, чтобы имя сети ПРИНИМАЛОСЬ: ядро сверяет xmrNetwork со списком
823
+ // сетей движка (sdk/src/config.mjs, STANDARD_XMR_NETWORKS), а адаптер кошелька ядра берёт список сетей
824
+ // из ЭТОГО реестра (sdk/src/adapters/monero-wallet.mjs). Кошелёк демки при этом остаётся stagenet.
825
+ export const XMR_NETWORKS = { app: "stagenet", mock: "stagenet", fakechain: "fakechain" };
799
826
 
800
827
  // Страница sweep: отдельный домен со своей (более строгой) политикой и WASM-кошельком.
801
828
  // Вывод XMR делает сам пользователь там, по своему recovery-файлу - демка за него не подписывает
@@ -1,43 +1,43 @@
1
- // GENERATED FILE - a byte-for-byte copy of the engine module www/js/core/sellWindow.js for the SDK package.
2
- // Edit the source under www/js, then run: node tools/build-sdk-engine.mjs
3
- // tools/check-sdk-engine.mjs reddens on any drift, so a stale copy cannot ship silently.
4
- // Everything below this header is identical to the source.
5
-
6
- // ОКНО ПРОДАЖИ XMR (issue #111): ОДНО ПРАВИЛО НА ДВЕ СТОРОНЫ, А НЕ ДВА ЧИСЛА.
7
- //
8
- // ЗАЧЕМ ОТДЕЛЬНЫЙ МОДУЛЬ. У окна продажи XMR (человек отдаёт XMR, получает натив сети) два числа, и они
9
- // разной природы:
10
- // * ЖЁСТКОЕ (hard) - срок отметки готовности ИЗ КОНТРАКТА. Позже него отметку не примет никто, и он входит
11
- // в ПРИВЯЗКУ ордера (termsHash), поэтому после выдачи билета не меняется. В контракт ВСЕГДА идёт максимум:
12
- // 10 подтверждений Monero - это примерно 1200 с, и меньше контрактного окна быть не может, иначе отметить
13
- // готовность было бы нечем (отметку контракт после readyBy запрещает, XMR заперлись бы для обоих).
14
- // * МЯГКОЕ (soft) - ОБЕЩАНИЕ НА ЭКРАНЕ: сколько провайдер держит цену, пока человек отправляет XMR.
15
- // "Десять минут" владельца и партнёра.
16
- // ПРАВИЛО ПРОДЛЕНИЯ ОДНО. Пока в пуле НЕ видно ПОЛНОЙ ожидаемой суммы, обещание продлевается до контрактного
17
- // максимума: человек мог отправить, и ему нужен первый блок. Как только полная сумма видна в пуле, окно
18
- // мягкое - обещание сдержано, и продлевать нечего.
19
- //
20
- // ПОЧЕМУ ФУНКЦИЯ, А НЕ ДВА ЧИСЛА В ДВУХ МЕСТАХ. Это правило решает НОДА (rfq/reverseArrival.mjs - отметка,
21
- // тревога, ранний возврат) и показывает СТРАНИЦА (www/js/core/swap.js - отсчёт на экране). Вторая редакция
22
- // разошлась бы с первой молча: человек видел бы одно окно, а нода жила бы по другому. Направление импорта
23
- // rfq -> www в проекте уже принято (образец: rfq/reverseGas.mjs импортирует ../www/js/evm/claimGas.js).
24
- export const SELL_WINDOW = {
25
- softSec: 600, // "десять минут": обещание провайдера на экране
26
- hardSec: 1200, // контрактное окно: 10 подтверждений Monero, максимум, попадающий в termsHash
27
- };
28
-
29
- const positiveSec = (v, dflt) => {
30
- const n = Number(v);
31
- return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;
32
- };
33
-
34
- // СКОЛЬКО СЕКУНД ИДЁТ ОКНО ПРОДАЖИ при названном состоянии пула. poolSeen - в пуле видна ПОЛНАЯ ожидаемая
35
- // сумма, и только она (не "что-то видно" и не недоплата: сделка повисла бы на чужой копейке - см. poolCoverage
36
- // в rfq/reverseArrival.mjs). Контрактное окно - ПОТОЛОК: мягкое обещание не может быть длиннее контрактного,
37
- // иначе мы обещали бы то, чего цепь не даст.
38
- export function sellWindowSec({ poolSeen, soft = SELL_WINDOW.softSec, hard = SELL_WINDOW.hardSec } = {}) {
39
- const s = positiveSec(soft, SELL_WINDOW.softSec);
40
- const h = positiveSec(hard, SELL_WINDOW.hardSec);
41
- const promised = Math.min(s, h);
42
- return poolSeen ? promised : h;
43
- }
1
+ // GENERATED FILE - a byte-for-byte copy of the engine module www/js/core/sellWindow.js for the SDK package.
2
+ // Edit the source under www/js, then run: node tools/build-sdk-engine.mjs
3
+ // tools/check-sdk-engine.mjs reddens on any drift, so a stale copy cannot ship silently.
4
+ // Everything below this header is identical to the source.
5
+
6
+ // ОКНО ПРОДАЖИ XMR (issue #111): ОДНО ПРАВИЛО НА ДВЕ СТОРОНЫ, А НЕ ДВА ЧИСЛА.
7
+ //
8
+ // ЗАЧЕМ ОТДЕЛЬНЫЙ МОДУЛЬ. У окна продажи XMR (человек отдаёт XMR, получает натив сети) два числа, и они
9
+ // разной природы:
10
+ // * ЖЁСТКОЕ (hard) - срок отметки готовности ИЗ КОНТРАКТА. Позже него отметку не примет никто, и он входит
11
+ // в ПРИВЯЗКУ ордера (termsHash), поэтому после выдачи билета не меняется. В контракт ВСЕГДА идёт максимум:
12
+ // 10 подтверждений Monero - это примерно 1200 с, и меньше контрактного окна быть не может, иначе отметить
13
+ // готовность было бы нечем (отметку контракт после readyBy запрещает, XMR заперлись бы для обоих).
14
+ // * МЯГКОЕ (soft) - ОБЕЩАНИЕ НА ЭКРАНЕ: сколько провайдер держит цену, пока человек отправляет XMR.
15
+ // "Десять минут" владельца и партнёра.
16
+ // ПРАВИЛО ПРОДЛЕНИЯ ОДНО. Пока в пуле НЕ видно ПОЛНОЙ ожидаемой суммы, обещание продлевается до контрактного
17
+ // максимума: человек мог отправить, и ему нужен первый блок. Как только полная сумма видна в пуле, окно
18
+ // мягкое - обещание сдержано, и продлевать нечего.
19
+ //
20
+ // ПОЧЕМУ ФУНКЦИЯ, А НЕ ДВА ЧИСЛА В ДВУХ МЕСТАХ. Это правило решает НОДА (rfq/reverseArrival.mjs - отметка,
21
+ // тревога, ранний возврат) и показывает СТРАНИЦА (www/js/core/swap.js - отсчёт на экране). Вторая редакция
22
+ // разошлась бы с первой молча: человек видел бы одно окно, а нода жила бы по другому. Направление импорта
23
+ // rfq -> www в проекте уже принято (образец: rfq/reverseGas.mjs импортирует ../www/js/evm/claimGas.js).
24
+ export const SELL_WINDOW = {
25
+ softSec: 600, // "десять минут": обещание провайдера на экране
26
+ hardSec: 1200, // контрактное окно: 10 подтверждений Monero, максимум, попадающий в termsHash
27
+ };
28
+
29
+ const positiveSec = (v, dflt) => {
30
+ const n = Number(v);
31
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : dflt;
32
+ };
33
+
34
+ // СКОЛЬКО СЕКУНД ИДЁТ ОКНО ПРОДАЖИ при названном состоянии пула. poolSeen - в пуле видна ПОЛНАЯ ожидаемая
35
+ // сумма, и только она (не "что-то видно" и не недоплата: сделка повисла бы на чужой копейке - см. poolCoverage
36
+ // в rfq/reverseArrival.mjs). Контрактное окно - ПОТОЛОК: мягкое обещание не может быть длиннее контрактного,
37
+ // иначе мы обещали бы то, чего цепь не даст.
38
+ export function sellWindowSec({ poolSeen, soft = SELL_WINDOW.softSec, hard = SELL_WINDOW.hardSec } = {}) {
39
+ const s = positiveSec(soft, SELL_WINDOW.softSec);
40
+ const h = positiveSec(hard, SELL_WINDOW.hardSec);
41
+ const promised = Math.min(s, h);
42
+ return poolSeen ? promised : h;
43
+ }