تكاملات QoreX (@qorechain/qorex-*)
تكاملات QoreX هي ست حزم npm صغيرة لمطوري dApp الذين يريدون أن تعمل محفظة QoreX في واجهة أمامية على EVM أو Cosmos أو Solana، وللفرق التي تختبر هذه الواجهات. ثلاث منها موصّلات محافظ لمكتبات شائعة (RainbowKit وInterchain Kit وcosmos-kit)، وواحدة تحوي الأنواع المشتركة ودوال الاكتشاف، واثنتان أدوات اختبار (محفظة وهمية وتجهيزات Playwright). جميعها بالإصدار 0.1.0، نُشرت في 27 أكتوبر 2026، بترخيص Apache-2.0.
ما لا تفعله: فهي لا تحتفظ بالمفاتيح، ولا تجعل QoreX أكثر مما هو عليه اليوم. اقرأ الحدود والمشكلات المعروفة قبل أن تبني عليها: فإصدارات المتاجر الحيّة من QoreX تدعم جزءًا مما يمكن ربط هذه الحزم به، والحدود مذكورة هناك.
الابتكارات
- اكتشاف لا يمكن أن يختار المحفظة الخطأ. تعلن QoreX عن نفسها عبر EIP-6963 بالاسم المعكوس للنطاق
network.qore.qorexولا تكتب أبدًا فيwindow.ethereum. تختار@qorechain/qorex-typesالمزوّد بهذا الاسم وحده، وتثبّت محفظة RainbowKit الموصّل على المزوّد المُعلَن ولا تعود أبدًا إلىwindow.ethereum. - المحفظة هي من تبني التوقيع الهجين، والصفحة لا تحمل أبدًا المفتاح ما بعد الكمّي. يحتاج المسار الأصلي لـ QoreChain إلى توقيع secp256k1 إضافة إلى توقيع ML-DSA-87 (FIPS 204). على المزوّد الأصلي (
window.qorex.native) تسلّم الدعوةsignAndBroadcastالرسائل إلى QoreX، التي تبني المعاملة وتوقّعها بالمفتاحين وتبثّها. والنتيجة هيtxHashوcodeوheightوshield، حيث تكونshieldهيshieldedمتى حملت المعاملة المثبَّتة الطبقة الهجينة. - فحوصات القدرات بدل فحوصات الإصدار. تقرأ الحزم قائمة
capabilitiesالخاصة بالمحفظة (hasCapability)، فتُكتشف ميزة مثلsignAndBroadcastولا تُخمَّن من رقم إصدار. - الرفض صريح، برموز ثابتة. يُرفض توقيع Amino عمدًا، لأن Amino JSON لا يستطيع حمل التوقيع الهجين؛ وترمي الموصّلات
QorexIntegrationErrorبرموز مثلQOREX_AMINO_REFUSEDوQOREX_USE_SIGN_AND_BROADCASTوQOREX_NOT_SUPPORTED_YET، وتفحصهاisQorexIntegrationError(err, code). - بديل اختباري يوقّع فعلًا. تحقن
@qorechain/qorex-wallet-mockالكائنات نفسها التي تحقنها QoreX (window.qorex = { evm, native, svm })، وتسجّل محفظة Solana، وتوقّع بالخوارزميات الحقيقية (ML-DSA-87 الهجين عبر QoreSign على المسار الأصلي، وsecp256k1 على EVM، وed25519 على Solana) انطلاقًا من العبارة الاختبارية العامة على الشبكة التجريبية افتراضيًا. وتعلن عن نفسها باسمnetwork.qore.qorex.mock، فلا يستطيع الكود الذي يختار QoreX بصرامة أن يخلطها بالمحفظة. - ملفّا سلوك. يتصرف الملف
currentفي المحاكاة كما تتصرف QoreX الحيّة اليوم؛ ويضيفplannedما أعلن عنه فريق QoreX، فتبني مسبقًا دون أن تدّعي المحاكاة شيئًا لا تفعله المحفظة بعد. - تجهيزات Playwright على طراز Synpress v4 (
qorexMockFixtures) تحقن المحاكاة قبل التنقل، فلا يحتاج اختبار شامل (end-to-end) إلى إضافة متصفح. - حسابات تقودها المحفظة دون أحداث. لأن QoreX لا تُصدر
accountsChangedولاchainChangedبعد، تتضمن محفظة RainbowKit خيارًا اختياريًاpollAccountsOnFocusيعيد قراءةeth_accountsوeth_chainIdعندما تستعيد الصفحة التركيز.
ما تُستخدم من أجله
- dApp على wagmi وRainbowKit يضيف QoreX. أضف
qorexWalletإلى قائمة محافظ RainbowKit وQOREX_CHAINSإلى إعداد wagmi. يتصل المستخدمون الذين لديهم QoreX ويقرأ الـ dApp عنوانهم0xومعرّف السلسلة (9801 أو 9800). أما من لا يملك QoreX فيرى روابط المتاجر. - dApp على Cosmos باستخدام Interchain Kit أو cosmos-kit يضيف QoreX. أضف محفظة QoreX إلى
ChainProviderوأرسل معاملات QoreChain بـqorexSignAndBroadcast: تبني QoreX المعاملة وتضيف التوقيع الهجين وتبثّها، لأن الصفحة لا تستطيع حمل مفتاح ML-DSA-87. - dApp يدعم Keplr أصلًا. يتبع
window.qorex.nativeنمط Keplr (enableوgetKeyوsignDirect)، فالتكامل بضعة أسطر. ويسرد دليل المستودع كل فرق. - اختبارات CI لتدفقات المحفظة دون إضافة. يشغّل فريق الجودة Playwright بـ
qorexMockFixtures({ profile: "current" })، وينقر Connect ويؤكد أن الصفحة تعرضqorex.addresses.evm. وتختبرqorex.rejectNext()مسار الرفض. - البناء مسبقًا لميزات QoreX الجديدة. شغّل المجموعة نفسها بـ
profile: "planned"لتجريب الميزات المعلن عنها (توقيع EVM وأحداث تغيّر الحساب وإضافةsignDirectللطبقة الهجينة) قبل أن تصدرها QoreX. - اختبار بثّ حقيقي على الشبكة التجريبية. بعبارة استعادة تجريبية ممولة خاصة بها، يدع الفريق المحاكاة تنفّذ
signAndBroadcastلمعاملة موقّعة هجينًا إلىqorechain-dianaويفحص النتيجة في الصفحة. - اكتشاف الميزات بدل فحص الإصدار. يعرض dApp زر إرسال على QoreChain عندما تكون
hasCapability(native, "signAndBroadcast")صحيحة، فتفعّل إصدارات QoreX الجديدة الميزات دون تغيير في الـ dApp.
كيف تعمل
- مسار EVM. لا تكتب QoreX أبدًا في
window.ethereum. تعلن عن مزوّد EIP-1193 عبر EIP-6963 بالاسم المعكوس للنطاقnetwork.qore.qorex؛ وتختارqorexWallet()وdiscoverQorexEip1193()هذا المزوّد بالضبط. الكائن نفسه موجود أيضًا فيwindow.qorex.evm. - المسار الأصلي.
window.qorex.nativeمزوّد بنمط Keplr (وليس اسمًا بديلًا لـwindow.keplr). تتطلب QoreChain توقيعًا هجينًا secp256k1 زائد ML-DSA-87 على معاملات المسار الأصلي، ولا يحمل مفتاح ML-DSA-87 إلا المحفظة، ولذلك يرسل الـ dApp الرسائل إلىsignAndBroadcast. تعرضها QoreX وتحدد الرسوم وتوقّع بالمفتاحين وتبثّ وتُبلغ عنshield. - Solana. تسجّل QoreX محفظة Solana Wallet Standard على
solana:mainnet(أي Solana نفسها). مسار SVM الخاص بـ QoreChain غير مفتوح للمعاملات وليس له معرّف سلسلة في Wallet Standard. - القدرات، لا الإصدارات. تقرأ الحزم
window.qorex.native.capabilitiesعبرhasCapability. قد يعلن إصدار من QoreX عنlistAccountsوconnectProofPicksAccountوexecuteRequestوsignAndBroadcast. - يُرفض Amino عمدًا، لأن Amino JSON لا يستطيع حمل توقيع ML-DSA-87 الهجين. تخدم الحزم كل طلب موقّع بموقّع مباشر.
signDirectوالطبقة ما بعد الكمّية، بدقة. اليوم توقّعsignDirectفي QoreX الـ SignDoc كما هو بمفتاح secp256k1. وعلى QoreChain يجب أن يحتوي الجسم أصلًا على طبقة ML-DSA-87 هجينة صالحة لمفتاح الموقّع المسجّل، وهو ما لا تستطيع الصفحة إنتاجه. لذلك علىqorechain-vladiوqorechain-dianaيرميsignDirectفي الموقّع غير المتصل التابع للحزم خطأQOREX_USE_SIGN_AND_BROADCASTقبل أن يصل إلى QoreX؛ بينما تعملgetAccountsعلى كل سلسلة. وعلى معرّفات سلاسل أخرى تمرّر الحزمsignDirectإلى QoreX، التي لا تخدم اليوم إلا معرّفَي سلسلة QoreChain. ومن المخطط أن يضيف إصدار قادم من QoreX الطبقة بنفسه فيsignDirectوأن يعلن القدرةsignDirectAddsPqcLayer؛ ولا يعلنها أي إصدار حالي. الحزم تفحصها أصلًا، وعند إعلانها يمرّر الموقّع غير المتصل SignDocs الخاصة بـ QoreChain إلى QoreX. وقد تعيد QoreX عندها تقدير الغاز وترفع حد الغاز والرسوم، فابثّ دائمًا المستندsignedالعائد.- حالات
shieldالتي تُرجعهاsignAndBroadcast: shielded(تحمل المعاملة المثبَّتة الطبقة الهجينة)، وpending(تم البثّ ولم يكتمل الفحص)، وdowngraded(ثُبّتت دون الطبقة؛ تعامل معها كتنبيه)، وclassical(مسار لا تنطبق عليه الطبقة). - المحاكاة تبني حساباتها من عبارة BIP-39 (الافتراضية: عبارة الاختبار العامة) بالطريقة التي تبنيها بها QoreX:
m/44'/118'/0'/0/iمع مفتاح ML-DSA-87 القياسي لعنوانqor1ذاك، وm/44'/60'/0'/0/iلـ EVM، وm/44'/501'/i'/0'لـ Solana. تقرأsignAndBroadcastفيها مفتاح ML-DSA-87 للحساب من REST، وتسجّله مرة واحدة بـMsgRegisterPQCKeyV2إن كان مفقودًا، وتوقّع هجينًا بـ QoreSign، وتبثّ (مع إعادة المحاولة مرة واحدة بالإصدار الآخر من sign-bytes إن طلبت الشبكة ذلك)، وتنتظر الإدراج وتُرجع{ txHash, code, height, shield }.
ما تدعمه QoreX اليوم
| السطح | اليوم | المخطط من فريق QoreX |
|---|---|---|
EVM (EIP-1193 عبر EIP-6963، network.qore.qorex) | الاتصال (eth_requestAccounts)، وeth_accounts، وeth_chainId، وwallet_switchEthereumChain إلى الشبكة المختارة أصلًا في QoreX | أحداث accountsChanged وchainChanged، ورمزا الخطأ 4200 و4902 في EIP-1193 على كل رفض، وpersonal_sign، وeth_signTypedData_v4، وeth_sendTransaction، وwallet_addEthereumChain |
المسار الأصلي لـ QoreChain (window.qorex.native) | enable وgetKey وsignAndBroadcast وlistAccounts وexperimentalSuggestChain (معرّفات QoreChain) وsignDirect (يجب أن يحمل SignDoc الطبقة الهجينة أصلًا) | أن تضيف signDirect طبقة ML-DSA-87 بنفسها، وتوقيع الرسائل (ADR-36 زائد ML-DSA-87) |
Solana (Wallet Standard، solana:mainnet) | الاتصال وsignMessage وsignTransaction | solana:signIn |
في جانب EVM، يفشل التوقيع والإرسال حاليًا برسالة "QoreX: EVM method ... not yet supported". للمعاملات على QoreChain استخدم المسار الأصلي. وعلى مسار EVM في QoreChain تُقبل المعاملة عندما يكون للمرسل مفتاح ML-DSA-87 مسجّل ونافذة تفويض EVM فُتحت من المسار الأصلي. يغيّر المستخدم الشبكة داخل QoreX؛ ولا يستطيع الـ dApp تبديلها.
كيفية الاستخدام
كتل الشيفرة أدناه هي البدايات السريعة من مركز المطورين. فُحص كلٌّ منها بـ tsc وشُغّل في 27 أكتوبر 2026 بعد التثبيت من سجل npm العام (Node 26؛ وjsdom 30 وreact-dom/client لشيفرة المتصفح؛ وPlaywright 1.64 مع Chromium للتجهيز) ونجح. لا يرسل أيٌّ منها معاملة ولا يحتاج إلى مفتاح ممول. والنتيجة الملاحَظة مذكورة مع كل منها. لم يُختبر سلوك جانب المحفظة (QoreX حقيقية في متصفح حقيقي) لهذه الصفحة.
@qorechain/qorex-types: اكتشاف QoreX
npm install @qorechain/qorex-types
import { discoverQorexEip1193, getQorexNative, hasCapability } from "@qorechain/qorex-types";
// EVM: EIP-6963 discovery by rdns "network.qore.qorex" (QoreX never writes window.ethereum).
const evm = await discoverQorexEip1193({ timeoutMs: 500 });
console.log(evm ? "QoreX EVM provider found" : "QoreX EVM provider not announced");
// QoreChain native lane: window.qorex.native.
const native = getQorexNative();
if (native && hasCapability(native, "signAndBroadcast")) {
const key = await native.getKey("qorechain-diana");
console.log("native account:", key.bech32Address);
}
الملاحَظ تحت المحاكاة: QoreX EVM provider not announced، ثم native account: qor19rl4cm2hmr8afy4kldpxz3fka4jguq0agt672h. السطر الأول متوقع تحت المحاكاة، انظر تنبيه EIP-6963. لا تعتمد الحزمة على أي تبعيات وقت التشغيل، وتصدّر أيضًا أيقونة QoreX كـ data URI من @qorechain/qorex-types/icon. صادرات أخرى: أنواع المزوّد، وisQorexInstalled، وqorexSignAndBroadcast، ودوال لتصنيف رفض QoreX في EVM.
@qorechain/qorex-rainbowkit: QoreX في RainbowKit وwagmi
npm install @qorechain/qorex-rainbowkit @rainbow-me/rainbowkit wagmi viem @tanstack/react-query
import { connectorsForWallets } from "@rainbow-me/rainbowkit";
import { metaMaskWallet } from "@rainbow-me/rainbowkit/wallets";
import { createConfig, http } from "wagmi";
import { QOREX_CHAINS, qorechain, qorechainTestnet, qorexWallet } from "@qorechain/qorex-rainbowkit";
const connectors = connectorsForWallets(
[{ groupName: "Recommended", wallets: [qorexWallet, metaMaskWallet] }],
{ appName: "My dApp", projectId: "<walletconnect project id>" },
);
export const config = createConfig({
chains: QOREX_CHAINS, // QoreChain mainnet (9801) and testnet (9800)
connectors,
transports: { [qorechain.id]: http(), [qorechainTestnet.id]: http() },
});
console.log(config.chains.map((c) => `${c.id} ${c.name}`), connectors.length, "connectors");
الملاحَظ: [ '9801 QoreChain', '9800 QoreChain Testnet' ] 2 connectors. تحوي QOREX_CHAINS تعريفات سلاسل viem لمسار EVM (RPC https://evm.qore.host وhttps://evm-testnet.qore.host، والعملة الأصلية QOR بـ 18 خانة عشرية، والمستكشف https://explore.qore.network). أما projectId فهو معرّف مشروع WalletConnect تنشئه بنفسك لدى WalletConnect. التبعيات النظيرة: viem ^2 وwagmi ^2.9 و@rainbow-me/rainbowkit ^2.2.11. لالتقاط تغييرات الحساب والشبكة التي تُجرى في المحفظة، استخدم wallets: [() => qorexWallet({ pollAccountsOnFocus: true })].
@qorechain/qorex-interchain-kit: تطبيقات Cosmos (موصى بها للأعمال الجديدة)
npm install @qorechain/qorex-interchain-kit @interchain-kit/core @interchain-kit/react
import type { ComponentProps, ReactNode } from "react";
import { ChainProvider } from "@interchain-kit/react";
import { qorexWallet } from "@qorechain/qorex-interchain-kit";
type Props = Pick<ComponentProps<typeof ChainProvider>, "chains" | "assetLists"> & { children: ReactNode };
// chains / assetLists: your chain-registry entries, including QoreChain.
export function Providers({ chains, assetLists, children }: Props) {
return (
<ChainProvider chains={chains} assetLists={assetLists} wallets={[qorexWallet]}>
{children}
</ChainProvider>
);
}
الملاحَظ: رُكّب المكوّن في jsdom مع مُدخل سجل سلاسل شبكة QoreChain التجريبية (@interchain-kit/react 0.11.1). التبعية النظيرة: @interchain-kit/core ^0.11. أرسل معاملة QoreChain بالدالة qorexSignAndBroadcast:
import { qorexSignAndBroadcast } from "@qorechain/qorex-interchain-kit";
const { txHash, code, height, shield } = await qorexSignAndBroadcast({
chainId: "qorechain-diana",
messages: [{ typeUrl: "/cosmos.bank.v1beta1.MsgSend", value: msgSendBytes }],
memo: "",
});
تقبل الدعوة من 1 إلى 32 رسالة ومذكرة (memo) حتى 256 بايت، وتطلب QoreX من المستخدم الموافقة عليها. المقتطف مأخوذ من ملف README الخاص بالحزمة ولم يُشغَّل لهذه الصفحة.
@qorechain/qorex-cosmos-kit: تطبيقات Cosmos على cosmos-kit
npm install @qorechain/qorex-cosmos-kit @cosmos-kit/core @cosmos-kit/react
import type { ComponentProps, ReactNode } from "react";
import { ChainProvider } from "@cosmos-kit/react";
import { wallets as qorexWallets } from "@qorechain/qorex-cosmos-kit";
type Props = Pick<ComponentProps<typeof ChainProvider>, "chains" | "assetLists"> & { children: ReactNode };
// chains / assetLists: your chain-registry entries, including QoreChain.
export function Providers({ chains, assetLists, children }: Props) {
return (
<ChainProvider chains={chains} assetLists={assetLists} wallets={[...qorexWallets]} throwErrors={false}>
{children}
</ChainProvider>
);
}
الملاحَظ: رُكّب في jsdom مع مُدخل شبكة QoreChain التجريبية (@cosmos-kit/react 2.24.1). الخيار throwErrors={false} مطلوب لينجح فحص الأنواع للشيفرة: إذ تعرّف @cosmos-kit/react 2.24 الخاصية throwErrors كخاصية مطلوبة، ويغفلها المثال في README الحزمة. التبعية النظيرة: @cosmos-kit/core ^2.18.1. يوصي README الحزمة بـ Interchain Kit للتطبيقات الجديدة. وتصدّر الحزمة qorexSignAndBroadcast أيضًا.
@qorechain/qorex-wallet-mock: بديل اختباري لـ QoreX
npm install -D @qorechain/qorex-wallet-mock
import { createQorexMock } from "@qorechain/qorex-wallet-mock";
// jsdom / Vitest: install a QoreX test double into window (public test phrase, testnet only).
const mock = createQorexMock({ profile: "current" });
mock.install(window);
const [account] = (await window.qorex!.evm.request({ method: "eth_requestAccounts" })) as string[];
const chainId = await window.qorex!.evm.request({ method: "eth_chainId" });
console.log(account, chainId, mock.addresses());
الملاحَظ: 0x9858EfFD232B4033E47d90003D41EC34EcaEda94 0x2648 { native: qor19rl4cm2hmr8afy4kldpxz3fka4jguq0agt672h, evm: 0x9858..., svm: HAgk14JpMQLgt6rVgv7cBQFJWFto5Dqxi472uT3DKpqk }. تُشتق الحسابات بالطريقة التي تشتقها بها QoreX (m/44'/118'/0'/0/i مع مفتاح ML-DSA-87 القياسي لعنوان qor1 ذاك، وm/44'/60'/0'/0/i لـ EVM، وm/44'/501'/i'/0' لـ Solana). تشمل الخيارات profile وmnemonic وaccountIndex وchainId (الافتراضي qorechain-diana) وautoApprove وallowMainnet؛ كما تحصل الصفحة على window.__qorexMock مع approveNext() وrejectNext() وrequests وswitchAccount(i). في Playwright، احقن mock.initScript() بـ page.addInitScript (Node 20.16 أو أحدث).
@qorechain/qorex-synpress: تجهيزات Playwright
npm install -D @qorechain/qorex-synpress @playwright/test
import { qorexMockFixtures } from "@qorechain/qorex-synpress";
// A Playwright test with the QoreX mock injected before navigation (no Synpress needed).
const test = qorexMockFixtures({ profile: "current" });
const { expect } = test;
test("connects", async ({ page, qorex }) => {
await page.goto("/");
await page.getByRole("button", { name: "Connect" }).click();
await expect(page.getByTestId("account")).toHaveText(qorex.addresses.evm);
});
الملاحَظ: 1 passed، مقابل صفحة محلية يستدعي زر Connect فيها eth_requestAccounts (Playwright 1.64 وChromium). لدمج التجهيزات مع Synpress، ثبّت @synthetixio/synpress@4.1.2 ولُفَّها بـ testWithSynpress. يكشف التجهيز qorex الأعضاء addresses وapproveNext() وrejectNext() وrequests() وswitchAccount(i) وdisconnect(). التبعية النظيرة: @playwright/test 1.48 أو أحدث. الحالة تعيش في الصفحة، لذلك يبدأ كل تنقل بمحاكاة جديدة.
إرسال معاملة على QoreChain
الدعوة نفسها موجودة في @qorechain/qorex-interchain-kit و@qorechain/qorex-cosmos-kit و@qorechain/qorex-types:
import { qorexSignAndBroadcast } from "@qorechain/qorex-interchain-kit";
const { txHash, code, height, shield } = await qorexSignAndBroadcast({
chainId: "qorechain-diana",
messages: [{ typeUrl: "/cosmos.bank.v1beta1.MsgSend", value: MsgSend.encode(msg).finish() }],
memo: "",
gasLimit: 200000,
});
valueهي الرسالة المرمّزة بـ protobuf: Uint8Arrayأوnumber[]أو base64.- من 1 إلى 32 رسالة؛ ومذكرة حتى 256 بايت؛ ويُقيَّد
gasLimitبين 100,000 و5,000,000 (و400,000 عند حذفه). تحدد QoreX الرسوم وتعرضها قبل التوقيع. - يجب أن يطابق
chainIdالشبكة المختارة في QoreX. - الرسائل التي تدير مفتاح ML-DSA-87 للحساب هي من شأن المحفظة وتُرفض، وكذلك داخل
MsgExec. وتُرفض أنواع الرسائل التي لا تستطيع QoreX عرضها. - دون حزمة أدوات، استدعِ
window.qorex.native.signAndBroadcast(request)بعد التحقق منhasCapability(native, "signAndBroadcast"). تُرجعgetKeyالحقلينpubKeyوaddressكـnumber[]؛ حوّلهما بـUint8Array.from(key.pubKey)(تفعل الحزم ذلك عنك).
المحاكاة في Playwright دون التجهيزات
import { createQorexMock } from "@qorechain/qorex-wallet-mock";
const mock = createQorexMock({ profile: "current" });
await page.addInitScript({ content: mock.initScript() });
await page.goto("http://localhost:5173");
await page.evaluate(() => window.__qorexMock!.rejectNext());
واجهة API الرئيسية
| الحزمة | الاسم | ما يفعله |
|---|---|---|
| types | discoverQorexEip1193({ timeoutMs }), findQorexEip1193() | اكتشاف غير متزامن عبر EIP-6963 لمزوّد EVM الخاص بـ QoreX، وفحص متزامن له |
| types | getQorexNative(), isQorexInstalled(), hasCapability(native, capability) | قراءة window.qorex.native، والتحقق من وجود QoreX، واختبار قدرة |
| types | qorexSignAndBroadcast(request, { native? }) | تسلّم الرسائل إلى QoreX؛ وترمي QOREX_NOT_INSTALLED دون QoreX وQOREX_NOT_SUPPORTED_YET على QoreX أقدم منها |
| types | QorexIntegrationError, isQorexIntegrationError(err, code) | أخطاء هذه الحزم، برموز ثابتة |
| types | isQorexUnsupportedMethodError, isQorexUnrecognizedChainError, QOREX_EVM_ERROR_CODES | تصنيف رفض QoreX في EVM: تفحص code (4200 و4902)، ثم تعود إلى نص رسالة اليوم |
| types | QorexEip1193Provider, QorexNativeProvider, QorexSolanaStandardWallet, QorexSvmProvider; @qorechain/qorex-types/icon | أنواع ما تحقنه QoreX؛ وأيقونة QoreX كـ data URI |
| rainbowkit | qorexWallet(options?), createQorexConnector, getQorexEip1193Provider | محفظة RainbowKit (الخيار pollAccountsOnFocus)، وموصّل wagmi، والمزوّد الذي يستخدمه |
| rainbowkit | qorechain, qorechainTestnet, QOREX_CHAINS | سلسلتا viem 9801 و9800 |
| interchain-kit | qorexWallet, createQorexWallet(), QorexCosmosWallet | محفظة Interchain Kit |
| cosmos-kit | wallets, qorexExtension, QorexExtensionWallet, QorexClient | محفظة cosmos-kit |
| الحزمتان معًا | qorexSignAndBroadcast, QOREX_CAPABILITY_SIGN_DIRECT_ADDS_PQC_LAYER, ثوابت معرّفات السلاسل، ودوال الأخطاء | يُعاد تصديرها من qorex-types |
| wallet-mock | createQorexMock(options) | تُرجع { install(window), initScript(), addresses(), ... } |
| wallet-mock | window.__qorexMock | approveNext(), rejectNext(), pendingApprovals, requests, clearRequests(), switchAccount(i), switchNetwork(chainId), disconnect(), addresses() |
| wallet-mock | PUBLIC_TEST_MNEMONIC | عبارة BIP-39 الاختبارية العامة (لا تموّلها أبدًا) |
| synpress | qorexMockFixtures(options) | اختبار Playwright test مع تجهيز qorex تلقائي |
| synpress | qorex.addresses, approveNext(), rejectNext(), waitForApproval(), pendingApprovals(), requests(), clearRequests(), switchAccount(i), switchNetwork(chainId), disconnect(), mock | عناصر تحكم التجهيز |
| synpress | qorexExtensionFixtures({ extensionPath }) | واجهة مخطط لها للإضافة الحقيقية؛ وترمي اليوم QorexExtensionModeUnavailableError |
مع Synpress v4 ادمج التجهيزات بـ testWithSynpress(qorexMockFixtures({ profile: "planned" })). ومع autoApprove: false، استدعِ await qorex.waitForApproval() لفحص الحالة المعلّقة، ثم qorex.approveNext(). شغّل المجموعة بالملفين معًا لتغطية QoreX اليوم والإصدار القادم.
سلوك موقّع الحزمتين
| الدعوة | Interchain Kit | cosmos-kit |
|---|---|---|
connect أو enable، getAccount، getKey | enable وgetKey من QoreX، مع تحويل البايتات إلى Uint8Array | مثله |
getOfflineSigner(chainId) | موقّع مباشر لكل تفضيل | موقّع مباشر لكل تفضيل، بما فيه الافتراضي "amino" في cosmos-kit |
signDirect في الموقّع على QoreChain | يرمي QOREX_USE_SIGN_AND_BROADCAST (إلى أن تعلن QoreX signDirectAddsPqcLayer) | مثله |
signDirect في الموقّع على معرّف سلسلة آخر | يُمرَّر إلى signDirect في QoreX | مثله |
signAmino، getOfflineSignerAmino | يرمي QOREX_AMINO_REFUSED | مثله |
signArbitrary (ADR-36) | يرمي QOREX_NOT_SUPPORTED_YET (وكذلك verifyArbitrary) | يرمي QOREX_NOT_SUPPORTED_YET |
sendTx | يرمي QOREX_NOT_SUPPORTED_YET؛ ابثّ عبر نقطة RPC الخاصة بك | غير متوفرة |
خيارات المحفظة الوهمية
| الخيار | الافتراضي | المعنى |
|---|---|---|
profile | "current" | "current" هو QoreX اليوم؛ و"planned" يضيف الميزات المعلن عنها |
mnemonic | عبارة BIP-39 الاختبارية العامة | استخدم عبارتك الخاصة لأي شيء تموّله |
accountIndex | 0 | الفهرس نفسه على كل مسار |
chainId | "qorechain-diana" | الشبكة المختارة في المحاكاة |
rest | https://api-testnet.qore.host | نقطة REST لـ signAndBroadcast وعمليات البحث عن المفاتيح |
evmRpc | https://evm-testnet.qore.host | تستخدمه eth_sendTransaction (الملف planned) |
allowMainnet | false | دونه يُرفض التوقيع لـ qorechain-vladi |
autoApprove | true | عند false تنتظر الموافقات approveNext() أو rejectNext() |
inclusionTimeoutMs, pollIntervalMs | 30000, 1500 | كيف تنتظر signAndBroadcast الإدراج |
رموز الأخطاء
من هذه الحزم (QorexIntegrationError.code): QOREX_NOT_INSTALLED وQOREX_USE_SIGN_AND_BROADCAST وQOREX_AMINO_REFUSED وQOREX_NOT_SUPPORTED_YET؛ ومن qorex-synpress: QOREX_EXTENSION_MODE_UNAVAILABLE. أخطاء QoreX نفسها كائنات Error عادية تبدأ رسالتها بـ QoreX، مثل QoreX: connection rejected وQoreX: signature rejected وQoreX: wallet is locked وQoreX: unsupported chain <id>. اليوم تعدّ السلسلة المجهولة (4902) الحالة الوحيدة التي تحمل رمزًا رقميًا، ولا يحمل رفض المستخدم رمز EIP-1193 4001، فطابِق الرسالة. الرسائل التي تبدأ بـ QoreX (mock): تأتي من المحاكاة، وليس من QoreX أبدًا.
كيفية الوصول
- محفظة QoreX للاستخدام الحقيقي. تتحدث الموصّلات مع إضافة متصفح QoreX أو تطبيقها الذي ثبّته المستخدم؛ راجع صفحة إضافة متصفح QoreX للتثبيت وإصدارات المتاجر. حزم الاختبار لا تحتاج إلى محفظة.
- الشبكات. الشبكة الرئيسية
qorechain-vladi(معرّف سلسلة EVM 9801) والشبكة التجريبيةqorechain-diana(معرّف سلسلة EVM 9800). تخدم QoreX معرّفي سلسلة QoreChain هذين فقط وترفض غيرهما برسالة "QoreX: unsupported chain". تعتمد المحاكاة الشبكة التجريبية افتراضيًا وترفض التوقيع للشبكة الرئيسية ما لم تمرّرallowMainnet: true. - المفاتيح والأموال. الحزم لا تحتفظ بأي مفتاح. تستخدم المحاكاة عبارة BIP-39 الاختبارية العامة (الكلمة
abandonمكررة 11 مرة، ثمabout) التي تشتقqor19rl4cm2hmr8afy4kldpxz3fka4jguq0agt672h؛ لا تموّلها أبدًا. ولاختبار يبثّ معاملات، أعطِ المحاكاة عبارتك الاستعادية الخاصة بالشبكة التجريبية. - حسابات أخرى. يحتاج RainbowKit مع WalletConnect إلى معرّف مشروع WalletConnect من WalletConnect.
- المتطلبات المسبقة. Node.js (يحتاج سكربت الملف الواحد للمحاكاة إلى 20.16 أو أحدث)، وتطبيق React للموصّلات الثلاثة، والحزم النظيرة المذكورة تحت كل بداية سريعة. يحصل مستخدمو TypeScript على الأنواع من
@qorechain/qorex-types. - التكاليف. الحزم مجانية. تدفع المعاملة المرسلة عبر QoreX الرسوم المعتادة (الحد الأدنى 0.1 uqor لكل وحدة غاز؛ وتسعّر QoreX معاملاتها الخاصة بـ 0.15 uqor لكل وحدة غاز).
الشبكات
| الشبكة الرئيسية | الشبكة التجريبية | |
|---|---|---|
| معرّف السلسلة الأصلية | qorechain-vladi | qorechain-diana |
| معرّف سلسلة EVM | 9801 (0x2649) | 9800 (0x2648) |
| REST | https://api.qore.host | https://api-testnet.qore.host |
| RPC | https://rpc.qore.host | https://rpc-testnet.qore.host |
| EVM JSON-RPC | https://evm.qore.host | https://evm-testnet.qore.host |
| المستكشف | https://explore.qore.network | نفسه، مع اختيار الشبكة التجريبية |
بادئة Bech32 هي qor (والمدققون qorvaloper)، ونوع العملة 118، والعملة uqor بست خانات عشرية على المسار الأصلي وQOR بـ 18 خانة عشرية على EVM. يحتاج المستخدمون إلى إضافة QoreX (0.3.x) للاستخدام الحقيقي؛ أما الاختبارات فتحتاج إلى المحاكاة فقط. وللبثّ الحقيقي من المحاكاة، يحتاج الحساب إلى QOR تجريبي من الصنبور (يتطلب تسجيل الدخول)؛ استخدم عبارتك الخاصة، وليس عبارة الاختبار العامة أبدًا.
ملاحظات أمنية
- لا يحمل الـ dApp مفتاح ML-DSA-87 أبدًا: توقّع QoreX معاملات QoreChain داخل المحفظة عبر
signAndBroadcast. - ترفض QoreX طلبات الصفحة للرسائل التي تدير مفتاح ML-DSA-87 للحساب.
- لا تعود
qorexWallet()أبدًا إلىwindow.ethereum، فلا يُؤخذ محفظة مُحقونة أخرى على أنها QoreX. وتستخدم المحاكاة اسمًا معكوسًا للنطاق مميزًا كي لا يُؤخذ البديل الاختباري على أنه المحفظة. connectProofوexecuteTransferوexecuteRequestطرق موجودة للوحة تحكم QoreChain وتُرفض على كل أصل (origin) آخر.- راقب نتيجة
shield. القيمةdowngradedتعني أن المعاملة ثُبّتت دون الطبقة الهجينة؛ تعامل معها كتنبيه. - عبارة المحاكاة الافتراضية عامة، وترفض المحاكاة التوقيع للشبكة الرئيسية ما لم تكن
allowMainnet: true. لا تموّل عبارة الاختبار العامة أبدًا؛ واستخدم عبارة منفصلة للشبكة التجريبية في الاختبارات الحيّة. - أبلغ عن الثغرات سرًّا إلى security@qore.network.
أين تُنشر
| السجل | الحزمة | الإصدار | الرابط |
|---|---|---|---|
| npm | @qorechain/qorex-types | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-types |
| npm | @qorechain/qorex-rainbowkit | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-rainbowkit |
| npm | @qorechain/qorex-interchain-kit | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-interchain-kit |
| npm | @qorechain/qorex-cosmos-kit | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-cosmos-kit |
| npm | @qorechain/qorex-wallet-mock | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-wallet-mock |
| npm | @qorechain/qorex-synpress | 0.1.0 | https://www.npmjs.com/package/@qorechain/qorex-synpress |
المصدر: https://github.com/qorechain/qorex-integrations (عام، والإصدار v0.1.0 نُشر في 27 أكتوبر 2026، والمجلدات تحت packages/). ويحوي أيضًا أدلة (إضافة QoreX إلى جانب MetaMask أو Keplr أو Phantom؛ والاختبار الشامل؛ والأخطاء ومعرّفات السلاسل)، وdApp تجريبيًا يختبر كل أسطح QoreX على الشبكة التجريبية، وأمثلة (examples/wagmi-rainbowkit وexamples/playwright-e2e) وملفات مُدخلات سجل السلاسل. الترخيص Apache-2.0؛ والجهة الصائنة جمعية QoreChain. قُرئت الإصدارات من سجل npm في 27 أكتوبر 2026. وهي تحلّ محل @qorechain/connect، الذي صار مهجورًا على npm: استخدم qorex-types لاكتشاف QoreX، وqorex-rainbowkit لتطبيقات EVM، وqorex-interchain-kit (أو qorex-cosmos-kit) لتطبيقات Cosmos، وQoreSign للتوقيع الهجين في محفظتك أو خلفيتك الخاصة.
الحدود والمشكلات المعروفة
ما تدعمه إصدارات QoreX الحالية. إصدارات المتاجر الحيّة (تطبيق QoreX للجوال 1.1.8؛ وإضافة المتصفح 0.3.8، و0.3.9 على Firefox) لا تدعم بعد getOfflineSigner مع طبقة ML-DSA تضيفها المحفظة، ولا تدعم signArbitrary. عبر cosmos-kit وInterchain Kit، لا يعمل التوقيع بـ getOfflineSigner إلا إذا أرفقت الصفحة نفسها الطبقة ما بعد الكمّية، وهو ما لا تستطيعه الصفحة عادةً لأنها لا تحمل المفتاح. الطريقة المدعومة لإرسال معاملة على المسار الأصلي اليوم هي window.qorex.native.signAndBroadcast، التي تغلّفها qorexSignAndBroadcast. لا تعتبر الموصّلات محفظة كاملة لـ cosmos-kit أو Interchain Kit مع إصدارات المتاجر الحالية، بما يتجاوز ما يذكره README كل حزمة. كُتبت الموصّلات بحيث يستطيع إصدار لاحق من QoreX إضافة الطبقة في signDirect (يُعلَن عنها عبر قدرة signDirectAddsPqcLayer) دون أي تغيير في شيفرتك.
ما تجيب عنه QoreX اليوم (من README الحزم):
- EVM:
eth_chainIdوeth_accountsوeth_requestAccountsوwallet_switchEthereumChainللشبكة المختارة في QoreX (تُرفض السلسلة المجهولة بالرمز 4902). طرق التوقيع (personal_signوeth_signTypedData_v4وeth_sendTransaction) وwallet_addEthereumChainغير مدعومة بعد وتُرفض برسالة "QoreX: EVM method ... not yet supported". لا أحداثaccountsChangedأوchainChangedبعد. أدرجها فريق QoreX كمخطط لها، وليست حيّة: الأحداث، ثم رموز الأخطاء على كل رفض، ثم طرق التوقيع والمعاملات. - معاملات EVM عمومًا. على QoreChain لا تُقبل معاملة EVM إلا من حساب لديه مفتاح ML-DSA-87 مسجّل ونافذة تفويض EVM مفتوحة، وكلاهما يُعدّ من المسار الأصلي (راجع تطوير EVM). لا تفتح
eth_sendTransactionالمخطط لها في المحاكاة تلك النافذة. - الأصلي:
enableوgetKeyوsignDirectوsignAndBroadcastوlistAccountsوexperimentalSuggestChain، لـqorechain-vladiوqorechain-dianaفقط. على QoreChain تحتاجsignDirectإلى أن تكون الطبقة الهجينة موجودة مسبقًا، وهو ما لا تستطيع الصفحة بناءه، لذا استخدمsignAndBroadcast. أماsignArbitraryوتوقيع Amino وsendTxفغير متاحة؛ وفي الموصّلات ترميsignArbitraryالخطأQOREX_NOT_SUPPORTED_YETويرمي Amino الخطأQOREX_AMINO_REFUSED. - Solana: Wallet Standard على
solana:mainnetمع connect وdisconnect والأحداث وsignAndSendTransactionوsignTransactionوsignMessage؛ بلاsolana:signIn. لا يقبل مسار SVM في السلسلة معاملات بعد، فالدعم لـ Solana هنا هو جانب المحفظة فقط.
تنبيهات وُجدت أثناء اختبار البدايات السريعة:
- يحتاج cosmos-kit إلى
throwErrors. يغفل مثال README الخاصيةthrowErrorsالتي تطلبها@cosmos-kit/react2.24 في أنواعها، فلا ينجح فحص الأنواع كما هو مكتوب. مرّرthrowErrors={false}(أو قيمتك الخاصة). - TypeScript الصارم والمحاكاة. تُرجع
window.qorex.evm.request(...)النوعunknown، ولذلك يفشل سطر README الذي يفكّك نتيجتها تحت TypeScript الصارم. حوّل النتيجة بـ cast، مثلًاas string[]لـeth_requestAccounts. - للمحاكاة معرّف EIP-6963 خاص بها. تعلن
network.qore.qorex.mockلاnetwork.qore.qorex. لذلك فإن شيفرة الاكتشاف التي تختار QoreX بصرامة بـnetwork.qore.qorex(ومنهاdiscoverQorexEip1193فيqorex-types) لا تجد مزوّد EVM تحت المحاكاة، عن قصد، بينما يكونwindow.qorex.evmوالمزوّد الأصلي موجودين. إذا كانت شيفرتك تختار المزوّد عبر الاكتشاف، فاجعلها تقبل rdns المحاكاة (المصدَّر باسمQOREX_MOCK_RDNS) في الاختبارات. - RainbowKit يُبقي Node حيًّا. في Node، يبدأ بناء إعداد RainbowKit مؤقتات WalletConnect، ولا تنتهي العملية من تلقاء نفسها بعد ذلك. وهذا متوقع في الصفحة. أما في سكربت أو اختبار، فاخرج صراحةً (مثلًا
process.exit(0)) بعد أن تقرأ ما تحتاجه. - وضع إضافة Synpress لا يعمل بعد.
qorexExtensionFixturesهي الطريقة المخطط لها لقيادة الإضافة الحقيقية وترمي اليومQorexExtensionModeUnavailableError، لأنها تحتاج إلى محددات اختبار مستقرة في نوافذ الموافقة في QoreX لم تصدر بعد. استخدم وضع المحاكاة.
الفروق بين المحاكاة والمحفظة: لا شاشة قفل ولا نافذة موافقة (الموافقات تتم بـ approveNext أو rejectNext أو autoApprove)؛ تُبلغ signDirect عن نوع مفتاح secp256k1 عادي؛ ويُرفض signAndSendTransaction في Solana؛ والرسائل التي تبدأ بـ "QoreX (mock):" هي من المحاكاة نفسها. نتائج الاختبار من المحاكاة تُظهر كيف تتصرف صفحتك مقابل الواجهة الموصوفة، لا أن إصدارًا حقيقيًا من QoreX يتصرف بالطريقة نفسها.
أخرى: الحزم الست جميعها إصدار أولي (0.1.0)، فتوقّع أن تنمو واجهاتها كما تنمو QoreX. لا تغطي أي بداية سريعة مُختبَرة الدالة qorexSignAndBroadcast مقابل شبكة حيّة أو محفظة حقيقية.
صفحات ذات صلة
- محفظة QoreX وإضافة متصفح QoreX: المحفظة التي تتحدث معها هذه الحزم.
- QoreSign: الموقّع الهجين الذي تستخدمه المحاكاة.
- QoreChain SDK: ترميز رسائل مثل
MsgSendلـsignAndBroadcast. - تطوير EVM: تسجيل مفتاح ML-DSA-87 ونوافذ تفويض EVM.
- الصنبور: QOR التجريبي.
- خادم QoreChain MCP: اقرأ نتيجة بثّ المعاملة بـ
get_pq_status. - نظرة عامة على حزم المطورين.