diff --git a/about/index.html b/about/index.html index 8971d107df..814425b615 100644 --- a/about/index.html +++ b/about/index.html @@ -35,6 +35,8 @@ + + @@ -52,12 +54,12 @@ + - -
- + + @@ -98,198 +100,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - -
- -
+

About us

SimpleX Chat Ltd is a company founded to develop SimpleX network and software.

@@ -401,7 +382,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/ar/contact/index.html b/ar/contact/index.html index 1a8ced3d84..1eb27ce699 100644 --- a/ar/contact/index.html +++ b/ar/contact/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,192 +110,184 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -853,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ar/fdroid/index.html b/ar/fdroid/index.html index f898345c26..6d583e6bae 100644 --- a/ar/fdroid/index.html +++ b/ar/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,192 +110,184 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

شرح SimpleX

- - - - - - - -
-
- -
-
1. تجربة المستخدم
-
- -

- يمكنك إنشاء جهات اتصال ومجموعات وإجراء مُحادثات ثنائية الاتجاه، كما هو الحال في أي برنامج مُراسلة آخر. -

-

- كيف يمكن أن تعمل مع قوائم انتظار أحادية الاتجاه وبدون معرّفات ملف تعريف المستخدم؟ -

-
-
- -
-
2. كيف يعمل
-
- -

- لكل اتصال، تستخدم قائمتي انتظار منفصلتين للمُراسلة لإرسال واستلام الرسائل عبر خوادم مختلفة. -

-

- تمرّر الخوادم الرسائل في اتجاه واحد فقط، دون الحصول على الصورة الكاملة لمُحادثات المستخدم أو اتصالاته. -

-
-
- -
-
3. ما الذي تراة الخوادم
-
- -

- تحتوي الخوادم على بيانات اعتماد مجهولة منفصلة لكل قائمة انتظار، ولا تعرف المستخدمين الذين ينتمون إليهم. -

-

- يمكن للمستخدمين زيادة تحسين خصوصية البيانات الوصفية باستخدام تور للوصول إلى الخوادم، ومنع الارتباط بواسطة عنوان IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

كن
حراً

+

حرية وأمن
اتصالاتك

+

الشبكة الأولى التي تمتلك فيها هويتك وجهات اتصالك ومجموعاتك.

- -
-
-

مقارنة مع البروتوكولات الأخرى

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal، منصات كبيرةXMPP ،Matrixبروتوكولات P2P
يتطلب هوية عالميةلا - خصوصينعم 1نعم 2نعم 3
احتمالية هجوم الوسيطلا - آمن 4نعم 5نعمنعم
الاعتمادية على DNSلا - مرننعمنعملا
شبكة أحادية أو مركزيةلا - لامركزينعملا - اتِحاديّ 6نعم 7
مكون مركزي أو هجوم الشبكة الواسعلا - مرننعمنعم 2نعم 8
-
- -
- -
-
-
    -
  1. عادة ما يكون مكوناً من رقم الهاتف، أو اسم المستخدم في بعض الأحيان
  2. -
  3. العناوين تعتمد على الـDNS
  4. -
  5. المفتاح العام أو معرّف آخر فريد وعام
  6. -
  7. مُرحلات SimpleX لا يمكنها أن تتنازل عن تعمية بين الطرفين. تحقق من رمز الأمان للتخفيف من الهجوم على القناة خارج النطاق
  8. -
  9. إذا خوادم المشغّل مُخترقة. تحقق من رمز الأمان في Signal وبعض التطبيقات الأخرى للتخفيف منه
  10. -
  11. لا يحمي خصوصية البيانات الوصفية للمستخدمين
  12. -
  13. على الرغم من أن الـP2P موزعة، إلا أنها ليست اتِحاديَّة — يعملون كشبكة واحدة
  14. -
  15. شبكات P2P إما لديها سلطة مركزية أو أن الشبكة كلها يمكن عرضة للخطر - اقرأ هنا
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ التحقيقات
الآمنية +

+
+ +
-
-
-
+
+
+
+
+
+
+

المُراسلة الأكثر أمانًا في العالم

+

تتميز رسائل SimpleX بتعمية متطورة بين الطرفين.

+

لأمانك وخصوصيتك، لا يمكن للخوادم رؤية رسائلك ومَن تتحدث إليه.

+ تعرّف على المزيد حول مراسلة SimpleX +
+
+
+
+
+
+

أنت تملك
الشبكة التالية

+

تأسست SimpleX على الاعتقاد بأن عليك امتلاك هويتك وجهات اتصالك ومجتمعاتك.

+

شبكة مفتوحة ولامركزية تتيح لك التواصل مع الأشخاص ومشاركة الأفكار: كن حرًا وآمنًا.

+
+
+
+
+
+
+

مجتمعات تدوم

+

ستدعم مجموعاتك المفضلة بقسائم المجتمع المستقبلية.

+

ستدفع القسائم ثمن الخوادم، لتمكين مجتمعاتك من البقاء حرة ومستقلة.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

انضم إلى SimpleX

-

نحن ندعوك للانضمام إلى المُحادثة

- - - -

اشترك للحصول على آخر مستجداتنا

- -
- - - -
- -
- -

احصل على تطبيق سطح المكتب SimpleX

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

- +
+
+
+

خارطة طريق SimpleX للإنترنت المجاني

+
+

2025

+

: التوسع إلى مجتمعات كبيرة

+

الهروب من المنصات المركزية

+
+
+

2026

+

: مجتمعات وخوادم مستدامة

+

إطلاق قسائم المجتمع

+
+
+

2027

+

: اجعل مجتمعاتك تنمو

+

أدوات لتعزيز مجتمعاتك

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

انضم إلى مجتمعات SimpleX

+

مئات الآلاف من الأشخاص يثقون بالفعل في مُراسلة SimpleX.

+

ابحث عن مجتمعاتك في دليل SimpleX وأنشئ مجتمعك الخاص!

+ اعرض دليل SimpleX +
+
+
-
+ + + + + + + + + - - - - diff --git a/ar/invitation/index.html b/ar/invitation/index.html index c962896fb5..0a7806f511 100644 --- a/ar/invitation/index.html +++ b/ar/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,192 +110,184 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -853,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ar/messaging/index.html b/ar/messaging/index.html new file mode 100644 index 0000000000..e8377365b2 --- /dev/null +++ b/ar/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

لماذا SimpleX فريد من نوعه

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

لديك خصوصية كاملة

+
+ +
+ +
+

+ يحمي SimpleX خصوصية ملف تعريفك، جهات اتصالك والبيانات الوصفية، ويخفيه عن خوادم شبكة SimpleX وأي مراقبين. +

+

+ على عكس أي شبكة مُراسلة آخر، لا يحتوي SimpleX على معرّفات مخصّصة للمستخدمين — ولا حتى أرقام عشوائية. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

أنت محمي
من رسائل الإزعاج وإساءة الاستخدام

+
+ +
+ +
+

+ نظرًا لعدم وجود معرّف أو عنوان ثابت على شبكة SimpleX، لا يمكن لأي شخص الاتصال بك ما لم تشارك عنوان مستخدم لمرة واحدة أو مؤقتًا، كرمز QR أو رابط. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

أنت تتحكم في بياناتك

+
+ +
+ +
+

+ يخزن SimpleX جميع بيانات المستخدم على الأجهزة العميلة بتنسيق قاعدة بيانات محمولة مُعمَّاة — يمكّن نقلها إلى جهاز آخر. +

+

+ يتم الاحتفاظ بالرسائل المُعمَّاة بين الطرفين مؤقتًا على خوادم ترحيل SimpleX حتى يتم استلامها، ثُمَّ تُحذف نهائيًا. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

أنت تمتلك شبكة SimpleX

+
+ +
+ +
+

+ شبكة SimpleX لا مركزية بالكامل ومستقلة عن أي عملة مُعمَّاة أو أي شبكة أخرى، بخلاف الإنترنت. +

+

+ يمكنك استخدام SimpleX مع خوادمك الخاصة أو مع الخوادم التي نوفرها — ولا يزال الاتصال ممكن بأي مستخدم. +

+ +
+ + + اقرأ أكثر + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

الميزات

+ +
+ +
+
+ + +
+

تعمية الرسائل بين الطرفين مع دعم ماركداون والتعديل

+
+ +
+
+ + +
+

تعمية
الصور والفيديوهات والملفات بين الطرفين

+
+ +
+
+ + +
+

المجموعات اللامركزية مُعمَّاة — المستخدمون فقط يعرفون بوجودها

+
+ +
+
+ + +
+

تعمية الرسائل الصوتية بين الطرفين

+
+ +
+
+ + +
+

رسائل ذاتية الاختفاء

+
+ +
+
+ + +
+

تعمية المكالمات الصوتية والفيديو
بين الطرفين

+
+ +
+
+ + +
+

تخزين بيانات التطبيق مُعمَّاة ومحمولة — نقل ملف التعريف إلى جهاز آخر

+
+ +
+
+ + +
+

وضع التخفي —
فريد من نوعه لـ SimpleX Chat

+
+ +
+
+
+ + +
+
+

ما الذي يجعل SimpleX خصوصيًّا

+ +
+
+ + +
+
+ + +
+
+

معرّفات زوجية مجهولة مؤقتة

+
+ +

يستخدم SimpleX معرّفات مزدوجة مؤقتة مجهولة الهوية للعناوين وبيانات الاعتماد لكل جهة اتصال مستخدم أو عضو مجموعة.

+ +

يسمح بتسليم الرسائل بدون معرّفات ملف تعريف المستخدم، مما يوفر خصوصية للبيانات الوصفية أفضل من البدائل.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

تبديل
خارج النطاق

+
+ +

العديد من شبكات التواصل عرضة لهجمات الوسيط (MITM) من قِبل الخوادم أو موفري الشبكات.

+ +

لمنع ذلك، تقوم تطبيقات SimpleX بتمرير مفاتيح لمرة واحدة خارج النطاق، عندما تُشارك عنوان كرابط أو رمز QR.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقتان من
التعمية بين الطرفين

+
+ +

بروتوكول Double-ratchet —
رسائل OTR مع السرية المستمرة واستعادة الاختراق.

+ +

NaCL cryptobox في كل قائمة انتظار لمنع ارتباط حركة مرور البيانات بين قوائم انتظار الرسائل في حالة اختراق TLS.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

التحقق
من سلامة الرسالة

+
+ +

لضمان سلامة الرسائل يتم ترقيمها بالتسلسل وتضمين تجزئة الرسالة السابقة.

+ +

إذا أُضيفت أي رسالة أو أُزيلت أو تغيّرت، فسيتم تنبيه المُستلم.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقة إضافية من
تعمية الخادم

+
+ +

طبقة إضافية من تعمية الخادم للتسليم إلى المُستلم، لمنع الارتباط بين حركة مرور بيانات الخادم المُستلمة والمُرسلة في حالة اختراق TLS.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

خلط الرسائل
لتقليل من الارتباط

+
+ +

تعمل خوادم SimpleX كعقد مختلطة بزمن انتقال منخفض — الرسائل الواردة والصادرة لها ترتيب مختلف.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

تأمين نقل
TLS المصدق عليه

+
+ +

يتم استخدام TLS 1.2 / 1.3 مع خوارزميات قوية فقط لاتصالات الخادم والعميل.

+ +

تعمل بصمة الخادم وربط القناة على منع هجمات الوسيط (MITM) وإعادة التشغيل.

+ +

استئناف الاتصال معطل لمنع هجمات الجلسة.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

وصول
اختياري عبر تور

+
+ +

لحماية عنوان IP الخاص بك، يمكنك الوصول إلى الخوادم عبر تور أو بعض شبكات تراكب النقل الأخرى.

+ +

لاستخدام SimpleX عبر تور، يُرجى تثبيت تطبيق Orbot وتمكّين وكيل SOCKS5 (أو VPN على iOS ).

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

قوائم انتظار
أحادية الاتجاه

+
+ +

كل رسالة انتظار تمرر الرسائل في اتجاه واحد، بعناوين إرسال واستلام مختلفة.

+ +

إنه يقلل من نواقل الهجوم، مقارنة بوسطاء الرسائل التقليديين، والبيانات الوصفية المتاحة.

+ +
+

انقر للإغلاق

+
+
+ +
+
+ + +
+
+

طبقات متعددة من
حشوة المحتوى

+
+ +

يستخدم SimpleX حشوة المحتوى لكل طبقة تعمية لإحباط هجمات حجم الرسالة.

+ +

يجعل الرسائل ذات الأحجام المختلفة تبدو متشابهة للخوادم ومراقبي الشبكة.

+ +
+

انقر للإغلاق

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

شبكة SimpleX

+

يوفر Simplex Chat أفضل خصوصية من خلال الجمع بين مزايا P2P والشبكات الاتحادية.

+ +
+
+
+ + +
+
+

على عكس شبكات P2P

+

+ يتم إرسال جميع الرسائل عبر الخوادم، مما يوفر خصوصية أفضل للبيانات الوصفية وتسليمًا موثوقًا للرسائل غير المتزامنة، مع تجنب الكثير مشاكل شبكات P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

على عكس الشبكات الاتحادية

+

+ لا تقوم خوادم الترحيل SimpleX بتخزين ملفات تعريف المستخدمين وجهات الاتصال والرسائل التي تم تسليمها، ولا تتصل ببعضها البعض، ولا يوجد دليل خوادم. +

+
+
+ + + +
+
+ + +
+
+

شبكة SimpleX

+

+ توفر الخوادم قوائم انتظار أحادية الاتجاه لتوصيل المستخدمين، لكن ليس لديهم رؤية للرسم البياني لاتصال الشبكة — إلا للمستخدمين فقط. +

+
+
+ +
+
+ +
+ + + + + +
+
+

شرح SimpleX

+ + + + + + + +
+
+ +
+
1. تجربة المستخدم
+
+ +

+ يمكنك إنشاء جهات اتصال ومجموعات وإجراء مُحادثات ثنائية الاتجاه، كما هو الحال في أي برنامج مُراسلة آخر. +

+

+ كيف يمكن أن تعمل مع قوائم انتظار أحادية الاتجاه وبدون معرّفات ملف تعريف المستخدم؟ +

+
+
+ +
+
2. كيف يعمل
+
+ +

+ لكل اتصال، تستخدم قائمتي انتظار منفصلتين للمُراسلة لإرسال واستلام الرسائل عبر خوادم مختلفة. +

+

+ تمرّر الخوادم الرسائل في اتجاه واحد فقط، دون الحصول على الصورة الكاملة لمُحادثات المستخدم أو اتصالاته. +

+
+
+ +
+
3. ما الذي تراة الخوادم
+
+ +

+ تحتوي الخوادم على بيانات اعتماد مجهولة منفصلة لكل قائمة انتظار، ولا تعرف المستخدمين الذين ينتمون إليهم. +

+

+ يمكن للمستخدمين زيادة تحسين خصوصية البيانات الوصفية باستخدام تور للوصول إلى الخوادم، ومنع الارتباط بواسطة عنوان IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

مقارنة مع البروتوكولات الأخرى

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal، منصات كبيرةXMPP ،Matrixبروتوكولات P2P
يتطلب هوية عالميةلا - خصوصينعم 1نعم 2نعم 3
احتمالية هجوم الوسيطلا - آمن 4نعم 5نعمنعم
الاعتمادية على DNSلا - مرننعمنعملا
شبكة أحادية أو مركزيةلا - لامركزينعملا - اتِحاديّ 6نعم 7
مكون مركزي أو هجوم الشبكة الواسعلا - مرننعمنعم 2نعم 8
+
+ +
+ +
+
+
    +
  1. عادة ما يكون مكوناً من رقم الهاتف، أو اسم المستخدم في بعض الأحيان
  2. +
  3. العناوين تعتمد على الـDNS
  4. +
  5. المفتاح العام أو معرّف آخر فريد وعام
  6. +
  7. مُرحلات SimpleX لا يمكنها أن تتنازل عن تعمية بين الطرفين. تحقق من رمز الأمان للتخفيف من الهجوم على القناة خارج النطاق
  8. +
  9. إذا خوادم المشغّل مُخترقة. تحقق من رمز الأمان في Signal وبعض التطبيقات الأخرى للتخفيف منه
  10. +
  11. لا يحمي خصوصية البيانات الوصفية للمستخدمين
  12. +
  13. على الرغم من أن الـP2P موزعة، إلا أنها ليست اتِحاديَّة — يعملون كشبكة واحدة
  14. +
  15. شبكات P2P إما لديها سلطة مركزية أو أن الشبكة كلها يمكن عرضة للخطر — اقرأ هنا
  16. +
+
+
+
+
+ +
+
+

مقارنة أمان التعمية بين الطرفين في برامج المُراسلة المختلفة

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
حشو الرسالة✔︎1✔︎✔︎1✔︎
الإنكار (عدم القدرة على إثبات التورط)✔︎2✔︎3✔︎
السرية المستمرة✔︎✔︎✔︎✔︎✔︎
الأمن بعد الاختراق✔︎4✔︎
تبادل مفتاح ثنائي العوامل✔︎✔︎5✔︎5✔︎✔︎5✔︎
التعمية الهجينة ما بعد الكمومي✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. يقوم Briar بحشو الرسائل إلى حجم مقرب لأعلى إلى 1024 بايت، بينما Signal يحشوها إلى 160 بايت
  2. +
  3. لا يشمل الإنكار اتصال العميل بالخادم.
  4. +
  5. يبدو أن استخدام التوقيعات المُعمّاة يضر بالإنكار (عدم القدرة على التنصل)، ولكن هذا يحتاج إلى توضيح.
  6. +
  7. تطبيقات الأجهزة المتعددة تعرض أمن Double Ratchet بعد الاختراق للخطر — اقرأ هنا.
  8. +
  9. تبادل المفاتيح الثنائي اختياري عبر التحقق من رمز الأمان.
  10. +
  11. اتفاقية مفتاح ما بعد الكم "متفرقة" — فهي تحمي بعض خطوات ratchet فقط.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/bg/contact/index.html b/bg/contact/index.html index 3f85de6cde..78dbf35b84 100644 --- a/bg/contact/index.html +++ b/bg/contact/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/bg/fdroid/index.html b/bg/fdroid/index.html index 0f5fd0c17f..ac6d0bae6f 100644 --- a/bg/fdroid/index.html +++ b/bg/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

Обяснението на SimpleX

- - - - - - - -
-
- -
-
1. Какъв опит като потребител
-
- -

- Можете да създавате контакти и групи и да провеждате двупосочни разговори, както във всеки друго чат приложение. -

-

- Как може да работи с еднопосочни опашки и без идентификатори на потребителски профили? -

-
-
- -
-
2. Как работи
-
- -

- За всяка връзка използвате две отделни опашки за съобщения, за да изпращате и получавате съобщения през различни сървъри. -

-

- Сървърите предават съобщения само еднопосочно, без да имат пълната картина от разговорите или връзките на потребителя. -

-
-
- -
-
3. Какво виждат сървърите
-
- -

- Сървърите имат отделни анонимни идентификационни данни за всяка опашка и нямат информация на кои потребители принадлежат. -

-

- Потребителите могат допълнително да подобрят поверителността на метаданните, като използват Tor за достъп до сървъри, предотвратявайки корелация по IP адрес. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparison with other protocols

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateДа 1Да 2Да 3
Possibility of MITMNo - secure 4Да 5ДаДа
Dependence on DNSNo - resilientДаДаНе
Single or Centralized networkNo - decentralizedДаNo - federated 6Да 7
Central component or other network-wide attackNo - resilientДаДа 2Да 8
-
- -
- -
-
-
    -
  1. Usually based on a phone number, in some cases on usernames
  2. -
  3. DNS-based addresses
  4. -
  5. Public key or some other globally unique ID
  6. -
  7. SimpleX релетата не могат да компрометират E2E криптирането. Проверете кода за сигурност, за да предотвратите атаката по външен носител
  8. -
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. -
  11. Does not protect users' metadata privacy
  12. -
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. -
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Join SimpleX

-

We invite you to join the conversation

- - - -

Sign up to receive our updates

- -
- - - -
- -
- -

Get SimpleX desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ + + + + + + + + - - - - diff --git a/bg/invitation/index.html b/bg/invitation/index.html index 8ccb9f6afa..ed8899eddf 100644 --- a/bg/invitation/index.html +++ b/bg/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/bg/messaging/index.html b/bg/messaging/index.html new file mode 100644 index 0000000000..07e857d093 --- /dev/null +++ b/bg/messaging/index.html @@ -0,0 +1,1927 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Характеристика

+ +
+ +
+
+ + +
+

E2E-криптирани съобщения с markdown форматиране и редактиране

+
+ +
+
+ + +
+

E2E-криптирани
изображения, видеоклипове и файлове

+
+ +
+
+ + +
+

E2E-криптирани децентрализирани групи — известни само на потребителите

+
+ +
+
+ + +
+

E2E-криптирани гласови съобщения

+
+ +
+
+ + +
+

Изчезващи съобщения

+
+ +
+
+ + +
+

E2E-криптиран
аудио и видео разговори

+
+ +
+
+ + +
+

Преносима криптирана база данни mdash; Можете да преместите профила на друго устройство

+
+ +
+
+ + +
+

Режим инкогнито —
уникален за SimpleX чат

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Временни анонимни двойки идентификатори

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Външен носител за
обмен на ключове

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

За да го предотврати SimpleX, приложенията препращат еднократни ключове през външен носител, когато се споделя адрес като линк или QR код.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2 слоя на криптиране от край до край

+
+ +

Double-ratchet protocol —
OTR messaging with perfect forward secrecy and break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Проверка на
целостта на съобщението

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Допълнителен слой на
криптиране на сървъра

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Смесване на съобщения
за намаляване на корелацията

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Сигурен идентифициран
TLS транспорт

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Възможен
достъп чрез TOR

+
+ +

To protect your IP address you can access the servers via Tor or some other transport overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Еднопосочни
опашки за съобщенията

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Множество слоеве
допълнение на съдържание

+
+ +

SimpleX uses content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Обяснението на SimpleX

+ + + + + + + +
+
+ +
+
1. Какъв опит като потребител
+
+ +

+ Можете да създавате контакти и групи и да провеждате двупосочни разговори, както във всеки друго чат приложение. +

+

+ Как може да работи с еднопосочни опашки и без идентификатори на потребителски профили? +

+
+
+ +
+
2. Как работи
+
+ +

+ За всяка връзка използвате две отделни опашки за съобщения, за да изпращате и получавате съобщения през различни сървъри. +

+

+ Сървърите предават съобщения само еднопосочно, без да имат пълната картина от разговорите или връзките на потребителя. +

+
+
+ +
+
3. Какво виждат сървърите
+
+ +

+ Сървърите имат отделни анонимни идентификационни данни за всяка опашка и нямат информация на кои потребители принадлежат. +

+

+ Потребителите могат допълнително да подобрят поверителността на метаданните, като използват Tor за достъп до сървъри, предотвратявайки корелация по IP адрес. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateДа 1Да 2Да 3
Possibility of MITMNo - secure 4Да 5ДаДа
Dependence on DNSNo - resilientДаДаНе
Single or centralized networkNo - decentralizedДаNo - federated 6Да 7
Central component or other network-wide attackNo - resilientДаДа 2Да 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX релетата не могат да компрометират E2E криптирането. Проверете кода за сигурност, за да предотвратите атаката по външен носител
  8. +
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised — see here
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — see here.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

Break-in recovery

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/blog/20201022-simplex-chat.html b/blog/20201022-simplex-chat.html index 6fad50875c..7ac1d98820 100644 --- a/blog/20201022-simplex-chat.html +++ b/blog/20201022-simplex-chat.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Simplex chat

Published: Oct 22, 2020

https://simplex.chat

@@ -410,7 +393,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20210512-simplex-chat-terminal-ui.html b/blog/20210512-simplex-chat-terminal-ui.html index fa3298808c..7791c0aa78 100644 --- a/blog/20210512-simplex-chat-terminal-ui.html +++ b/blog/20210512-simplex-chat-terminal-ui.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Announcing SimpleX Chat Prototype!

Published: May 12, 2021

For the last six months me and my son Efim have been working to bring you a working prototype of SimpleX Chat. We're excited to announce SimpleX Chat terminal client is now available here on Linux, Windows and Mac (you can either build from source or download the binary for Linux, Windows or Mac from the latest release).

@@ -418,7 +401,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20210914-simplex-chat-v0.4-released.html b/blog/20210914-simplex-chat-v0.4-released.html index 628dc46c46..262489276a 100644 --- a/blog/20210914-simplex-chat-v0.4-released.html +++ b/blog/20210914-simplex-chat-v0.4-released.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat v0.4

Published: Sep 14, 2021

Open-source decentralized chat that uses privacy-preserving message routing protocol

@@ -422,7 +405,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20211208-simplex-chat-v0.5-released.html b/blog/20211208-simplex-chat-v0.5-released.html index a789947032..011889f6c0 100644 --- a/blog/20211208-simplex-chat-v0.5-released.html +++ b/blog/20211208-simplex-chat-v0.5-released.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat v0.5

Published: Dec 08, 2021

Simplex Chat is the first chat platform that is 100% private by design - SimpleX no access to your connections graph

@@ -417,7 +400,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220112-simplex-chat-v1-released.html b/blog/20220112-simplex-chat-v1-released.html index b615fc420b..5b912a5309 100644 --- a/blog/20220112-simplex-chat-v1-released.html +++ b/blog/20220112-simplex-chat-v1-released.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat v1

Published: Jan 12, 2022

The most private and secure chat and application platform

@@ -431,7 +414,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220214-simplex-chat-ios-public-beta.html b/blog/20220214-simplex-chat-ios-public-beta.html index fa7c11188a..3e176f8362 100644 --- a/blog/20220214-simplex-chat-ios-public-beta.html +++ b/blog/20220214-simplex-chat-ios-public-beta.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat public beta for iOS

Published: Feb 14, 2022

Private and secure chat and application platform - public beta is now available for iPhones with iOS 15.

@@ -429,7 +412,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220308-simplex-chat-mobile-apps.html b/blog/20220308-simplex-chat-mobile-apps.html index 83f266786d..dd580c068b 100644 --- a/blog/20220308-simplex-chat-mobile-apps.html +++ b/blog/20220308-simplex-chat-mobile-apps.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat mobile apps for iOS and Android

Published: March 8, 2022

SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections graph

@@ -447,7 +430,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220404-simplex-chat-instant-notifications.html b/blog/20220404-simplex-chat-instant-notifications.html index 8c5bbf6548..fbb3f55b36 100644 --- a/blog/20220404-simplex-chat-instant-notifications.html +++ b/blog/20220404-simplex-chat-instant-notifications.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Instant notifications for SimpleX Chat mobile apps

Published: April 04, 2022

SimpleX Chat is the first chat platform that is 100% private by design - it has no access to your connections

@@ -488,7 +471,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220511-simplex-chat-v2-images-files.html b/blog/20220511-simplex-chat-v2-images-files.html index daf507cff6..0530729417 100644 --- a/blog/20220511-simplex-chat-v2-images-files.html +++ b/blog/20220511-simplex-chat-v2-images-files.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v2.0 - sending images and files in mobile apps

Published: May 11, 2022

New in version 2.0 - sending images and files privately

@@ -423,7 +406,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220524-simplex-chat-better-privacy.html b/blog/20220524-simplex-chat-better-privacy.html index 33be019792..689aecdafa 100644 --- a/blog/20220524-simplex-chat-better-privacy.html +++ b/blog/20220524-simplex-chat-better-privacy.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v2.1 - better conversation privacy

Published: May 24, 2022

New in version 2.1 - clearing conversations without deleting contacts

@@ -410,7 +393,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220604-simplex-chat-new-privacy-security-settings.html b/blog/20220604-simplex-chat-new-privacy-security-settings.html index 6a01592137..cc2ee60a27 100644 --- a/blog/20220604-simplex-chat-new-privacy-security-settings.html +++ b/blog/20220604-simplex-chat-new-privacy-security-settings.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v2.2 - the new privacy and security features

Published: June 4, 2022

See v2 announcement for more information about SimpleX platform and how it protects your privacy by avoiding user identities of any kind in its design - SimpleX, unlike any other messaging platform, has no identity keys or any numbers that identify its users.

@@ -428,7 +411,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html b/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html index 868135335a..9b7024ecc1 100644 --- a/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html +++ b/blog/20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX announces SimpleX Chat v3 - with encrypted calls and iOS push notifications

Published: Jul 11, 2022

New in version 3

@@ -462,7 +445,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html b/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html index 0e7b606be9..1876ffbfb1 100644 --- a/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html +++ b/blog/20220723-simplex-chat-v3.1-tor-groups-efficiency.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v3.1-beta is released - improved battery/traffic usage

Published: Jul 23, 2022

What's new

@@ -478,7 +461,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220808-simplex-chat-v3.1-chat-groups.html b/blog/20220808-simplex-chat-v3.1-chat-groups.html index f405a502bd..f01c36f225 100644 --- a/blog/20220808-simplex-chat-v3.1-chat-groups.html +++ b/blog/20220808-simplex-chat-v3.1-chat-groups.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v3.1 is released - with secret groups and server access via Tor

Published: Aug 8, 2022

What's new

@@ -477,7 +460,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220901-simplex-chat-v3.2-incognito-mode.html b/blog/20220901-simplex-chat-v3.2-incognito-mode.html index 165553b6d1..2284daea25 100644 --- a/blog/20220901-simplex-chat-v3.2-incognito-mode.html +++ b/blog/20220901-simplex-chat-v3.2-incognito-mode.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v3.2 is released - meet Incognito mode, unique to Simplex Chat

Published: Sep 1, 2022

What's new

@@ -468,7 +451,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20220928-simplex-chat-v4-encrypted-database.html b/blog/20220928-simplex-chat-v4-encrypted-database.html index c424ef89e3..26ba72e6fe 100644 --- a/blog/20220928-simplex-chat-v4-encrypted-database.html +++ b/blog/20220928-simplex-chat-v4-encrypted-database.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v4 with encrypted local database is released

Published: Sep 28, 2022

What's new in v4

@@ -491,7 +474,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html b/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html index e935e64dd9..a2517f116c 100644 --- a/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html +++ b/blog/20221108-simplex-chat-v4.2-security-audit-new-website.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Security assessment by Trail of Bits, the new website and v4.2 released

Published: Nov 8, 2022

Security assessment by Trail of Bits

@@ -521,7 +504,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20221206-simplex-chat-v4.3-voice-messages.html b/blog/20221206-simplex-chat-v4.3-voice-messages.html index 00718773f6..387a63cba0 100644 --- a/blog/20221206-simplex-chat-v4.3-voice-messages.html +++ b/blog/20221206-simplex-chat-v4.3-voice-messages.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration.

Published: Dec 6, 2022

SimpleX Chat reviews

@@ -485,7 +468,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230103-simplex-chat-v4.4-disappearing-messages.html b/blog/20230103-simplex-chat-v4.4-disappearing-messages.html index 4da7767ca0..6202e36097 100644 --- a/blog/20230103-simplex-chat-v4.4-disappearing-messages.html +++ b/blog/20230103-simplex-chat-v4.4-disappearing-messages.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language!

Published: Jan 3, 2023

What's new in v4.4

@@ -456,7 +439,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html b/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html index a024adafa4..e55a9f2d0c 100644 --- a/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html +++ b/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v4.5 released – with multiple user profiles, message draft, transport isolation and Italian interface!

Published: Feb 4, 2023

What's new in v4.5

@@ -471,7 +454,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230301-simplex-file-transfer-protocol.html b/blog/20230301-simplex-file-transfer-protocol.html index 5fdc1a6917..23305e2791 100644 --- a/blog/20230301-simplex-file-transfer-protocol.html +++ b/blog/20230301-simplex-file-transfer-protocol.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX File Transfer Protocol – a new protocol for sending large files efficiently, privately and securely.

Published: Mar 1, 2023

    @@ -502,7 +485,7 @@ file ---> | XFTP | ------> XFTP ----> | Rela
-
+ diff --git a/blog/20230328-simplex-chat-v4-6-hidden-profiles.html b/blog/20230328-simplex-chat-v4-6-hidden-profiles.html index 2197f82013..42df3105b8 100644 --- a/blog/20230328-simplex-chat-v4-6-hidden-profiles.html +++ b/blog/20230328-simplex-chat-v4-6-hidden-profiles.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage.

Published: Mar 28, 2023

What's new in v4.6

@@ -466,7 +449,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html b/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html index 9825ccbc17..7310f9500d 100644 --- a/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html +++ b/blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb.

Published: Apr 22, 2023

SimpleX Chat vision and funding:

@@ -478,7 +461,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html b/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html index 9d6dbe9111..baffd6105f 100644 --- a/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html +++ b/blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v5.1 released: message reactions and self-destruct passcode

Published: May 23, 2023

What's new in v5.1:

@@ -477,7 +460,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html b/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html index f067237f2d..b638a8c05b 100644 --- a/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html +++ b/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v5.2 released: message delivery receipts

Published: July 22, 2023

What's new in v5.2:

@@ -515,7 +498,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html b/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html index eed2a4eae6..b631b71aac 100644 --- a/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html +++ b/blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v5.3 released: desktop app, local file encryption and improved groups

Published: September 25, 2023

What's new in v5.3:

@@ -487,7 +470,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html b/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html index 853f14291a..fa881dd74e 100644 --- a/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html +++ b/blog/20231125-simplex-chat-v5-4-link-mobile-desktop-quantum-resistant-better-groups.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups.

Published: Nov 25, 2023

What's new in v5.4:

@@ -502,7 +485,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html b/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html index 8833e43d9e..4f1640208c 100644 --- a/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html +++ b/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.

Published: Jan 24, 2024

SimpleX Chat infrastructure on Linode:

@@ -475,7 +458,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html b/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html index 740cac9301..668a12ad4a 100644 --- a/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html +++ b/blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm

Published: Mar 14, 2024

This is a major upgrade for SimpleX messaging protocols, we are really proud to present the results of the hard work of our whole team on the Pi day.

@@ -563,7 +546,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html b/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html index 167c1bcf20..4a8f5d6e39 100644 --- a/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html +++ b/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration

Published: Mar 23, 2024

SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:

@@ -502,7 +485,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html b/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html index a375847a19..2b857c2563 100644 --- a/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html +++ b/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Why I joined SimpleX Chat

Published: Apr 4, 2024

By Esra'a al Shafei

@@ -416,7 +399,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240416-dangers-of-metadata-in-messengers.html b/blog/20240416-dangers-of-metadata-in-messengers.html index 3a0f0393b7..24b1b2bd19 100644 --- a/blog/20240416-dangers-of-metadata-in-messengers.html +++ b/blog/20240416-dangers-of-metadata-in-messengers.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

The dangers of metadata in messengers

Published: Apr 16, 2024

By Esra'a al Shafei

@@ -428,7 +411,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html b/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html index 91ab879c9b..a1d37b081f 100644 --- a/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html +++ b/blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: legally binding transparency, v5.7 released with better calls and messages

Published: Apr 26, 2024

What's new in v5.7:

@@ -469,7 +452,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240516-simplex-redefining-privacy-hard-choices.html b/blog/20240516-simplex-redefining-privacy-hard-choices.html index 98dff893cf..6fab175d49 100644 --- a/blog/20240516-simplex-redefining-privacy-hard-choices.html +++ b/blog/20240516-simplex-redefining-privacy-hard-choices.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX: Redefining Privacy by Making Hard Choices

Published: May 16, 2024

When it comes to open source privacy tools, the status quo often dictates the limitations of existing protocols and structures. However, these norms need to be challenged to radically shift how we approach genuinely private communication. This requires doing some uncomfortable things, like making hard choices as it relates to funding, alternative decentralization models, doubling down on privacy over convenience, and more.

@@ -436,7 +419,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240601-protecting-children-safety-requires-e2e-encryption.html b/blog/20240601-protecting-children-safety-requires-e2e-encryption.html index 3b87001440..25fbc1e1a0 100644 --- a/blog/20240601-protecting-children-safety-requires-e2e-encryption.html +++ b/blog/20240601-protecting-children-safety-requires-e2e-encryption.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Protecting Children's Safety Requires End-to-End Encryption

As lawmakers grapple with the serious issue of child exploitation online, some proposed solutions would fuel the very problem they aim to solve. Despite expert warnings, the Belgian Presidency persists in pushing for the implementation of client-side scanning on encrypted messaging services, rebranding the effort as "upload moderation". Their latest proposal mandates that providers of private communication services obtain user consent for AI-based scanning of their private chats. If users do not consent, they will be prohibited from sharing images, videos, and URLs.

Privacy critics have long pushed for measures like centralized scanning of private photos and messaging data, arguing it could detect illicit content. However, invasive monitoring of private communications would create detrimental risks that far outweigh any perceived benefits.

@@ -413,7 +396,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html b/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html index f3e38af324..d2c474c694 100644 --- a/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html +++ b/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: private message routing, v5.8 released with IP address protection and chat themes

Published: June 4, 2024

What's new in v5.8:

@@ -502,7 +485,7 @@ See F.A.Q. section<
-
+ diff --git a/blog/20240704-future-of-privacy-enforcing-privacy-standards.html b/blog/20240704-future-of-privacy-enforcing-privacy-standards.html index 67d639d623..21f0d11c8e 100644 --- a/blog/20240704-future-of-privacy-enforcing-privacy-standards.html +++ b/blog/20240704-future-of-privacy-enforcing-privacy-standards.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

The Future of Privacy: Enforcing Privacy Standards

Published: Jul 4, 2024

Recent anti-privacy legislations and proposals in Europe, the US and Australia threaten to infringe our fundamental right to privacy and to create grave risks to the safety of children and vulnerable people. It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a right users must constantly fight to protect, and not something that users can be asked to consent away as a condition of access to a service.

@@ -426,7 +409,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html b/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html index 245b695cee..e664cf1e6c 100644 --- a/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html +++ b/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing.

Published: Aug 14, 2024

SimpleX Chat: vision and funding 2.0:

@@ -562,7 +545,7 @@ A few bugs and UX issues but great foundation. Love that it’s public domain. -
+ diff --git a/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html b/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html index 101f36c4e7..c7c24affb0 100644 --- a/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html +++ b/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: security review of protocols design by Trail of Bits, v6.1 released with better calls and user experience.

Published: Oct 14, 2024

New security audit:

@@ -509,7 +492,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20241016-wired-attack-on-privacy.html b/blog/20241016-wired-attack-on-privacy.html index c33c91a6b3..abc53b9b98 100644 --- a/blog/20241016-wired-attack-on-privacy.html +++ b/blog/20241016-wired-attack-on-privacy.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Wired’s Attack on Privacy

Published: Oct 16, 2024

@@ -421,7 +404,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html b/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html index 0e556403fd..459dc3d95d 100644 --- a/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html +++ b/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Servers operated by Flux — true privacy and decentralization for all users

Published: Nov 25, 2024

    @@ -511,7 +494,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html b/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html index 1a412a4609..5bc1cc6fe1 100644 --- a/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html +++ b/blog/20241210-simplex-network-v6-2-servers-by-flux-business-chats.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps

Published: Dec 10, 2024

What's new in v6.2:

@@ -466,7 +449,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html b/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html index 31bef2bbd2..a7b165b871 100644 --- a/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html +++ b/blog/20241218-oppose-digital-ids-they-break-law-lead-to-mass-scale-surveillance.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

Oppose digital IDs – they break the law and lead to mass scale surveillance

Published: Dec 18, 2024

@@ -435,7 +418,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html b/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html index 5a8ab6cb5d..db058a023b 100644 --- a/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html +++ b/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: large groups and privacy-preserving content moderation

Published: Jan 14, 2025

@@ -488,7 +471,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html b/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html index 00f9afad61..65a26adaad 100644 --- a/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html +++ b/blog/20250308-simplex-chat-v6-3-new-user-experience-safety-in-public-groups.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v6.3: new user experience and safety in public groups

Published: Mar 8, 2025

What's new in v6.3:

@@ -502,7 +485,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html b/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html index b18999024b..0de478f4c9 100644 --- a/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html +++ b/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4

Published: Jul 3, 2025

The mission of communication network is connecting people [1]. The process of connecting in SimpleX network is really secure — it is protected from server MITM attacks. But before this beta version connecting to contacts had a really bad user experience.

@@ -534,7 +517,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html b/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html index 364774184b..cf26950bf0 100644 --- a/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html +++ b/blog/20250729-simplex-chat-v6-4-1-welcome-contacts-protect-groups-app-security.html @@ -35,6 +35,8 @@ + + @@ -59,10 +61,11 @@ + - + @@ -104,198 +107,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+ -
+

SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more.

Published: Jul 29, 2025

What's new in v6.4.1:

@@ -491,7 +474,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/blog/index.html b/blog/index.html index 2796501d39..9ba16850a4 100644 --- a/blog/index.html +++ b/blog/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,198 +110,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX vysvětlení

- - - - - - - -
-
- -
-
1. Co vidí uživatel
-
- -

- Můžete vytvářet kontakty a skupiny a vést obousměrné konverzace, stejně jako v jakémkoli jiném messengeru. -

-

- Jak může pracovat s jednosměrnými frontami a bez identifikátorů profilu uživatele? -

-
-
- -
-
2. Jak to funguje
-
- -

- Pro každé připojení používáte dvě samostatné fronty zasílání zpráv k odesílání a přijímání zpráv prostřednictvím různých serverů. -

-

- Servery předávají zprávy jednosměrně, aniž by měly úplný obraz o konverzacích nebo spojeních uživatele. -

-
-
- -
-
3. Co vidí servery
-
- -

- Servery mají samostatné anonymní přihlašovací údaje pro každou frontu a nevědí, ke kterým uživatelům patří. -

-

- Uživatelé mohou dále zlepšit soukromí metadat pomocí Tor pro přístup k serverům, což zabraňuje korelaci podle IP adresy. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Srovnání s jinými protokoly

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signál, velké platformyXMPP, MatrixP2P protokoly
Vyžaduje globální identituNe - soukromýAno 1Ano 2Ano 3
Možnost MITM útokuNe - bezpečný 4Ano 5AnoAno
Závislost na DNSNe - odolnýAnoAnoNe
Jedna nebo centralizovaná síťNe – decentralizovanýAnoNe - federovaný 6Ano 7
Centrální součást nebo jiný celosíťový útokNe - odolnýAnoAno 2Ano 8
-
- -
- -
-
-
    -
  1. Založeném obvykle na telefonním čísle a v některých případech uživatelském jménu
  2. -
  3. Adresy založené na DNS
  4. -
  5. Veřejný klíč nebo jiné globálně jedinečné ID
  6. -
  7. SimpleX relé nemůže ohrozit šifrování e2e. Ověřte bezpečnostní kód, který zmírňuje mimo pásmový útok na kanál
  8. -
  9. Pokud jsou servery operátora kompromitovány. Ověřte bezpečnostní kód v Signálu a nějaké jiné aplikaci ke zmírnění
  10. -
  11. Nechrání soukromí metadat uživatelů
  12. -
  13. Zatímco P2P jsou distribuovány, nejsou federované — fungují jako jediná síť
  14. -
  15. P2P sítě mají buď centrální autoritu, nebo může být ohrožena celá síť - viz zde
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Připojit SimpleX

-

Zveme vás k účasti na konverzaci

- - - -

Přihlaste se k odběru novinek

- -
- - - -
- -
- -

Získat SimpleX desktop app

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/cs/invitation/index.html b/cs/invitation/index.html index 15cb05e740..ac66c13ed8 100644 --- a/cs/invitation/index.html +++ b/cs/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,192 +110,186 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/cs/messaging/index.html b/cs/messaging/index.html new file mode 100644 index 0000000000..62accc37e8 --- /dev/null +++ b/cs/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Proč je SimpleX jedinečný

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Máte naprosté soukromí

+
+ +
+ +
+

+ SimpleX chrání soukromí vašeho profilu, kontaktů a metadat a skrývá je před servery SimpleX sítě a jakýmikoli pozorovateli. +

+

+ Na rozdíl od jakékoli jiné existující síti pro zasílání zpráv nemá SimpleX žádné identifikátory přiřazené uživatelům — ani náhodná čísla. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Jste chráněni
před spamem a zneužitím

+
+ +
+ +
+

+ Protože na SimpleX síti nemáte žádný identifikátor nebo pevnou adresu, nikdo vás nemůže kontaktovat pokud nenasdílíte jednorázovou nebo dočasnou uživatelskou adresu, jako QR kód nebo odkaz. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Vy kontrolujete vaše data

+
+ +
+ +
+

+ SimpleX Chat ukládá všechna uživatelská data pouze na klientských zařízeních pomocí přenosného šifrovaného databázového formátu, který lze exportovat a přenést na jakékoli podporované zařízení. +

+

+ End-to-end šifrované zprávy jsou dočasně uchovávány na přenosových serverech SimpleX, dokud nejsou přijaty, poté jsou trvale odstraněny. +

+ +
+ + + Další informace + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Vlastníte síť SimpleX

+
+ +
+ +
+

+ Síť SimpleX je plně decentralizovaná a nezávislá na jakékoli kryptoměně nebo jakékoli jiné síti než internetu. +

+

+ SimpleX můžete použít s vašimi vlastními servery nebo s námi poskytovanými servery — a přesto se připojit k libovolnému uživateli. +

+ +
+ + + Další informace + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkce

+ +
+ +
+
+ + +
+

E2E šifrované zprávy s Markdown a editací

+
+ +
+
+ + +
+

E2E šifrované
obrázky, videa a soubory

+
+ +
+
+ + +
+

E2E-šifrované decentralizované skupiny — pouze uživatelé vědí, že existují

+
+ +
+
+ + +
+

Hlasové zprávy šifrované E2E

+
+ +
+
+ + +
+

Mizící tajné konverzace

+
+ +
+
+ + +
+

E2E šifrované
hlasové a videohovory

+
+ +
+
+ + +
+

Přenosné šifrované úložiště aplikace — přesuňte profil do jiného zařízení

+
+ +
+
+ + +
+

režim Inkognito —
Unikátní pro SimpleX Chat

+
+ +
+
+
+ + +
+
+

Co dělá SimpleX soukromým

+ +
+
+ + +
+
+ + +
+
+

Dočasné anonymní párové identifikátory

+
+ +

SimpleX používá dočasné anonymní párové adresy a pověření pro každého uživatele nebo člena skupiny.

+ +

Umožňuje doručovat zprávy bez identifikátoru uživatelských profilů, což poskytuje lepší soukromí metadat než alternativy.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Out-of-band
výměna klíčů

+
+ +

Mnoho komunikačních sítí je zranitelných vůči útokům MITM ze strany serverů nebo poskytovatelů sítí.

+ +

Aby se tomu zabránilo, aplikace SimpleX předávají jednorázové klíče mimo pásmo, když sdílíte adresu jako odkaz nebo QR kód.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

2-vrstvé
end-to-end šifrování

+
+ +

Double-ratchet protokol —
OTR messaging s dokonalým dopředným utajením a obnovou po vloupání.

+ +

NaCL kryptobox v každé frontě, aby se zabránilo korelaci provozu mezi frontami zpráv, pokud je ohroženo TLS.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Ověření integrity
zprávy

+
+ +

Aby byla zaručena integrita, jsou zprávy postupně číslovány a obsahují kontrolní součet předchozí zprávy.

+ +

Pokud je jakákoli zpráva přidána, odstraněna nebo změněna, příjemce bude upozorněn.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Další vrstva
šifrování serveru

+
+ +

Další vrstva šifrování serveru pro doručení příjemci, aby se zabránilo korelaci mezi přijatým a odeslaným serverovým provozem, pokud je protokol TLS ohrožen.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Smíchání zpráv
ke snížení korelace

+
+ +

Servery SimpleX fungují jako smíšené uzly s nízkou latencí — příchozí a odchozí zprávy mají různá pořadí.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Zabezpečený ověřený
přenos TLS

+
+ +

Pro připojení klient-server se používá pouze protokol TLS 1.2/1.3 se silnými algoritmy.

+ +

Otisk serveru a vazba kanálu zabraňují útokům MITM a replay.

+ +

Obnovení připojení je zakázáno, k zabránění útokům na relace.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Volitelný
přístup přes Tor

+
+ +

Pro ochranu vaší IP adresy můžete přistupovat k serverům přes Tor nebo jinou transportní překryvnou síť.

+ +

Pro použití SimpleX přes Tor prosím nainstalujte Orbot aplikaci a povolte SOCKS5 proxy (nebo VPN na iOS).

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Jednosměrné
fronty zpráv

+
+ +

Každá fronta zpráv předává zprávy v jednom směru s různými adresami pro odesílání a přijímání.

+ +

Snižuje vektory útoku ve srovnání s tradičními zprostředkovateli zpráv a dostupnými metadaty.

+ +
+

Klepnutím zavřete

+
+
+ +
+
+ + +
+
+

Více vrstev
odsazení obsahu

+
+ +

SimpleX používá odsazení obsahu pro každou šifrovací vrstvu, aby zmařil útoky na velikost zprávy.

+ +

Díky tomu vypadají zprávy různých velikostí pro servery a síťové pozorovatele stejně.

+ +
+

Klepnutím zavřete

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Síť

+

Simplex Chat poskytuje nejlepší soukromí tím, že kombinuje výhody P2P a federovaných sítí.

+ +
+
+
+ + +
+
+

Na rozdíl od P2P sítí

+

+ Všechny zprávy se odesílají přes servery, což zajišťuje lepší soukromí metadat a spolehlivé asynchronní doručování zpráv, přičemž se zamezuje mnoha problémům P2P sítí. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Na rozdíl od federovaných sítí

+

+ Přenosové servery SimpleX NEUKLADAJÍ uživatelské profily, kontakty a doručené zprávy, NEPŘIPOJUJÍ se k sobě a NEEXISTUJE ŽÁDNÝ adresář serverů. +

+
+
+ + + +
+
+ + +
+
+

SimpleX síť

+

+ servery poskytují jednosměrné fronty pro připojení uživatelů, ale nemají žádnou viditelnost grafu síťového připojení — pouze uživatelé mají. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX vysvětlení

+ + + + + + + +
+
+ +
+
1. Co vidí uživatel
+
+ +

+ Můžete vytvářet kontakty a skupiny a vést obousměrné konverzace, stejně jako v jakémkoli jiném messengeru. +

+

+ Jak může pracovat s jednosměrnými frontami a bez identifikátorů profilu uživatele? +

+
+
+ +
+
2. Jak to funguje
+
+ +

+ Pro každé připojení používáte dvě samostatné fronty zasílání zpráv k odesílání a přijímání zpráv prostřednictvím různých serverů. +

+

+ Servery předávají zprávy jednosměrně, aniž by měly úplný obraz o konverzacích nebo spojeních uživatele. +

+
+
+ +
+
3. Co vidí servery
+
+ +

+ Servery mají samostatné anonymní přihlašovací údaje pro každou frontu a nevědí, ke kterým uživatelům patří. +

+

+ Uživatelé mohou dále zlepšit soukromí metadat pomocí Tor pro přístup k serverům, což zabraňuje korelaci podle IP adresy. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Srovnání s jinými protokoly

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signál, velké platformyXMPP, MatrixP2P protokoly
Vyžaduje globální identituNe - soukromýAno 1Ano 2Ano 3
Možnost MITM útokuNe - bezpečný 4Ano 5AnoAno
Závislost na DNSNe - odolnýAnoAnoNe
Jedna nebo centralizovaná síťNe – decentralizovanýAnoNe - federovaný 6Ano 7
Centrální součást nebo jiný celosíťový útokNe - odolnýAnoAno 2Ano 8
+
+ +
+ +
+
+
    +
  1. Založeném obvykle na telefonním čísle a v některých případech uživatelském jménu
  2. +
  3. Adresy založené na DNS
  4. +
  5. Veřejný klíč nebo jiné globálně jedinečné ID
  6. +
  7. SimpleX relé nemůže ohrozit šifrování e2e. Ověřte bezpečnostní kód, který zmírňuje mimo pásmový útok na kanál
  8. +
  9. Pokud jsou servery operátora kompromitovány. Ověřte bezpečnostní kód v Signálu a nějaké jiné aplikaci ke zmírnění
  10. +
  11. Nechrání soukromí metadat uživatelů
  12. +
  13. Zatímco P2P jsou distribuovány, nejsou federované — fungují jako jediná síť
  14. +
  15. P2P sítě mají buď centrální autoritu, nebo může být ohrožena celá síť — viz zde
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — viz zde.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/css/blog.css b/css/blog.css index f92998f301..5e86e7fb5d 100644 --- a/css/blog.css +++ b/css/blog.css @@ -1,3 +1,4 @@ +h1, #article h1 { font-size: 38px; font-weight: 700; @@ -19,9 +20,10 @@ } } +.dark h1, .dark #article h1 { - background: -webkit-linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); - background: linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + background: -webkit-linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); + background: linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; @@ -190,12 +192,12 @@ h3::before { outline: none; } -h1, -h2, -h3, -h4, -h5, -h6 { +#article h1, +#article h2, +#article h3, +#article h4, +#article h5, +#article h6 { clear: both; } @@ -220,7 +222,7 @@ h6 { } @media (max-width:768px) { - img { + #article img { width: 100%; } } diff --git a/css/design3-nav.css b/css/design3-nav.css new file mode 100644 index 0000000000..8a72c7fd17 --- /dev/null +++ b/css/design3-nav.css @@ -0,0 +1,644 @@ +:root { + --nav-color: #001796; +} + +:root.dark { + --nav-color: #ffffff; +} + +body.change-nav-color { + --nav-color: #001796; +} + +@media screen and (min-width: 960px) { + .logo { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom-right-radius: 12px; + padding-right: 24px; + transition: all 0.3s ease; + } + + .dark .logo { + background: rgba(19, 29, 73, 0.005); + } + + nav#menu { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + padding: 0px 50px; + border-bottom-right-radius: 12px; + border-bottom-left-radius: 12px; + transition: all 0.3s ease; + } + + .dark nav#menu { + background: rgba(19, 29, 73, 0.005); + } + + .right-links { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom-left-radius: 12px; + padding-left: 24px; + transition: all 0.3s ease; + } + + .dark .right-links { + background: rgba(19, 29, 73, 0.005); + } +} + +/* NavBar */ +header#navbar { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 50000; + background: none; + + display: flex; + align-items: center; + justify-content: center; + height: 54px; +} + +header#navbar>a.logo { + position: absolute; + left: 0px; + padding-left: 30px; + padding-top: 2px; + height: 100%; + /* display: flex; */ + align-items: center; +} + +header#navbar>a.logo img { + height: 40px; + width: auto; +} + +header#navbar nav#menu>ul>hr { + display: none; +} + +header#navbar nav#menu ul.sub-menu hr { + border-top-width: 1px; + height: 1px; + width: 100%; + color: #000; + opacity: 0.2; +} + +.dark header#navbar nav#menu ul.sub-menu hr { + color: #fff; +} + +header#navbar ul { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 60px; + list-style: none; +} + +@media screen and (max-width: 1279px) { + header#navbar ul { + gap: 48px; + } +} + +@media screen and (max-width: 1024px) { + header#navbar ul { + gap: 40px; + } +} + +header#navbar ul a { + font-family: "Manrope", sans-serif; + color: white; + text-decoration: none; + font-size: 16px; + font-weight: 500; + padding: 8px 0; + + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + white-space: nowrap; +} + +@media screen and (min-width: 960px) { + header#navbar ul .nav-link a, + header#navbar ul .nav-link-text { + font-size: 18px; + } + + header#navbar ul .nav-link .sub-menu a { + font-size: 16px; + } +} + +.box-btn { + height: 36px; + padding: 0 11px; + display: flex; + align-items: center; + justify-content: center; + font-size: 21px !important; + font-family: 'Manrope', sans-serif !important; + font-weight: 700 !important; + letter-spacing: -0.25px !important; + border-radius: 6px !important; +} + +.box-btn.btn-1 { + background-color: #639bd9; +} + +.dark .box-btn.btn-1 { + background-color: #44547D; +} + +.box-btn.token { + height: 34px; + font-size: 17px !important; + font-weight: 500 !important; + background: linear-gradient(90deg, #019bfe 0%, #2e3fa0 100%); + color: white; +} + +.box-btn.gold-gradient, +.dark .box-btn.token { + background: linear-gradient(90deg, + #ffb55d 0%, + #fff494 50%, + #fbffdd 100%); + color: black; +} + +.change-nav-color .box-btn.token { + background: linear-gradient(90deg, #019bfe 0%, #2e3fa0 100%); + color: white; +} + +header#navbar ul a span { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +header#navbar ul a>span:first-child { + transform: translateY(-1.5px); +} + +header#navbar ul a span svg { + fill: #001796; + width: 10px; + height: auto; + transition: all 0.5s ease; +} + +.dark header#navbar ul a span svg { + fill: #fff; +} + +@media screen and (min-width: 960px) { + header#navbar nav#menu>ul>li>a { + color: var(--nav-color); + } + + header#navbar nav#menu>ul>li>a svg { + fill: var(--nav-color); + } + + header#navbar nav#menu li.nav-link:hover span svg { + transform: rotate(180deg); + } +} + +header#navbar ul.sub-menu { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 0.5rem; + max-height: calc(100vh - 70px); + position: absolute; + background: #fff; + border: solid 1px #f2f2f7; + top: calc(100% + 8px); + padding: 16px 0; + min-width: 180px; + border-radius: 8px; + transition: all .3s ease !important; + overflow: auto; + visibility: hidden; + opacity: 0; +} + +.dark header#navbar ul.sub-menu { + background: #181e43; + border: none; +} + +header#navbar ul.sub-menu li a { + padding: 3px 20px; + font-weight: 400; + white-space: nowrap; + display: flex; + align-items: center; + gap: 4px; + color: #001796; +} + +.dark header#navbar ul.sub-menu li a { + color: #ffffff; +} + +header#navbar ul.sub-menu li a img { + height: 1rem; +} + +header#navbar .nav-link.flag-container ul.sub-menu li a { + display: flex; + align-items: center; + gap: 16px; + white-space: nowrap; +} + +header#navbar nav#menu, +header#navbar nav#menu>ul { + height: 100%; +} + +header#navbar .nav-link { + position: relative; +} + +header#navbar .nav-link:hover .sub-menu, +header#navbar .nav-link:focus-within .sub-menu { + visibility: visible; + opacity: 1; + margin-top: 0; +} + +.flag-container>a { + background-color: transparent; + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + color: #001796; + text-decoration: none; +} + +.dark .flag-container>a { + color: white; +} + +.flag-container>a svg { + fill: #001796; + width: 10px; + height: auto; +} + +.dark .flag-container>a svg { + fill: white; +} + +@media screen and (min-width: 960px) { + .flag-container>a { + color: var(--nav-color) !important; + } + + .flag-container>a svg { + fill: var(--nav-color) !important; + } +} + +.flag-container>a p { + font-size: 14px; + font-family: "Manrope", sans-serif; + font-weight: 500; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + line-height: 1rem; + letter-spacing: 0.05em; + text-transform: uppercase; +} + +.flag-container .sub-menu a div { + display: flex; + align-items: center; + justify-content: center; +} + +.flag-container .sub-menu { + top: 100%; + right: 0; +} + +header#navbar button.theme-switch-btn { + display: flex; + align-items: center; + justify-content: center; + background-color: transparent; + border: none; +} + +header#navbar button.theme-switch-btn svg { + width: 20px; + height: auto; +} + +header#navbar button.theme-switch-btn svg path { + fill: #001796; + transition: all 0.3s ease; +} + +.dark header#navbar button.theme-switch-btn svg path { + fill: white; +} + +@media screen and (min-width: 960px) { + header#navbar button.theme-switch-btn svg path { + fill: var(--nav-color) !important; + transition: all 0.3s ease; + } +} + +.right-links { + position: absolute; + top: 0; + right: 0px; + padding-right: 20px; + height: 54px; + display: flex; + align-items: center; + gap: 1.5rem; +} + +button#cross-btn { + background-color: transparent; + border: none; + display: none; + align-items: center; + justify-content: center; + cursor: pointer; +} + +#cross { + fill: #001796; + width: 13px; + height: auto; +} + +.dark #cross { + fill: #ffffff; +} + +#mobile-header { + display: none; + padding: 0 1rem; +} + +#mobile-header a.logo img { + height: 32px; +} + +#mobile-header button#hamburger { + height: 36px; + background-color: transparent; + border: none; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +#mobile-header button#hamburger svg { + fill: var(--nav-color) !important; + width: 20px; + height: auto; +} + +@media (max-width: 959px) { + #mobile-header { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 54px; + background: transparent; + + display: flex; + align-items: center; + justify-content: space-between; + z-index: 50000; + } + + header#navbar { + height: 100%; + width: 100%; + background: #fff; + visibility: hidden; + opacity: 0; + transition: all .3s ease; + transform: translateX(-100%); + } + + .dark header#navbar { + background: #0a0f2b; + } + + header#navbar.open { + visibility: visible; + opacity: 1; + transform: translateX(0); + z-index: 60000; + } + + header#navbar>a.logo { + height: fit-content; + top: 16px; + } + + header#navbar>a.logo img { + height: 28px; + } + + .right-links { + top: 0px; + } + + header#navbar ul a span svg { + width: 18px; + } + + header#navbar nav#menu>ul { + flex-direction: column; + justify-content: flex-start; + gap: 0; + } + + header#navbar nav#menu { + position: fixed !important; + top: 54px; + left: 0; + width: 100%; + height: calc(100% - 54px); + overflow: auto; + padding: 0.5rem 0; + } + + header#navbar nav#menu .nav-link { + width: 100%; + } + + header#navbar nav#menu .nav-link a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 300; + font-size: 18px; + width: 100%; + justify-content: space-between; + justify-content: flex-start; + gap: 10px; + padding: 0px; + padding: 6px 2rem; + color: #001796; + } + + .dark header#navbar nav#menu .nav-link a { + color: #ffffff; + } + + header#navbar nav#menu .nav-link>a { + font-size: 28px; + padding: 1rem 2rem; + } + + header#navbar nav#menu ul.sub-menu hr { + width: 100%; + } + + header#navbar nav#menu ul.sub-menu hr { + margin: 1rem 2rem; + width: calc(100% - 4rem); + } + + header#navbar nav#menu ul.sub-menu { + position: static; + } + + header#navbar nav#menu .sub-menu { + max-height: 0; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all .7s ease !important; + overflow: hidden; + border-radius: 0; + background-color: transparent; + margin-top: 0; + padding: 0rem 1.5rem; + gap: 0; + } + + header#navbar nav#menu .sub-menu li { + width: 100%; + } + + header#navbar nav#menu .sub-menu li a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 300; + width: 100%; + } + + .dark header#navbar nav#menu .sub-menu li a { + font-weight: 200; + } + + header#navbar nav#menu .active .sub-menu { + max-height: 1000px; + transform: translateY(0px); + padding: 0.5rem 1.5rem; + opacity: 1; + visibility: visible; + margin-top: 0; + } + + button#cross-btn { + display: flex; + cursor: pointer; + } +} + +/* underline animation on hover */ +@media (min-width:950px) { + .nav-link-text { + display: inline-block; + position: relative; + } + + .nav-link-text::before, + .active .nav-link-text::before { + content: ""; + position: absolute; + width: 0; + height: 1px; + bottom: 0; + right: 0; + background-color: var(--nav-color); + transition: width 0.25s ease-out; + } + + .nav-link:hover .nav-link-text::before, + .active .nav-link-text::before { + width: 100%; + left: 0; + right: auto; + } +} + +#mobile-header.cover { + background: #d7fbfe09; +} + +.dark #mobile-header.cover { + background: #283b630a; +} + +#mobile-header.main { + background: #ffefd60e; +} + +.dark #mobile-header.main { + background: #fff6e00a; +} + +#mobile-header.nav-open { + background: #ffffff0c; +} + +.dark #mobile-header.nav-open { + background: #0a0f2b0f; +} + +#mobile-header.footer { + background: #d3e9ff11; +} + +.dark #mobile-header.footer { + background: #080d250e; + --nav-color: #ffffff; +} \ No newline at end of file diff --git a/css/design3.css b/css/design3.css new file mode 100644 index 0000000000..6b63c769a9 --- /dev/null +++ b/css/design3.css @@ -0,0 +1,1461 @@ +/* ======================= + GT-Walsheim (WOFF2) + Family: "GT-Walsheim" + Weights mapped: Thin(100), Ultra-Light(200), Light(300), Regular(400), + Medium(500), Bold(700), Ultra-Bold(800), Black(900) +======================= */ + +/* Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Light.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Light-Oblique.woff2") format("woff2"); + font-weight: 300; + font-style: oblique; + font-display: swap; +} + +/* Regular */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Regular.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Regular-Oblique.woff2") format("woff2"); + font-weight: 400; + font-style: oblique; + font-display: swap; +} + +/* Medium */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Medium.woff2") format("woff2"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Medium-Oblique.woff2") format("woff2"); + font-weight: 500; + font-style: oblique; + font-display: swap; +} + +/* Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Bold.woff2") format("woff2"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Bold-Oblique.woff2") format("woff2"); + font-weight: 700; + font-style: oblique; + font-display: swap; +} + +/* ======================= + Manrope (TTF) + Family: "Manrope" + Weights mapped per name +======================= */ + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraBold.ttf") format("truetype"); + font-weight: 800; + font-style: normal; + font-display: swap; +} + +:root { + --bg-grad: linear-gradient(10deg, + #e8f3ff 0%, + #c0e2ff 40%, + #e9ffff 80%, + #ffefd6 90%); + + /* Compute cover drawn size and inner safe frame (60% of full image on each axis) */ + /* --cover-bg-w: calc(min((3200 / 1920) * 100vw, (3200 / 1080) * 100vh)); + --cover-bg-h: calc(min((1800 / 1920) * 100vw, (1800 / 1080) * 100vh)); + --cover-safe-w: calc(var(--cover-bg-w) * 0.6); + --cover-safe-h: calc(var(--cover-bg-h) * 0.6); + --cover-vw: calc(var(--cover-safe-w) / 100); + --cover-vh: calc(var(--cover-safe-h) / 100); */ + /* 1920/3200 */ + /* 1080/1800 */ + + --cover-bg-w: calc(min((3200 / 1920) * 100vw, (3200 / 1080) * 100vh)); + --cover-bg-h: calc(min((1800 / 1920) * 100vw, (1800 / 1080) * 100vh)); + + /* Drawn background size derived from viewport — no cropping (contain-like) */ + --sec-w: calc(min((1920 / 1920) * 100vw, (1920 / 1080) * 100vh)); + --sec-h: calc(min((1080 / 1920) * 100vw, (1080 / 1080) * 100vh)); + --sec-vwu: calc(var(--sec-w) / 100); + --sec-vhu: calc(var(--sec-h) / 100); +} + +:root.dark { + --bg-grad: linear-gradient(9.2deg, + #000000 0%, + #131d49 52%, + #3f5598 65%, + #c3faff 85%, + #fff6e0 90%); +} + +@media screen and (max-width: 959px) { + :root { + --bg-grad: linear-gradient(30deg, + #e8f3ff 0%, + #c0e2ff 40%, + #e9ffff 80%, + #ffefd6 90%); + + /* Cover background for mobile */ + --cover-bg-w: calc(min((3200 / 620) * 100vw, (3200 / 1080) * 100vh)); + --cover-bg-h: calc(min((1800 / 620) * 100vw, (1800 / 1080) * 100vh)); + + /* Drawn background size for mobile */ + --sec-w: calc(min((620 / 620) * 100vw, (620 / 1080) * 100vh)); + --sec-h: calc(min((1080 / 620) * 100vw, (1080 / 1080) * 100vh)); + --sec-vwu: calc(var(--sec-w) / 100); + --sec-vhu: calc(var(--sec-h) / 100); + } + + :root.dark { + --bg-grad: linear-gradient(30deg, + #000000 0%, + #131d49 52%, + #3f5598 65%, + #c3faff 85%, + #fff6e0 90%); + } +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + border-color: #000; +} + +.dark * { + border-color: #fff; +} + +html { + scroll-behavior: smooth; + font-family: GT-Walsheim, Gilroy, Helvetica, sans-serif; +} + +html, +body { + background: #ffffff; +} + +.dark html, +.dark body { + background: #0a0f2b; +} + +@media screen and (min-width: 960px) { + html { + overscroll-behavior: none; + } +} + +/* .hidden { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; +} + +:is(.dark .dark\:hidden) { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; +} */ + +.lock-scroll { + overflow: hidden !important; +} + +img { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +a, +p { + word-wrap: break-word; +} + +.gradient-text { + background: linear-gradient(100deg, + #ffb55d 0%, + #fff494 50%, + #fbffdd 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +.page .text-container a.gradient-text { + background: linear-gradient(90deg, + #001aa7 0%, + #0095e7 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +.dark .gradient-text, +.dark .page .text-container a.gradient-text { + background: linear-gradient(90deg, + #019bfe 0%, + #64fdff 58%, + #c8feff 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +/* Let the PAGE (body) scroll so Safari collapses the address bar. + Keep .screen as a regular wrapper (no own scrolling). */ +.screen { + height: auto; + overflow: visible; +} + +/* Make the viewport the scroll snap container (works in iOS Safari) */ +html { + scroll-snap-type: y mandatory; + scroll-behavior: smooth; + -webkit-overflow-scrolling: touch; +} + +html.lock-scroll { + scroll-snap-type: none !important; +} + +.lock-scroll body { + overflow: hidden !important; + height: 100svh; +} + +section.page { + min-height: 100svh; + /* fallback */ + height: 100svh; + scroll-snap-align: start; + scroll-snap-stop: always; + /* requires a full swipe/scroll to leave */ + position: relative; + + display: flex; + justify-content: center; + align-items: center; + z-index: 2; +} + +.chrome-ios section.page, +.safari-ios section.page { + min-height: 110lvh; + /* fallback */ + height: 110lvh; + padding-bottom: calc(110lvh - 100svh); +} + +.chrome-android section.page { + min-height: 100lvh; + /* fallback */ + height: 100lvh; + padding-bottom: calc(100lvh - 100svh); + z-index: 10; +} + +section.page .area { + width: var(--sec-w); + height: var(--sec-h); + z-index: 11; + /* border: 2px solid red; */ +} + +#directory .area { + position: relative; +} + +/* --- COVER --- */ +section.cover { + background-image: url("/img/design_3/cover-light.webp"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; + z-index: 12; +} + +.dark section.cover { + background-image: url("/img/design_3/cover.webp"); +} + +.chrome-ios section.cover, +.safari-ios section.cover { + background-position: center calc(50% - calc(110lvh - 100svh) / 2); +} + +.chrome-android section.cover { + background-position: center calc(50% - calc(100lvh - 100svh) / 2); +} + +section.cover div.content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + gap: calc(var(--sec-vhu) * 3.5); + width: var(--sec-w); + height: var(--sec-h); +} + +section.cover div.content h1 { + font-family: "GT-Walsheim", "Manrope", sans-serif; + font-weight: 600; + font-size: calc(var(--sec-vwu) * 11.7); + line-height: 0.9; + letter-spacing: -0.025em; + color: #ffffff; + text-align: center; +} + +section.cover div.content h1 .small { + font-size: calc(var(--sec-vwu) * 8); +} + +section.cover div.content h1 .medium { + font-size: calc(var(--sec-vwu) * 10); +} + +section.cover div.content h2 { + font-family: "GT-Walsheim", "Manrope", sans-serif; + font-weight: 300; + font-size: calc(var(--sec-vwu) * 2.7); + letter-spacing: -0.025em; + line-height: 1.2; +} + +section.cover div.content p { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu) * 1.6); + align-items: center; + color: #ffffff; + max-width: calc(var(--sec-vwu) * 25); +} + +.publications-btns { + position: absolute; + bottom: 24px; + left: 30px; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 12px; +} + +.publications-btns img { + width: 32px; +} + +.publications-btns img.kuketz { + width: 38px; +} + +.publications-btns img.whonix { + width: 30px; +} + +.security-btns { + position: absolute; + bottom: 24px; + left: 0; + transform: translateX(calc((100vw / 2) - 50%)); + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 12px; +} + +.security-btns img { + height: 36px; +} + +.security-audits { + font-size: 14px !important; + font-family: 'Manrope', 'GT-Walsheim', sans-serif !important; + font-weight: 300 !important; + text-align: left; + color: white; + line-height: 1.2; +} + +@media screen and (max-width: 1279px) { + .publications-btns { + display: none; + visibility: hidden; + } + + .security-btns { + transform: translateX(0); + left: 16px; + } +} + +.socials { + position: absolute; + bottom: 22px; + right: 30px; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + flex-wrap: wrap; +} + +.socials a img { + width: auto; + height: 40px; + border: #4f4f4f 1px solid; + border-radius: 6px; +} + +.socials a img.no-border { + border: none; +} + +.desktop-app-btn .btn-content { + height: 40px; + background-color: #000; + border: #4f4f4f 1px solid; + border-radius: 6px; + padding: 6px 10px; + + display: flex; + align-items: center; + justify-content: center; + gap: 10px; +} + +.desktop-app-btn .btn-content p { + margin: 0; + font-size: 11px !important; + font-family: 'Manrope', 'GT-Walsheim', sans-serif !important; + font-weight: 300 !important; + line-height: 1.2 !important; + text-align: left; + color: #fff; +} + +.desktop-app-btn .btn-content img { + height: 24px !important; + width: auto; +} + +.desktop-app-btn .btn-content>div { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; +} + +@media screen and (max-width: 959px) { + + .publications-btns, + .security-btns, + .socials { + position: static; + } +} + +/* --- MAIN SECTIONS --- */ +main { + position: relative; + isolation: isolate; +} + +main .section-bg { + position: sticky; + top: 0; + inset: 0; + height: 100lvh; + margin-bottom: -100lvh; + /* cancel own layout height */ + width: 100%; + background-image: var(--bg-grad); + background-position: center; + background-size: 102% 102%; + background-repeat: no-repeat; + z-index: -1; + pointer-events: none; +} + +.chrome-ios main .section-bg, +.safari-ios main .section-bg { + height: 110lvh; + margin-bottom: -110lvh; +} + +.page-2 { + background-image: url("/img/design_3/section-2-desktop-light.webp"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; +} + +.dark .page-2 { + background-image: url("/img/design_3/section-2-desktop.webp"); +} + +.page-3 { + background-image: url("/img/design_3/section-3-desktop-light.webp"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; +} + +.dark .page-3 { + background-image: url("/img/design_3/section-3-desktop.webp"); +} + +.page-4 { + background-image: url("/img/design_3/section-4-desktop-light.webp"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; +} + +.dark .page-4 { + background-image: url("/img/design_3/section-4-desktop.webp"); +} + +.page-5 { + background-image: url("/img/design_3/section-5-desktop-light.webp"); + background-size: var(--cover-bg-w) var(--cover-bg-h); + background-position: center; + background-repeat: no-repeat; +} + +.dark .page-5 { + background-image: url("/img/design_3/section-5-desktop.webp"); +} + +@media screen and (max-width: 959px) { + .page-2 { + background-image: url("/img/design_3/section-2-mobile-light.webp"); + background-size: auto calc(var(--cover-bg-h) * 0.84); + background-position: 51.5% calc(50% - calc(var(--sec-vhu) * 2)) !important; + } + + .chrome-ios .page-2, + .safari-ios .page-2 { + background-position: 51.5% calc(50% - (calc(var(--sec-vhu) * 2) + (calc(110lvh - 100svh) / 2))) !important; + } + + .chrome-android .page-2 { + background-position: 51.5% calc(50% - (calc(var(--sec-vhu) * 2) + (calc(100lvh - 100svh) / 2))) !important; + } + + .dark .page-2 { + background-image: url("/img/design_3/section-2-mobile.webp"); + } + + .page-3 { + background-image: url("/img/design_3/section-3-mobile-light.webp"); + background-size: auto calc(var(--cover-bg-h) * 0.8); + background-position: 50% calc(50% - calc(var(--sec-vhu) * 4.5)) !important; + } + + .chrome-ios .page-3, + .safari-ios .page-3 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 4.5) + (calc(110lvh - 100svh) / 2))) !important; + } + + .chrome-android .page-3 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 4.5) + (calc(100lvh - 100svh) / 2))) !important; + } + + .dark .page-3 { + background-image: url("/img/design_3/section-3-mobile.webp"); + } + + .page-4 { + background-image: url("/img/design_3/section-4-mobile-light.webp"); + background-size: auto calc(var(--cover-bg-h) * 0.84); + background-position: 50% calc(50% - calc(var(--sec-vhu) * 2)) !important; + } + + .chrome-ios .page-4, + .safari-ios .page-4 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 2) + (calc(110lvh - 100svh) / 2))) !important; + } + + .chrome-android .page-4 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 2) + (calc(100lvh - 100svh) / 2))) !important; + } + + .dark .page-4 { + background-image: url("/img/design_3/section-4-mobile.webp"); + } + + .page-5 { + background-image: url("/img/design_3/section-5-mobile-light.webp"); + background-size: auto calc(var(--cover-bg-h) * 0.84); + background-position: 50% calc(50% - calc(var(--sec-vhu) * 3)) !important; + } + + .chrome-ios .page-5, + .safari-ios .page-5 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 3) + (calc(110lvh - 100svh) / 2))) !important; + } + + .chrome-android .page-5 { + background-position: 50% calc(50% - (calc(var(--sec-vhu) * 3) + (calc(100lvh - 100svh) / 2))) !important; + } + + .dark .page-5 { + background-image: url("/img/design_3/section-5-mobile.webp"); + } +} + +.page .text-container { + position: relative; + color: white; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: calc(var(--sec-vhu) * 3.25); + margin-right: calc(var(--sec-vwu)*7.5); + margin-left: calc(var(--sec-vwu)*7.5); + width: fit-content; + z-index: 1; +} + +.page .text-container h2 { + font-family: "GT-Walsheim", "Manrope", sans-serif; + font-weight: 300; + font-size: calc(var(--sec-vwu)*4.94); + letter-spacing: -0.025em; + line-height: 1.05; + max-width: calc(var(--sec-vwu)*26); + color: #023789; +} + +.dark .page .text-container h2 { + color: #ffffff; +} + +.page .text-container p { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu)*1.62); + max-width: calc(var(--sec-vwu)*23); + color: #000000; +} + +.dark .page .text-container p { + color: #ffffff; +} + +.page .text-container p span { + font-weight: 500; +} + +.page .text-container a { + font-family: "Manrope", "GT-Walsheim", sans-serif; + font-weight: 200; + font-size: calc(var(--sec-vwu)*1.62); + text-decoration: underline; + text-decoration-line: underline; + text-decoration-thickness: 0.5px; + text-underline-offset: 4px; + max-width: calc(var(--sec-vwu)*14); +} + +.page-2 .text-container h2 { + max-width: calc(var(--sec-vwu)*26) !important; +} + +.page-2 .text-container p { + max-width: calc(var(--sec-vwu)*23) !important; +} + +.page-3 .text-container h2 { + max-width: calc(var(--sec-vwu)*29) !important; +} + +.page-3 .text-container p { + max-width: calc(var(--sec-vwu)*31) !important; +} + +.page-3 .text-container, +.page-4 .text-container { + margin-left: auto; +} + +.page-4 .text-container h2 { + max-width: calc(var(--sec-vwu)*26) !important; +} + +.page-4 .text-container p { + max-width: calc(var(--sec-vwu)*30) !important; +} + +.page-4 .text-container a { + max-width: calc(var(--sec-vwu)*30) !important; +} + +.page-5 .text-container h2 { + max-width: calc(var(--sec-vwu)*23) !important; +} + +.page-5 .text-container p { + max-width: calc(var(--sec-vwu)*30) !important; +} + +.page-6 .text-container p { + max-width: calc(var(--sec-vwu)*21) !important; +} + +.page-6 .text-container a { + max-width: calc(var(--sec-vwu)*21) !important; +} + +.roadmap p:first-of-type, +.roadmap>p:first-of-type { + font-weight: 500; + color: #009df7; +} + +.dark .roadmap p:first-of-type, +.dark .roadmap>p:first-of-type { + color: #64fdff; +} + +/* .dark .roadmap>p:first-child {} */ + +.roadmap>p:nth-child(2) { + font-weight: 500; +} + +.roadmap>p:nth-child(3) { + font-weight: 200; +} + +.roadmap p { + max-width: 30vw; +} + +.roadmap p.title span { + display: none; +} + +@media (max-width: 959px) { + section.cover div.content { + gap: calc(var(--sec-vhu) * 2.5); + transform: translateY(calc(var(--sec-vhu) * 5)); + } + + .publications-btns, + .security-btns, + .socials { + margin-top: calc(var(--sec-vhu) * 2); + } + + section.cover div.content h1 { + line-height: 0.85; + font-weight: 700; + font-size: calc(var(--sec-vwu) * 30); + } + + section.cover div.content h1 .small { + font-size: calc(var(--sec-vwu) * 16); + } + + section.cover div.content h1 .medium { + font-size: calc(var(--sec-vwu) * 24); + } + + section.cover div.content h2 { + font-weight: 400; + font-size: calc(var(--sec-vwu) * 7); + } + + section.cover div.content p { + font-weight: 400; + font-size: calc(var(--sec-vwu) * 4.3); + max-width: calc(var(--sec-vwu) * 65); + } + + + /* --- MAIN SECTIONS --- */ + .page .text-container { + justify-content: flex-end; + align-items: flex-start; + gap: calc(var(--sec-vhu) * 2); + margin-right: calc(var(--sec-vwu) * 7) !important; + margin-left: calc(var(--sec-vwu) * 7) !important; + padding-bottom: calc(var(--sec-vwu) * 8); + max-width: fit-content !important; + } + + .page .text-container h2 { + font-weight: 400; + font-size: calc(var(--sec-vwu) * 13.6); + max-width: calc(var(--sec-vwu) * 80) !important; + line-height: 1; + } + + .page .text-container p { + font-weight: 300; + font-size: calc(var(--sec-vwu) * 4.2); + max-width: calc(var(--sec-vwu) * 80) !important; + } + + .page .text-container p span { + font-weight: 700; + } + + .page .text-container a { + font-weight: 300; + font-size: calc(var(--sec-vwu) * 4.2); + max-width: calc(var(--sec-vwu) * 80) !important; + } + + .page-3 .text-container, + .page-4 .text-container { + margin-left: 0; + } + + .page-2 .text-container h2 { + max-width: calc(var(--sec-vwu) * 72) !important; + } + + .roadmap { + width: calc(var(--sec-vwu) * 85) !important; + } + + .roadmap>p:first-child { + float: left; + } + + .roadmap p.title span { + display: inline; + } + + .roadmap p.title { + max-width: calc(var(--sec-vwu) * 85) !important; + color: #009df7; + } + + .dark .roadmap p.title { + color: #64fdff; + } + + .roadmap>p { + font-weight: 400; + max-width: calc(var(--sec-vwu) * 90) !important; + } +} + +.page-6 .group-images { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: calc(var(--sec-vwu) * 65); + padding: calc(var(--sec-vhu) * 10.5) calc(var(--sec-vwu) * 2.5); + z-index: 0; + + display: grid; + grid-template-columns: repeat(8, 1fr); + grid-template-rows: repeat(6, 1fr); + gap: calc(var(--sec-vwu) * 2.1); + z-index: 2; +} + +.page-6 .group-images img { + width: 100%; + height: auto; + border-radius: calc(var(--sec-vhu) * 1.8); +} + +@media screen and (max-width: 959px) { + .page-6 .group-images { + width: 100%; + height: 10%; + padding: calc(var(--sec-vhu) * 4) calc(var(--sec-vwu) * 3); + top: 0; + right: 0; + grid-template-columns: repeat(8, 1fr); + grid-template-rows: repeat(7, 1fr); + gap: calc(var(--sec-vwu) * 2.8); + } + + .page-6 .group-images img { + border-radius: calc(var(--sec-vhu) * 0.8); + } +} + +/* + Utility: position an image on the grid using CSS vars + Usage example: + + places the image starting at column 3, row 2, spanning 2 columns × 2 rows. +*/ +.page-6 .group-images>a.group-image:nth-child(1) { + --c: 2; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(2) { + --c: 4; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(3) { + --c: 5; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(4) { + --c: 7; + --r: 1; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(5) { + --c: 1; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(6) { + --c: 3; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(7) { + --c: 4; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(8) { + --c: 5; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(9) { + --c: 6; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(10) { + --c: 8; + --r: 2; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(11) { + --c: 2; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(12) { + --c: 3; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(14) { + --c: 6; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(15) { + --c: 7; + --r: 3; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(16) { + --c: 1; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(17) { + --c: 3; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(18) { + --c: 6; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(19) { + --c: 8; + --r: 4; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(20) { + --c: 2; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(21) { + --c: 4; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(22) { + --c: 5; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(23) { + --c: 6; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(24) { + --c: 7; + --r: 5; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(25) { + --c: 3; + --r: 6; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(26) { + --c: 4; + --r: 6; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.group-image:nth-child(27) { + --c: 6; + --r: 6; + --w: 1; + --h: 1 +} + +.page-6 .group-images>a.simplex-image { + --c: 4; + --r: 3; + --w: 2; + --h: 2; + margin: calc(var(--sec-vhu) * 2); +} + +@media screen and (max-width: 959px) { + .page-6 .group-images>a.group-image:nth-child(1) { + --c: 3; + --r: 1; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(2) { + --c: 6; + --r: 1; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(3) { + --c: 2; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(4) { + --c: 4; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(5) { + --c: 5; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(6) { + --c: 7; + --r: 2; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(7) { + --c: 3; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(8) { + --c: 4; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(9) { + --c: 5; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(10) { + --c: 6; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(11) { + --c: 8; + --r: 3; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(12) { + --c: 2; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(14) { + --c: 3; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(15) { + --c: 6; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(16) { + --c: 7; + --r: 4; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(17) { + --c: 1; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(18) { + --c: 3; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(19) { + --c: 6; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(20) { + --c: 7; + --r: 5; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(21) { + --c: 2; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(22) { + --c: 4; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(23) { + --c: 5; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(24) { + --c: 6; + --r: 6; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(25) { + --c: 3; + --r: 7; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(26) { + --c: 4; + --r: 7; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.group-image:nth-child(27) { + --c: 6; + --r: 7; + --w: 1; + --h: 1 + } + + .page-6 .group-images>a.simplex-image { + --c: 4; + --r: 4; + --w: 2; + --h: 2; + margin: calc(var(--sec-vhu) * 1); + } +} + +.page-6 .group-images a { + grid-column: var(--c) / span var(--w, 1); + grid-row: var(--r) / span var(--h, 1); +} + + +/* FOOTER STYLES */ +section.page.footer { + height: fit-content; + min-height: fit-content; +} + +@media screen and (max-width: 959px) { + section.page.footer { + height: 100lvh; + min-height: 100lvh; + } + + .chrome-ios section.page, + .safari-ios section.page { + min-height: 110lvh; + height: 110lvh; + padding-bottom: calc(110lvh - 100svh); + } +} + +.footer .container, +.footer .container-fluid, +.footer .container-xxl, +.footer .container-xl, +.footer .container-lg, +.footer .container-md, +.footer .container-sm { + width: 100%; + /* padding: 0 20px; */ + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + + .footer .container-sm, + .footer .container { + max-width: 540px; + } +} + +@media (min-width: 960px) { + + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + + .footer .container-xl, + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 1140px; + } +} + +@media (min-width: 1400px) { + + .footer .container-xxl, + .footer .container-xl, + .footer .container-lg, + .footer .container-md, + .footer .container-sm, + .footer .container { + max-width: 1320px; + } +} \ No newline at end of file diff --git a/css/doc.css b/css/doc.css index 002d6bae0f..937268b166 100644 --- a/css/doc.css +++ b/css/doc.css @@ -87,8 +87,8 @@ header { } .dark #doc h1 { - background: -webkit-linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); - background: linear-gradient(to bottom, #70F0F9 100%, #70F0F9 100%); + background: -webkit-linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); + background: linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; @@ -235,7 +235,7 @@ header { } .dark #doc main aside { - background-color: #17203D; + background-color: #000832; } #doc main aside ul { @@ -305,13 +305,13 @@ header { left: 0; right: 0; bottom: 0; - background-color: #F3F6F7; + background-color: #F3FAFF; opacity: 0.9; z-index: 99; } .dark #doc main.overlay::after { - background-color: #0C0B13; + background-color: #000832; } #doc main article { diff --git a/css/style.css b/css/style.css index 475eddc404..4b9f5c34c0 100644 --- a/css/style.css +++ b/css/style.css @@ -1,3 +1,130 @@ +/* ======================= + GT-Walsheim (WOFF2) + Family: "GT-Walsheim" + Weights mapped: Thin(100), Ultra-Light(200), Light(300), Regular(400), + Medium(500), Bold(700), Ultra-Bold(800), Black(900) +======================= */ + +/* Light */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Light.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Light-Oblique.woff2") format("woff2"); + font-weight: 300; + font-style: oblique; + font-display: swap; +} + +/* Regular */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Regular.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Regular-Oblique.woff2") format("woff2"); + font-weight: 400; + font-style: oblique; + font-display: swap; +} + +/* Medium */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Medium.woff2") format("woff2"); + font-weight: 500; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Medium-Oblique.woff2") format("woff2"); + font-weight: 500; + font-style: oblique; + font-display: swap; +} + +/* Bold */ +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Bold.woff2") format("woff2"); + font-weight: 700; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "GT-Walsheim"; + src: url("/fonts/GT-Walsheim/GT-Walsheim-LC-Bold-Oblique.woff2") format("woff2"); + font-weight: 700; + font-style: oblique; + font-display: swap; +} + +/* ======================= + Manrope (TTF) + Family: "Manrope" + Weights mapped per name +======================= */ + +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} +@font-face { + font-family: "Manrope"; + src: url("/fonts/Manrope/Manrope-ExtraBold.ttf") format("truetype"); + font-weight: 800; + font-style: normal; + font-display: swap; +} + @font-face { font-family: Gilroy; src: url("/fonts/GilroyRegular/font.woff2") format("woff2"), url("webFonts/GilroyRegular/font.woff") format("woff"); @@ -35,7 +162,7 @@ html { scroll-behavior: smooth; - font-family: Gilroy, Helvetica, sans-serif;; + font-family: GT-Walsheim, Gilroy, Helvetica, sans-serif;; letter-spacing: 0.003em; } @@ -137,9 +264,18 @@ a{ text-fill-color: transparent; } +.dark .gradient-text { + background: -webkit-linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); + background: linear-gradient(to bottom, #70F0F9 0%, #70F0F9 33%, #50D8F1 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; +} + .dark .border-gradient { background: - linear-gradient(#11182F, #11182F) padding-box, + linear-gradient(#0B2A59, #0B2A59) padding-box, linear-gradient(to bottom, transparent, #01F1FF 58%) border-box; border: 1px solid transparent; } @@ -158,7 +294,7 @@ a{ .dark .unique-swiper .border-gradient{ background: - linear-gradient(#0C0B13, #0C0B13) padding-box, + linear-gradient(#000832, #000832) padding-box, linear-gradient(to bottom, transparent, #01F1FF 58%) border-box; border: 1px solid transparent; } @@ -177,154 +313,6 @@ a{ pointer-events: none; } -.menu-link{ - font-size: 16px; - line-height: 33.42px; - color: #0D0E12; -} -.dark .menu-link{ - color: #fff; -} - -.nav-link ul li a.active{ - color: #0053D0; - -} -.dark .nav-link ul li a.active{ - color: #66D9E2; -} - -@media (min-width:1024px) { - .nav-link-text, - .menu-link { - display: inline-block; - position: relative; - color: #0D0E12; - } - - .nav-link-text::before, - .active .nav-link-text::before, - .menu-link::before { - content: ""; - position: absolute; - width: 0; - height: 1px; - bottom: 0; - right: 0; - /* background-color: initial; */ - transition: width 0.25s ease-out; - } - - .menu-link::before { - background-color: #0D0E12; - } - .dark .menu-link::before { - background-color: #fff; - } - - .active .nav-link-text::before { - width: 100%; - } - - .nav-link:hover .nav-link-text::before, - .menu-link:hover::before { - width: 100%; - left: 0; - right: auto; - } -} - - -.sub-menu { - visibility: hidden; - opacity: 0; - color: #505158; -} - -.sub-menu .no-hover{ - color: #505158 !important; -} - -.dark .sub-menu, -.dark .sub-menu .no-hover { - color: #fff !important; -} - -.dark .sub-menu li:hover { - color: #66D9E2; -} - -.sub-menu li:hover { - color: #0053D0; -} - -.sub-menu { - transition: all .3s ease !important; -} - -.nav-link span svg, -header nav { - transition: all 0.5s ease; -} - -.nav-link:hover span svg { - transform: rotate(180deg); -} - -/* @media (max-width: 1400px) { - .landing-page-header-article-paragraph { - width: 21rem; - } - - .socials { - flex-wrap: nowrap; - } -} */ - -@media (min-width:1024px) { - - .nav-link:hover .sub-menu, - .nav-link:focus-within .sub-menu { - visibility: visible; - opacity: 1; - margin-top: 0; - } -} - -@media (max-width: 1024px) { - .sub-menu { - max-height: 0; - transform: translateY(-10px); - transition: all .7s ease !important; - overflow: hidden; - } - - .active .sub-menu { - max-height: 1000px; - transform: translateY(0px); - opacity: 1; - visibility: visible; - margin-top: 0; - } - - header nav { - visibility: hidden; - opacity: 0; - transform: translateX(100%); - overflow-y: auto; - } - - header nav.open { - visibility: visible; - opacity: 1; - transform: translateX(0); - } - - .flag-container .sub-menu{ - max-height: fit-content; - } -} - .lock-scroll { overflow: hidden; } @@ -496,33 +484,74 @@ header nav { /* comparison */ -#comparison table thead th{ +#comparison table thead th, +#messengers-comparison table thead th{ font-size: 16px; line-height: 36px; font-weight: 500; text-align: center; } -#comparison table tbody td{ +#comparison table tbody td, +#messengers-comparison table tbody td{ font-size: 16px; line-height: 24px; font-weight: 500; } -#comparison table tbody tr > td:first-child{ +#comparison table tbody tr > td:first-child, +#messengers-comparison table tbody tr > td:first-child{ font-size: 16px; line-height: 24px; font-weight: 500; text-align: left; } -[dir="rtl"] #comparison table tbody tr > td:first-child{ +[dir="rtl"] #comparison table tbody tr > td:first-child, +[dir="rtl"] #messengers-comparison table tbody tr > td:first-child{ text-align: right; } @media (min-width: 1024px) { - #comparison table tbody tr > td:first-child{ + #comparison table tbody tr > td:first-child, + #messengers-comparison table tbody tr > td:first-child{ font-size: 18px; line-height: 36px; - } + } +} + +#messengers-comparison table td.criteria { + min-width: 100px; + height: 52px; + text-align: center; +} + +#messengers-comparison table tbody span.criteria-mark { + font-size: 28px; +} + +#messengers-comparison table tbody sup { + font-size: 14px; +} + +@media (min-width: 1024px) { + #messengers-comparison table tbody span.criteria-mark { + font-size: 36px; + } + + #messengers-comparison table tbody sup { + font-size: 18px; + } +} + +#messengers-comparison table .green-check { + color: #1DB100; +} + +#messengers-comparison table .yellow-check { + color: #FFD932; +} + +#messengers-comparison table .red-ballot-x { + color: #EE220C; } /* hero */ @@ -740,7 +769,7 @@ p a{ position: fixed; width: 320px; max-width: 100%; - z-index: 10001; + z-index: 10001; transition: opacity .5s; padding-left: 5px; padding-right: 5px; @@ -810,13 +839,13 @@ p a{ position: absolute; width: 100%; height: 100%; - background-color:#F3F6F7; + background-color:#F3FAFF; opacity: 0.9; } .dark .glossary-overlay::before { content: ''; - background-color: #0C0B13; + background-color: #000832; } .glossary-overlay .overlay-card{ @@ -835,7 +864,7 @@ p a{ } .dark .glossary-overlay .overlay-card{ - background-color: #17203D; + background-color: #071C46; } @media (min-width: 640px) { diff --git a/css/tailwind.css b/css/tailwind.css index 6eb2f860ad..b846af4317 100644 --- a/css/tailwind.css +++ b/css/tailwind.css @@ -554,6 +554,10 @@ video { visibility: visible; } +.collapse { + visibility: collapse; +} + .static { position: static; } @@ -574,10 +578,6 @@ video { position: sticky; } -.-left-10 { - left: -2.5rem; -} - .bottom-0 { bottom: 0px; } @@ -618,10 +618,6 @@ video { top: 2.5rem; } -.top-11 { - top: 2.75rem; -} - .top-\[52\%\] { top: 52%; } @@ -638,10 +634,6 @@ video { z-index: 10; } -.z-50 { - z-index: 50; -} - .z-\[10000\] { z-index: 10000; } @@ -800,14 +792,6 @@ video { margin-bottom: 50px; } -.mb-\[54px\] { - margin-bottom: 54px; -} - -.mb-\[62px\] { - margin-bottom: 62px; -} - .mb-\[74px\] { margin-bottom: 74px; } @@ -828,10 +812,6 @@ video { margin-bottom: 8px; } -.mb-auto { - margin-bottom: auto; -} - .ml-\[-15px\] { margin-left: -15px; } @@ -840,10 +820,18 @@ video { margin-left: -6px; } +.ml-auto { + margin-left: auto; +} + .mr-\[-4px\] { margin-right: -4px; } +.mr-auto { + margin-right: auto; +} + .mt-1 { margin-top: 0.25rem; } @@ -872,10 +860,6 @@ video { margin-top: 14px; } -.mt-\[25px\] { - margin-top: 25px; -} - .mt-\[30px\] { margin-top: 30px; } @@ -892,14 +876,14 @@ video { margin-top: 74px; } -.mt-\[8px\] { - margin-top: 8px; -} - .mt-auto { margin-top: auto; } +.\!block { + display: block !important; +} + .block { display: block; } @@ -940,10 +924,6 @@ video { height: 1rem; } -.h-6 { - height: 1.5rem; -} - .h-\[110px\] { height: 110px; } @@ -960,14 +940,6 @@ video { height: 180px; } -.h-\[1px\] { - height: 1px; -} - -.h-\[215px\] { - height: 215px; -} - .h-\[24px\] { height: 24px; } @@ -976,10 +948,6 @@ video { height: 322px; } -.h-\[32px\] { - height: 32px; -} - .h-\[340px\] { height: 340px; } @@ -988,10 +956,6 @@ video { height: 34px; } -.h-\[36px\] { - height: 36px; -} - .h-\[40px\] { height: 40px; } @@ -1016,6 +980,10 @@ video { height: 55%; } +.h-\[60px\] { + height: 60px; +} + .h-\[66px\] { height: 66px; } @@ -1028,10 +996,6 @@ video { height: calc(100% - 81.42px); } -.h-\[calc\(100vh-66px\)\] { - height: calc(100vh - 66px); -} - .h-\[inherit\] { height: inherit; } @@ -1081,10 +1045,6 @@ video { width: 1rem; } -.w-8 { - width: 2rem; -} - .w-\[175px\] { width: 175px; } @@ -1097,10 +1057,6 @@ video { width: 238px; } -.w-\[36px\] { - width: 36px; -} - .w-\[44px\] { width: 44px; } @@ -1125,14 +1081,6 @@ video { min-width: 152px; } -.min-w-\[170px\] { - min-width: 170px; -} - -.min-w-\[180px\] { - min-width: 180px; -} - .min-w-\[210px\] { min-width: 210px; } @@ -1205,10 +1153,6 @@ video { max-width: 617px; } -.max-w-\[900px\] { - max-width: 900px; -} - .flex-1 { flex: 1 1 0%; } @@ -1279,10 +1223,6 @@ video { grid-template-columns: repeat(1, minmax(0, 1fr)); } -.flex-row { - flex-direction: row; -} - .flex-col { flex-direction: column; } @@ -1307,10 +1247,6 @@ video { align-items: center; } -.justify-end { - justify-content: flex-end; -} - .justify-center { justify-content: center; } @@ -1363,10 +1299,6 @@ video { gap: 150px; } -.gap-\[20px\] { - gap: 20px; -} - .gap-\[50px\] { gap: 50px; } @@ -1497,9 +1429,9 @@ video { background-color: rgb(1 151 255 / var(--tw-bg-opacity)); } -.bg-\[\#17203D\] { +.bg-\[\#071C46\] { --tw-bg-opacity: 1; - background-color: rgb(23 32 61 / var(--tw-bg-opacity)); + background-color: rgb(7 28 70 / var(--tw-bg-opacity)); } .bg-\[\#48F6C2\] { @@ -1507,9 +1439,14 @@ video { background-color: rgb(72 246 194 / var(--tw-bg-opacity)); } -.bg-\[\#D9E7ED\] { +.bg-\[\#C1E3FE\] { --tw-bg-opacity: 1; - background-color: rgb(217 231 237 / var(--tw-bg-opacity)); + background-color: rgb(193 227 254 / var(--tw-bg-opacity)); +} + +.bg-\[\#D3E9FF\] { + --tw-bg-opacity: 1; + background-color: rgb(211 233 255 / var(--tw-bg-opacity)); } .bg-\[\#D9ECFF\] { @@ -1517,14 +1454,14 @@ video { background-color: rgb(217 236 255 / var(--tw-bg-opacity)); } -.bg-\[\#F0F1F2\] { +.bg-\[\#DBEEFF\] { --tw-bg-opacity: 1; - background-color: rgb(240 241 242 / var(--tw-bg-opacity)); + background-color: rgb(219 238 255 / var(--tw-bg-opacity)); } -.bg-\[\#F3F6F7\] { +.bg-\[\#F3FAFF\] { --tw-bg-opacity: 1; - background-color: rgb(243 246 247 / var(--tw-bg-opacity)); + background-color: rgb(243 250 255 / var(--tw-bg-opacity)); } .bg-\[\#fff\] { @@ -1544,7 +1481,7 @@ video { .bg-card-desc-bg-light { --tw-bg-opacity: 1; - background-color: rgb(217 231 237 / var(--tw-bg-opacity)); + background-color: rgb(219 238 255 / var(--tw-bg-opacity)); } .bg-primary-bg-light { @@ -1559,7 +1496,7 @@ video { .bg-secondary-bg-light { --tw-bg-opacity: 1; - background-color: rgb(243 246 247 / var(--tw-bg-opacity)); + background-color: rgb(243 250 255 / var(--tw-bg-opacity)); } .bg-transparent { @@ -1622,11 +1559,6 @@ video { padding-right: 0px; } -.px-20 { - padding-left: 5rem; - padding-right: 5rem; -} - .px-4 { padding-left: 1rem; padding-right: 1rem; @@ -1647,16 +1579,6 @@ video { padding-right: 2rem; } -.px-\[20px\] { - padding-left: 20px; - padding-right: 20px; -} - -.px-\[34px\] { - padding-left: 34px; - padding-right: 34px; -} - .py-10 { padding-top: 2.5rem; padding-bottom: 2.5rem; @@ -1677,11 +1599,6 @@ video { padding-bottom: 0.75rem; } -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - .py-5 { padding-top: 1.25rem; padding-bottom: 1.25rem; @@ -1794,6 +1711,11 @@ video { line-height: 2.25rem; } +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + .text-\[12px\] { font-size: 12px; } @@ -2040,12 +1962,6 @@ video { box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } -.shadow-\[0px_50px_61px_rgba\(0\2c 0\2c 0\2c 0\.12\)\] { - --tw-shadow: 0px 50px 61px rgba(0,0,0,0.12); - --tw-shadow-colored: 0px 50px 61px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - .shadow-\[2px_2px_0px_\#859096\] { --tw-shadow: 2px 2px 0px #859096; --tw-shadow-colored: 2px 2px 0px var(--tw-shadow-color); @@ -2135,16 +2051,10 @@ video { width: 100%; } -.before\:bg-black::before { - content: var(--tw-content); - --tw-bg-opacity: 1; - background-color: rgb(13 14 18 / var(--tw-bg-opacity)); -} - .before\:bg-secondary-bg-light::before { content: var(--tw-content); --tw-bg-opacity: 1; - background-color: rgb(243 246 247 / var(--tw-bg-opacity)); + background-color: rgb(243 250 255 / var(--tw-bg-opacity)); } .before\:opacity-90::before { @@ -2157,10 +2067,6 @@ video { outline-offset: 2px; } -:is([dir="ltr"] .ltr\:ml-8) { - margin-left: 2rem; -} - :is([dir="ltr"] .ltr\:mr-auto) { margin-right: auto; } @@ -2183,10 +2089,6 @@ video { margin-left: auto; } -:is([dir="rtl"] .rtl\:mr-8) { - margin-right: 2rem; -} - :is([dir="rtl"] .rtl\:\!hidden) { display: none !important; } @@ -2225,10 +2127,6 @@ video { display: none; } -:is(.dark .dark\:rounded-\[6px\]) { - border-radius: 6px; -} - :is(.dark .dark\:border) { border-width: 1px; } @@ -2247,19 +2145,29 @@ video { border-color: rgb(255 255 255 / var(--tw-border-opacity)); } -:is(.dark .dark\:bg-\[\#0C0B13\]) { +:is(.dark .dark\:bg-\[\#000832\]) { --tw-bg-opacity: 1; - background-color: rgb(12 11 19 / var(--tw-bg-opacity)); + background-color: rgb(0 8 50 / var(--tw-bg-opacity)); } -:is(.dark .dark\:bg-\[\#0E2B57\]) { +:is(.dark .dark\:bg-\[\#050920\]) { --tw-bg-opacity: 1; - background-color: rgb(14 43 87 / var(--tw-bg-opacity)); + background-color: rgb(5 9 32 / var(--tw-bg-opacity)); } -:is(.dark .dark\:bg-\[\#11182F\]) { +:is(.dark .dark\:bg-\[\#071C46\]) { --tw-bg-opacity: 1; - background-color: rgb(17 24 47 / var(--tw-bg-opacity)); + background-color: rgb(7 28 70 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#080D25\]) { + --tw-bg-opacity: 1; + background-color: rgb(8 13 37 / var(--tw-bg-opacity)); +} + +:is(.dark .dark\:bg-\[\#0B2A59\]) { + --tw-bg-opacity: 1; + background-color: rgb(11 42 89 / var(--tw-bg-opacity)); } :is(.dark .dark\:bg-\[\#171F3A\]) { @@ -2267,11 +2175,6 @@ video { background-color: rgb(23 31 58 / var(--tw-bg-opacity)); } -:is(.dark .dark\:bg-\[\#17203D\]) { - --tw-bg-opacity: 1; - background-color: rgb(23 32 61 / var(--tw-bg-opacity)); -} - :is(.dark .dark\:bg-\[rgba\(112\2c 240\2c 249\2c 0\.2\)\]) { background-color: rgba(112,240,249,0.2); } @@ -2283,7 +2186,7 @@ video { :is(.dark .dark\:bg-card-bg-dark) { --tw-bg-opacity: 1; - background-color: rgb(23 32 61 / var(--tw-bg-opacity)); + background-color: rgb(7 28 70 / var(--tw-bg-opacity)); } :is(.dark .dark\:bg-card-desc-bg-dark) { @@ -2298,7 +2201,7 @@ video { :is(.dark .dark\:bg-primary-bg-dark) { --tw-bg-opacity: 1; - background-color: rgb(12 11 19 / var(--tw-bg-opacity)); + background-color: rgb(0 8 50 / var(--tw-bg-opacity)); } :is(.dark .dark\:bg-primary-dark) { @@ -2308,11 +2211,7 @@ video { :is(.dark .dark\:bg-secondary-bg-dark) { --tw-bg-opacity: 1; - background-color: rgb(17 24 47 / var(--tw-bg-opacity)); -} - -:is(.dark .dark\:bg-transparent) { - background-color: transparent; + background-color: rgb(11 42 89 / var(--tw-bg-opacity)); } :is(.dark .dark\:bg-opacity-\[0\.2\]) { @@ -2320,7 +2219,7 @@ video { } :is(.dark .dark\:bg-gradient-radial-mobile) { - background-image: radial-gradient(77.4% 73.09% at -3.68% 100%, #17203D 0%, #0C0B13 100%); + background-image: radial-gradient(77.4% 73.09% at -3.68% 100%, #071C46 0%, #000832 100%); } :is(.dark .dark\:fill-primary-dark) { @@ -2356,10 +2255,6 @@ video { color: rgb(255 255 255 / var(--tw-text-opacity)); } -:is(.dark .dark\:opacity-\[0\.1\]) { - opacity: 0.1; -} - :is(.dark .dark\:opacity-\[0\.2\]) { opacity: 0.2; } @@ -2383,13 +2278,7 @@ video { :is(.dark .dark\:before\:bg-primary-bg-dark)::before { content: var(--tw-content); --tw-bg-opacity: 1; - background-color: rgb(12 11 19 / var(--tw-bg-opacity)); -} - -:is(.dark .dark\:before\:bg-white)::before { - content: var(--tw-content); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + background-color: rgb(0 8 50 / var(--tw-bg-opacity)); } @media (min-width: 640px) { @@ -2429,18 +2318,10 @@ video { margin-bottom: 0px; } - .md\:mb-16 { - margin-bottom: 4rem; - } - .md\:mb-6 { margin-bottom: 1.5rem; } - .md\:mb-8 { - margin-bottom: 2rem; - } - .md\:mt-6 { margin-top: 1.5rem; } @@ -2470,6 +2351,10 @@ video { max-height: 660px; } + .md\:max-h-\[720px\] { + max-height: 720px; + } + .md\:min-h-fit { min-height: -moz-fit-content; min-height: fit-content; @@ -2479,14 +2364,6 @@ video { width: 168px; } - .md\:w-\[30\%\] { - width: 30%; - } - - .md\:w-\[70\%\] { - width: 70%; - } - .md\:w-fit { width: -moz-fit-content; width: fit-content; @@ -2582,10 +2459,6 @@ video { line-height: 1.75rem !important; } - .md\:text-\[20px\] { - font-size: 20px; - } - .md\:text-\[35px\] { font-size: 35px; } @@ -2628,34 +2501,10 @@ video { } @media (min-width: 1024px) { - .lg\:absolute { - position: absolute; - } - - .lg\:relative { - position: relative; - } - - .lg\:top-0 { - top: 0px; - } - - .lg\:mb-0 { - margin-bottom: 0px; - } - - .lg\:mb-20 { - margin-bottom: 5rem; - } - .lg\:mb-8 { margin-bottom: 2rem; } - .lg\:mb-\[54px\] { - margin-bottom: 54px; - } - .lg\:mb-\[90px\] { margin-bottom: 90px; } @@ -2664,10 +2513,6 @@ video { margin-top: 0px; } - .lg\:mt-\[10px\] { - margin-top: 10px; - } - .lg\:flex { display: flex; } @@ -2684,10 +2529,6 @@ video { height: 642px; } - .lg\:h-\[66px\] { - height: 66px; - } - .lg\:h-\[855px\] { height: 855px; } @@ -2708,15 +2549,6 @@ video { height: calc(100vh - 66px); } - .lg\:h-auto { - height: auto; - } - - .lg\:h-fit { - height: -moz-fit-content; - height: fit-content; - } - .lg\:max-h-\[888px\] { max-height: 888px; } @@ -2729,14 +2561,6 @@ video { width: 60%; } - .lg\:w-auto { - width: auto; - } - - .lg\:w-full { - width: 100%; - } - .lg\:max-w-\[240px\] { max-width: 240px; } @@ -2777,33 +2601,10 @@ video { gap: 7rem; } - .lg\:gap-5 { - gap: 1.25rem; - } - .lg\:gap-\[350px\] { gap: 350px; } - .lg\:bg-transparent { - background-color: transparent; - } - - .lg\:bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - } - - .lg\:px-0 { - padding-left: 0px; - padding-right: 0px; - } - - .lg\:px-5 { - padding-left: 1.25rem; - padding-right: 1.25rem; - } - .lg\:px-7 { padding-left: 1.75rem; padding-right: 1.75rem; @@ -2819,26 +2620,6 @@ video { padding-right: 50px; } - .lg\:py-0 { - padding-top: 0px; - padding-bottom: 0px; - } - - .lg\:py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - } - - .lg\:py-4 { - padding-top: 1rem; - padding-bottom: 1rem; - } - - .lg\:py-5 { - padding-top: 1.25rem; - padding-bottom: 1.25rem; - } - .lg\:py-\[50px\] { padding-top: 50px; padding-bottom: 50px; @@ -2885,55 +2666,20 @@ video { line-height: 45px; } - .lg\:shadow-\[0_0_3px_rgb\(60_72_88_\/_15\%\)\] { - --tw-shadow: 0 0 3px rgb(60 72 88 / 15%); - --tw-shadow-colored: 0 0 3px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - } - - :is([dir="ltr"] .ltr\:lg\:ml-4) { - margin-left: 1rem; - } - - :is([dir="ltr"] .ltr\:lg\:ml-5) { - margin-left: 1.25rem; - } - :is([dir="ltr"] .lg\:ltr\:text-left) { text-align: left; } - :is([dir="rtl"] .rtl\:lg\:mr-4) { - margin-right: 1rem; - } - - :is([dir="rtl"] .rtl\:lg\:mr-5) { - margin-right: 1.25rem; - } - :is([dir="rtl"] .lg\:rtl\:text-right) { text-align: right; } - :is(.dark .dark\:lg\:flex) { - display: flex; - } - :is(.dark .dark\:lg\:hidden) { display: none; } - :is(.dark .dark\:lg\:bg-black) { - --tw-bg-opacity: 1; - background-color: rgb(13 14 18 / var(--tw-bg-opacity)); - } - :is(.dark .dark\:lg\:bg-gradient-radial) { - background-image: radial-gradient(88.77% 102.03% at 92.64% -13.22%, #17203D 0%, #0C0B13 100%); - } - - :is(.dark .dark\:lg\:bg-none) { - background-image: none; + background-image: radial-gradient(88.77% 102.03% at 92.64% -13.22%, #071C46 0%, #000832 100%); } } @@ -3030,10 +2776,6 @@ video { gap: 2.5rem; } - .xl\:gap-8 { - gap: 2rem; - } - .xl\:text-left { text-align: left; } @@ -3046,22 +2788,6 @@ video { font-size: 16px; } - :is([dir="ltr"] .ltr\:xl\:ml-10) { - margin-left: 2.5rem; - } - - :is([dir="ltr"] .ltr\:xl\:ml-8) { - margin-left: 2rem; - } - - :is([dir="rtl"] .rtl\:xl\:mr-10) { - margin-right: 2.5rem; - } - - :is([dir="rtl"] .rtl\:xl\:mr-8) { - margin-right: 2rem; - } - :is([dir="rtl"] .xl\:rtl\:text-right) { text-align: right; } diff --git a/de/contact/index.html b/de/contact/index.html index ab64f7914b..c07eb27af2 100644 --- a/de/contact/index.html +++ b/de/contact/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/de/fdroid/index.html b/de/fdroid/index.html index 76687ffa56..fcff7cb0be 100644 --- a/de/fdroid/index.html +++ b/de/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX erklärt

- - - - - - - -
-
- -
-
1. Wie es die Nutzer erleben
-
- -

- Sie können Kontakte und Gruppen erstellen und haben Zwei-Wege-Kommunikation wie in jedem anderen Messenger. -

-

- Wie funktioniert das mit den unidirektionalen Warteschlangen und ohne Profilkennungen? -

-
-
- -
-
2. Wie es funktioniert
-
- -

- Für jede Verbindung nutzen Sie zwei separate Nachrichten-Warteschlangen, um die Nachrichten über verschiedene Server zu senden und zu empfangen. -

-

- Die Server leiten Nachrichten immer nur in eine Richtung weiter, ohne den vollständigen Verlauf der Nutzer-Unterhaltungen oder seiner Verbindungen zu kennen. -

-
-
- -
-
3. Was die Server sehen
-
- -

- Die Server nutzen für jede Warteschlange separate, anonyme Anmeldeinformationen und wissen nicht, welchem Nutzer diese gehören. -

-

- Durch die Verwendung von Tor-Zugangsservern können Nutzer ihre Metadaten-Privatsphäre weiter verbessern und Korellationen von IP-Adressen verhindern. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Sei
frei

+

Freiheit & Sicherheit
Ihrer Kommunikation

+

Das erste Netzwerk, in dem Sie Ihre Identität, Kontakte und Gruppen besitzen.

- -
-
-

Vergleich mit anderen Protokollen

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, große PlattformenXMPP / MatrixP2P-Protokolle
Benötigt eine globale KennungNein – vertraulichJa 1Ja 2Ja 3
Möglichkeit eines MITM-AngriffsNein – sicher 4Ja 5JaJa
Abhängigkeit vom DNS-SystemNein – widerstandsfähigJaJaNein
Einzelnes oder zentralisiertes NetzwerkNein – dezentralisiertJaNein – föderiert 6Ja 7
Zentrale Komponente oder andere Netzwerk-weite AngriffeNein – widerstandsfähigJaJa 2Ja 8
-
- -
- -
-
-
    -
  1. Normalerweise auf der Grundlage einer Telefonnummer, in einigen Fällen auf der Grundlage von Benutzernamen
  2. -
  3. DNS-basierte Adressen
  4. -
  5. Öffentlicher Schlüssel oder eine andere weltweit eindeutige ID
  6. -
  7. SimpleX-Relais können die E2E-Verschlüsselung nicht kompromittieren. Überprüfen Sie den Sicherheitscode, um einen möglichen Angriff auf den Out-of-Band-Kanal zu entschärfen
  8. -
  9. Wenn die Server des Betreibers kompromittiert werden. In Signal und weiteren Apps kann der Sicherheitscode überprüft werden, um dies zu entschärfen
  10. -
  11. Die Privatsphäre-Metadaten des Nutzers werden nicht geschützt
  12. -
  13. P2P sind zwar verteilt, aber nicht föderiert — sie arbeiten als ein einziges Netzwerk
  14. -
  15. P2P-Netzwerke haben entweder eine zentrale Verwaltung oder das gesamte Netzwerk kann kompromittiert werden - Siehe hier
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security-
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

Das sicherste Messaging-System der Welt

+

SimpleX-Messaging verfügt über modernste Ende-zu-Ende-Verschlüsselung.

+

Zu Ihrer Sicherheit und zum Schutz Ihrer Privatsphäre können Server Ihre Nachrichten weder sehen, noch mit wem Sie kommunizieren.

+ Lernen Sie mehr über SimpleX-Messaging +
+
+
+
+
+
+

Sie besitzen
The Next Web

+

SimpleX basiert auf der Überzeugung, dass Sie Eigentümer Ihrer Identität, Ihrer Kontakte und Ihrer Communities sein müssen.

+

Ein offenes und dezentrales Netzwerk ermöglicht es Ihnen, mit Menschen in Kontakt zu treten und Ideen auszutauschen: Seien Sie frei und sicher.

+
+
+
+
+
+
+

Communities, die Bestand haben

+

Sie werden Ihre Lieblingsgruppen mit zukünftigen Community-Gutscheinen unterstützen.

+

Server werden mit Gutscheinen bezahlt, damit Ihre Communities kostenlos und unabhängig bleiben können.

+ Erfahren Sie mehr und holen Sie sich Ihren kostenlosen NFT
zum frühzeitigen ausprobieren.
+
+
+
-
-
-

Nutzen Sie SimpleX

-

Wir laden Sie ein, sich an der Diskussion zu beteiligen

- - - -

Melden Sie sich an, um Updates von uns zu erhalten

- -
- - - -
- -
- -

Laden Sie sich SimpleX herunter desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Peer-to-peer

Peer-to-peer (P2P) is the network architecture when participants have equal rights and communicate directly via a general purpose transport or overlay network. Unlike client-server architecture, all peers in a P2P network both provide and consume the resources. In the context of messaging, P2P architecture usually means that the messages are sent between peers, without user accounts or messages being stored on any servers. Examples are Tox, Briar, Cwtch and many others.

- +
+
+
+

SimpleX - Roadmap zum freien Internet

+
+

2025

+

: Skalierung auf große Communities

+

Ausstieg aus zentralisierten Plattformen

+
+
+

2026

+

: Nachhaltige Communities & Server

+

Einführung von Community-Gutscheinen

+
+
+

2027

+

: Lassen Sie Ihre Communities wachsen

+

Tools zur Förderung Ihrer Communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Treten Sie SimpleX-Communities bei

+

Hunderttausende Menschen vertrauen bereits SimpleX-Messaging.

+

Finden Sie Ihre Communities im SimpleX-Verzeichnis und erstellen Sie Ihre Eigenen!

+ SimpleX-Verzeichnis anzeigen +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/de/invitation/index.html b/de/invitation/index.html index 1c3b27705d..a61b65b110 100644 --- a/de/invitation/index.html +++ b/de/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/de/messaging/index.html b/de/messaging/index.html new file mode 100644 index 0000000000..adaa9f2356 --- /dev/null +++ b/de/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Warum ist SimpleX einmalig

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Sie erhalten eine vollumfängliche Privatsphäre

+
+ +
+ +
+

+ SimpleX schützt die Privatsphäre Ihres Profils, Ihrer Kontakte und Metadaten und verbirgt sie vor den SimpleX-Netzwerk-Servern und weiteren möglichen Beobachtern. +

+

+ Im Gegensatz zu allen anderen bestehenden Messaging-Netzwerken werden den Nutzern von SimpleX keine Kennungen zugewiesen — nicht einmal Zufallszahlen. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Sie sind geschützt vor
Spam und Missbrauch

+
+ +
+ +
+

+ Da Sie keine Kennung oder feste Adresse im SimpleX-Netzwerk haben, kann Sie niemand kontaktieren, es sei denn, Sie geben eine einmalige oder vorübergehende Benutzeradresse in Form eines QR-Codes oder Links weiter. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sie haben die Kontrolle über Ihre Daten

+
+ +
+ +
+

+ SimpleX speichert Benutzerdaten nur auf den Endgeräten und das in einem portablen, verschlüsselten Datenbankformat — welches auf ein anderes Gerät übertragen werden kann. +

+

+ Die Ende-zu-Ende-verschlüsselten Nachrichten werden vorübergehend auf SimpleX-Relay-Servern gespeichert, bis sie vom Endgerät empfangen und danach endgültig gelöscht werden. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Sie besitzen das SimpleX-Netzwerk

+
+ +
+ +
+

+ Das SimpleX-Netzwerk ist vollständig dezentralisiert und unabhängig von Kryptowährungen oder anderen Netzwerken außer dem Internet. +

+

+ Sie können SimpleX mit Ihren eigenen Servern oder mit den von uns zur Verfügung gestellten Servern verwenden — und sich trotzdem mit jedem Benutzer verbinden. +

+ +
+ + + Erfahren Sie mehr darüber + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funktionen

+ +
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Nachrichten mit Markdowns und Bearbeitungsmöglichkeiten

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte
Bilder, Videos und Dateien

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte dezentralisierte Gruppen — Nur die Nutzer wissen, dass diese überhaupt existieren

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Sprachnachrichten

+
+ +
+
+ + +
+

Verschwindende geheime Unterhaltungen

+
+ +
+
+ + +
+

Ende-zu-Ende-verschlüsselte Sprach- und Videoanrufe

+
+ +
+
+ + +
+

Portable und verschlüsselte App-Datenspeicherung — verschieben Sie das komplette Profil einfach auf ein anderes Gerät

+
+ +
+
+ + +
+

Inkognito-Modus —
Einzigartig in SimpleX Chat

+
+ +
+
+
+ + +
+
+

Was macht SimpleX vertraulich

+ +
+
+ + +
+
+ + +
+
+

Temporäre, anonyme paarweise Kennungen

+
+ +

SimpleX nutzt für jeden Nutzer-Kontakt oder jedes Gruppenmitglied eigene temporäre, anonyme und paarweise Adressen und Berechtigungsnachweise.

+ +

SimpleX erlaubt es, Nachrichten ohne Nutzerprofil-Bezeichner zu versenden und bietet dabei bessere Metadaten-Privatsphäre an als andere Alternativen.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Out-of-Band-
Schlüsselaustausch

+
+ +

Viele Kommunikations-Netzwerke sind für MITM-Angriffe durch Server oder Netzwerk-Anbieter anfällig.

+ +

Um das zu verhindern, werden von SimpleX Einmal-Schlüssel Out-of-Band weitergeleitet, wenn Sie eine Adresse als Link oder QR-Code teilen.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Zwei Schichten der
Ende-zu-Ende-Verschlüsselung

+
+ +

Double-Ratchet-Protokoll —
Off-the-Record-Nachrichten mit Perfect Forward Secrecy, Abstreitbarkeit und Wiederherstellung nach einer Kompromittierung.

+ +

NaCL-Kryptobox in jeder Warteschlange, um eine Korrelation des Datenverkehrs zwischen Nachrichtenwarteschlangen zu verhindern, falls TLS kompromittiert wurde.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Nachrichten-Integritäts-
Überprüfung

+
+ +

Um die Integrität von Nachrichten sicherzustellen, werden sie sequentiell durchnummeriert und beinhalten den Hash der vorhergehenden Nachricht.

+ +

Der Empfänger wird alarmiert, sobald eine Nachricht ergänzt, entfernt oder verändert wird.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Zusätzliche Schicht der
Server-Verschlüsselung

+
+ +

Zusätzliche Server-Verschlüsselungs-Schicht für die Zustellung an den Empfänger, um eine Korrelation zwischen empfangenen und gesendeten Server-Daten zu vermeiden, falls TLS kompromittiert wurde.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Mischen von Nachrichten,
um Korrelationen zu reduzieren

+
+ +

Die SimpleX-Server arbeiten als Mix-Knoten mit geringer Verzögerung — eingehende und ausgehende Nachrichten haben eine unterschiedliche Reihenfolge.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Sichere authentifizierte
TLS-Transportschicht

+
+ +

Für Client-Server-Verbindungen wird nur TLS 1.2/1.3 mit starken Algorithmen verwendet.

+ +

Server-Fingerabdrücke und Kanalbindung verhindern MITM- und Replay-Angriffe.

+ +

Die Wiederaufnahme von Verbindungen ist deaktiviert, um Sitzungs-Angriffe zu verhindern.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Optionaler
Zugang per Tor

+
+ +

Um Ihre IP-Adresse zu schützen, können Sie per Tor oder irgendeinem anderen Transportschichten-Netzwerk auf Server zugreifen.

+ +

Um SimpleX per Tor zu nutzen, installieren Sie unter Android bitte die Orbot-App und aktivieren Sie den SOCKS5-Proxy oder unter iOS per VPN.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Unidirektionale
Nachrichten-Warteschlangen

+
+ +

Jede Nachrichten-Warteschlange leitet Nachrichten mit unterschiedlichen Sende- und Empfängeradressen jeweils nur in einer Richtung weiter.

+ +

Verglichen mit traditionellen Nachrichten-Brokern, werden mögliche Angriffs-Vektoren und vorhandene Metadaten reduziert.

+ +
+

Zum Schließen drücken

+
+
+ +
+
+ + +
+
+

Mehrere Schichten der
Inhalteauffüllung

+
+ +

SimpleX nutzt Inhalte-Auffüllung für jede Verschlüsselungs-Schicht, um Angriffe auf die Nachrichtengröße zu vereiteln.

+ +

Erzeugt Nachrichten mit unterschiedlichen Größen, die für Server und Netzwerk-Beobachter identisch aussehen.

+ +
+

Zum Schließen drücken

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX-Netzwerk

+

Durch die Kombination der Vorteile von P2P und föderierten Netzwerken stellt SimpleX die bestmögliche Privatsphäre zur Verfügung.

+ +
+
+
+ + +
+
+

Im Gegensatz zu P2P-Netzwerken

+

+ Alle Nachrichten werden über Server versandt, was sowohl einen besseren Schutz der Metadaten als auch eine zuverlässigere asynchrone Nachrichtenübermittlung ermöglicht und dabei Vieles vermeidet Probleme von P2P-Netzwerken. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Im Gegensatz zu föderierten Netzwerken

+

+ SimpleX-Relay-Server speichern KEINE Benutzerprofile, Kontakte und zugestellte Nachrichten und stellen KEINE Verbindungen untereinander her, und es gibt KEIN Serververzeichnis. +

+
+
+ + + +
+
+ + +
+
+

SimpleX-Netzwerk

+

+ Die Server stellen unidirektionale Warteschlangen zur Verfügung, um die Benutzer miteinander zu verbinden. Sie haben aber keinen Einblick in den Verbindungs-Graphen des Netzwerks — Diesen haben nur die Benutzer selbst. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX erklärt

+ + + + + + + +
+
+ +
+
1. Wie es die Nutzer erleben
+
+ +

+ Sie können Kontakte und Gruppen erstellen und haben Zwei-Wege-Kommunikation wie in jedem anderen Messenger. +

+

+ Wie funktioniert das mit den unidirektionalen Warteschlangen und ohne Profilkennungen? +

+
+
+ +
+
2. Wie es funktioniert
+
+ +

+ Für jede Verbindung nutzen Sie zwei separate Nachrichten-Warteschlangen, um die Nachrichten über verschiedene Server zu senden und zu empfangen. +

+

+ Die Server leiten Nachrichten immer nur in eine Richtung weiter, ohne den vollständigen Verlauf der Nutzer-Unterhaltungen oder seiner Verbindungen zu kennen. +

+
+
+ +
+
3. Was die Server sehen
+
+ +

+ Die Server nutzen für jede Warteschlange separate, anonyme Anmeldeinformationen und wissen nicht, welchem Nutzer diese gehören. +

+

+ Durch die Verwendung von Tor-Zugangsservern können Nutzer ihre Metadaten-Privatsphäre weiter verbessern und Korellationen von IP-Adressen verhindern. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vergleich mit anderen Protokollen

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, große PlattformenXMPP / MatrixP2P-Protokolle
Benötigt eine globale KennungNein – vertraulichJa 1Ja 2Ja 3
Möglichkeit eines MITM-AngriffsNein – sicher 4Ja 5JaJa
Abhängigkeit vom DNS-SystemNein – widerstandsfähigJaJaNein
Einzelnes oder zentralisiertes NetzwerkNein – dezentralisiertJaNein – föderiert 6Ja 7
Zentrale Komponente oder andere Netzwerk-weite AngriffeNein – widerstandsfähigJaJa 2Ja 8
+
+ +
+ +
+
+
    +
  1. Normalerweise auf der Grundlage einer Telefonnummer, in einigen Fällen auf der Grundlage von Benutzernamen
  2. +
  3. DNS-basierte Adressen
  4. +
  5. Öffentlicher Schlüssel oder eine andere weltweit eindeutige ID
  6. +
  7. SimpleX-Relais können die E2E-Verschlüsselung nicht kompromittieren. Überprüfen Sie den Sicherheitscode, um einen möglichen Angriff auf den Out-of-Band-Kanal zu entschärfen
  8. +
  9. Wenn die Server des Betreibers kompromittiert werden. In Signal und weiteren Apps kann der Sicherheitscode überprüft werden, um dies zu entschärfen
  10. +
  11. Die Privatsphäre-Metadaten des Nutzers werden nicht geschützt
  12. +
  13. P2P sind zwar verteilt, aber nicht föderiert — sie arbeiten als ein einziges Netzwerk
  14. +
  15. P2P-Netzwerke haben entweder eine zentrale Verwaltung oder das gesamte Netzwerk kann kompromittiert werden — Siehe hier
  16. +
+
+
+
+
+ +
+
+

Sicherheitsvergleich der Ende-zu-Ende-Verschlüsselung in verschiedenen Messengern

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Nachrichten-Padding✔︎1✔︎✔︎1✔︎
Glaubhafte Abstreitbarkeit✔︎2✔︎3✔︎
Forward Secrecy✔︎✔︎✔︎✔︎✔︎
Sicherheit nach Kompromittierung✔︎4✔︎
2-Faktor-Schlüsselaustausch✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-Quanten-Hybridkryptografie✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar verwendet Padding, um Nachrichten auf eine Länge von mindestens 1024 Byte aufzurunden; Signal - auf 160 Byte
  2. +
  3. Abstreitbarkeit gilt nicht für die Client-Server-Verbindung.
  4. +
  5. Es scheint, dass die Verwendung kryptografischer Signaturen die Abstreitbarkeit beeinträchtigt, aber dies muss noch geklärt werden.
  6. +
  7. Die Multi-Geräte-Implementierung beeinträchtigt die Sicherheit nach Kompromittierung des Double Ratchet-Algorithmus — Siehe hier.
  8. +
  9. Ein 2-Faktor-Schlüsselaustausch ist optional und kann über die Überprüfung eines Sicherheitscodes erfolgen.
  10. +
  11. Die Schlüsselvereinbarung per Post-Quanten-Security ist nicht durchgängig — Sie schützt lediglich ausgewählte Schritte innerhalb des Ratchet-Prozesses.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Peer-to-peer

Peer-to-peer (P2P) is the network architecture when participants have equal rights and communicate directly via a general purpose transport or overlay network. Unlike client-server architecture, all peers in a P2P network both provide and consume the resources. In the context of messaging, P2P architecture usually means that the messages are sent between peers, without user accounts or messages being stored on any servers. Examples are Tox, Briar, Cwtch and many others.

+ + + + + + + + + diff --git a/directory/index.html b/directory/index.html index 7016d08a41..c7e10b98f0 100644 --- a/directory/index.html +++ b/directory/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,198 +110,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - - -
-
-

SimpleX explained

- - - - - - - -
-
- -
-
1. What users experience
-
- -

- You can create contacts and groups, and have two-way conversations, as in any other messenger. -

-

- How can it work with unidirectional queues and without user profile identifiers? -

-
-
- -
-
2. How does it work
-
- -

- For each connection you use two separate messaging queues to send and receive messages via different servers. -

-

- Servers only pass messages one way, without having the full picture of user's conversations or connections. -

-
-
- -
-
3. What servers see
-
- -

- The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. -

-

- Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparison with other protocols

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
-
- -
- -
-
-
    -
  1. Usually based on a phone number, in some cases on usernames
  2. -
  3. DNS-based addresses
  4. -
  5. Public key or some other globally unique ID
  6. -
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. -
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. -
  11. Does not protect users' metadata privacy
  12. -
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. -
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Join SimpleX

-

We invite you to join the conversation

- - - -

Sign up to receive our updates

- -
- - - -
- -
- -

Get SimpleX desktop app

-
- - - - - -
-
-
-

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/en/invitation/index.html b/en/invitation/index.html index 77993b80bc..fe03c5aa5c 100644 --- a/en/invitation/index.html +++ b/en/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,188 +110,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/en/messaging/index.html b/en/messaging/index.html new file mode 100644 index 0000000000..cd9603c9f2 --- /dev/null +++ b/en/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
end-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect forward secrecy and break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
content padding

+
+ +

SimpleX uses content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised — see here
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — see here.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/es/contact/index.html b/es/contact/index.html index 65e7738752..a7a7ed05c9 100644 --- a/es/contact/index.html +++ b/es/contact/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/es/fdroid/index.html b/es/fdroid/index.html index 632095b462..d98945d92d 100644 --- a/es/fdroid/index.html +++ b/es/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX explicado

- - - - - - - -
-
- -
-
1. Experiencia del usuario
-
- -

- Puedes crear contactos y grupos, y mantener conversaciones bidireccionales igual que en cualquier aplicación de mensajería. -

-

- ¿Cómo puede funcionar con colas unidireccionales y sin identificadores de usuario? -

-
-
- -
-
2. Cómo funciona la red
-
- -

- Por cada conexión se usan dos colas de mensajes separadas, para que el envío y la recepción se realicen a través de servidores diferentes. -

-

- Los servidores sólo transmiten en un sentido para no disponer de la conversación completa o las conexiones del usuario. -

-
-
- -
-
3. Qué ven los servidores
-
- -

- Para cada cola los servidores disponen de credenciales separadas y anónimas, por lo que desconocen a qué usuarios pertenecen. -

-

- El usuario puede mejorar aún más la privacidad de sus metadatos, haciendo uso de la red Tor para acceder a los servidores, evitando así la correlación por dirección IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+


Libre

+

Libertad y Seguridad
en Tus Comunicaciones

+

La primera red donde tu identidad, contactos y grupos te pertenecen.

- -
-
-

Comparación con otros protocolos

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, grandes plataformasXMPP, MatrixProtocolos P2P
Requiere de identidad globalNo - privado123
Posibilidad de MITMNo - seguro 45
Dependencia del DNSNo - resilienteNo
Red única o centralizadaNo - descentralizadoNo - federado 67
Componente central u otro ataque en toda la redNo - resiliente28
-
- -
- -
-
-
    -
  1. Generalmente basada en un número de teléfono, y en algunos casos en nombres de usuario
  2. -
  3. Direcciones basadas en DNS
  4. -
  5. Clave pública o algun otro ID único a nivel global
  6. -
  7. Los servidores no pueden comprometer el cifrado E2E. Para evitar posibles ataques, verifica el código de seguridad mediante un canal alternativo
  8. -
  9. Si los servidores del operador se ven comprometidos. Verifica el código de seguridad en Signal y otras aplicaciónes para mitigarlo
  10. -
  11. No protege la privacidad de los metadatos del usuario
  12. -
  13. A pesar de que las redes P2P son distribuidas, no son federadas. Funcionan como una única red
  14. -
  15. Las redes P2P, o bien disponen de una autoridad central, o bien la red completa podría verse comprometida - ver aquí
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Auditorías
en Seguridad +

+
+ +
-
-
-
+
+
+
+
+
+
+

Mensajería Más Segura Del Mundo

+

La mensajería SimpleX posee un cifrado de extremo a extremo de vanguardia.

+

Para tu seguridad y privacidad los servidores no pueden ver tus mensajes ni con quién te comunicas.

+ Descubre más sobre la mensajería SimpleX +
+
+
+
+
+
+

La Web
Del Futuro
Te Pertenece

+

SimpleX se funda en la creencia de que debes ser el propietario de tu identidad, contactos y comunidades.

+

Una red abierta y descentralizada que te permite conectarte con personas y compartir ideas: libre y segura.

+
+
+
+
+
+
+

Comunidades Duraderas

+

Podrás apoyar a tus grupos favoritos con los futuros Vales Comunitarios.

+

Los vales costearán los servidores para que tus comunidades sigan siendo libres e independientes.

+ Descubre más y obtén tu NFT gratuito
por participar en las pruebas.
+
+
+
-
-
-

Únete a SimpleX

-

Te invitamos a unirte a la conversación

- - - -

Suscríbete para recibir actualizaciones

- -
- - - -
- -
- -

Obtén SimpleX para desktop

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

- +
+
+
+

Ruta SimpleX hacía el Internet Libre

+
+

2025

+

: Escalar a Comunidades Grandes

+

Huir de plataformas centralizadas

+
+
+

2026

+

: Comunidades y Servidores Sostenibles

+

Lanzamiento de Vales Comunitarios

+
+
+

2027

+

: Haz Crecer Tus Comunidades

+

Herramientas para la promoción

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Únete a las Comunidades SimpleX

+

Miles de personas confían ya en la mensajería SimpleX.

+

¡Encuentra comunidades en el directorio SimpleX y crea la tuya!

+ Ir al Directorio SimpleX +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/es/invitation/index.html b/es/invitation/index.html index debd292756..be0a2b2282 100644 --- a/es/invitation/index.html +++ b/es/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/es/messaging/index.html b/es/messaging/index.html new file mode 100644 index 0000000000..7b21583f24 --- /dev/null +++ b/es/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Por qué SimpleX es único

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

La privacidad es completa

+
+ +
+ +
+

+ SimpleX protege la privacidad de tu perfil, contactos y metadatos, ocultándolos de los servidores SimpleX y de cualquier observador. +

+

+ A diferencia de cualquier otra red de mensajería existente, SimpleX no tiene identificadores asignados a los usuarios, ni siquiera números aleatorios. +

+ +
+ + + Descubre más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Estás protegido
contra el spam y el abuso

+
+ +
+ +
+

+ Al no tener identificadores o dirección permanente en la red SimpleX, nadie puede ponerse en contacto contigo salvo que compartas una dirección de usuario de un solo uso o una dirección temporal en forma de enlace o código QR. +

+ +
+ + + Descubre más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Tu gestionas tus datos

+
+ +
+ +
+

+ SimpleX almacena todos los datos de usuario únicamente en los dispositivos cliente usando un formato cifrado y portable de la base de datos, la cual puede ser transferida a otro dispositivo. +

+

+ Los mensajes cifrados de extremo a extremo (E2E) se mantienen temporalmente en los servidores SimpleX hasta que se entregan al destinatario, y después se borran definitivamente. +

+ +
+ + + Descubre más + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

La red SimpleX te pertenece

+
+ +
+ +
+

+ La red SimpleX está completamente descentralizada y es independiente de cualquier criptodivisa o de cualquier red salvo Internet. +

+

+ Puedes usar SimpleX con tus propios servidores o con los servidores proporcionados por nosotros para contactar con cualquier usuario. +

+ +
+ + + Descubre más + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Características

+ +
+ +
+
+ + +
+

Mensajes cifrados E2E
con sintáxis markdown y edición

+
+ +
+
+ + +
+

Cifrado E2E
de imágenes, vídeos y archivos

+
+ +
+
+ + +
+

Grupos descentralizados cifrados E2E, sólo los usuarios saben de su existencia

+
+ +
+
+ + +
+

Mensajes de voz cifrados E2E

+
+ +
+
+ + +
+

Mensajes temporales

+
+ +
+
+ + +
+

Llamadas y videollamadas
con cifrado E2E

+
+ +
+
+ + +
+

Almacenamiento portable y cifrado, podrás transferir tu perfil a otro dispositivo

+
+ +
+
+ + +
+

Modo Incógnito
exclusivo de SimpleX Chat

+
+ +
+
+
+ + +
+
+

Qué hace que SimpleX sea privado

+ +
+
+ + +
+
+ + +
+
+

Identificadores por pares temporales y anónimos

+
+ +

SimpleX usa direcciones y credenciales temporales y anónimas por pares para cada contacto o miembro del grupo.

+ +

Esto permite entregar mensajes sin identificadores del perfil de usuario y proporcionar mayor privacidad de metadatos que las alternativas.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Intercambio de claves
fuera de banda

+
+ +

Muchas redes de comunicaciónes son vulnerables a ataques MITM por parte de los servidores o los proveedores de red.

+ +

Para evitarlo las aplicaciones SimpleX pasan claves de un solo uso fuera de banda cuando compartes un enlace de dirección o un código QR.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Doble capa de cifrado
de extremo a extremo

+
+ +

Protocolo de 'Double Ratchet' —
Mensajería OTR con secreto perfecto hacia adelante y recuperación de intrusión.

+ +

Y si el protocolo TLS se ve comprometido, NaCL cryptobox en cada cola de mensajes para prevenir la correlación de tráfico entre las colas.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Verificación de la
integridad del mensaje

+
+ +

Para garantizar la integridad los mensajes se numeran secuencialmente e incluyen el hash del mensaje anterior.

+ +

Si se añade, elimina o modifica algún mensaje, el destinatario es avisado.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Capa de cifrado
adicional en el servidor

+
+ +

Capa de cifrado adicional desde el servidor al destinatario, para prevenir la correlación entre el tráficos de entrada y salida del servidor si el protocolo TLS se ve comprometido.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Mezcla de mensajes
para prevenir la correlación

+
+ +

Los servidores SimpleX actúan como nodos de mezcla de baja latencia, los mensajes entrantes y salientes siguen un orden diferente.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Transporte TLS
seguro y autenticado

+
+ +

Para las conexiones cliente servidor se usan exclusivamente el protocolo TLS 1.2/1.3 con algoritmos robustos.

+ +

La huella digital del servidor y la vinculación de canales evitan los ataques de respuesta y MITM.

+ +

La reanudación de la conexión está deshabilitada para evitar ataques de sesión.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Acceso opcional
a través de Tor

+
+ +

Para proteger tu dirección IP, puedes acceder a los servidores a través Tor u otra red superpuesta de transporte.

+ +

Para usar SimpleX a través de Tor, instala la aplicación Orbot y activa el proxy SOCKS5 (o VPN en iOS).

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Colas de mensajes
unidireccionales

+
+ +

Cada cola de mensajes transmite los mensajes en un sol sentido. entre las direcciónes de envío y recepción.

+ +

Esto reduce los vectores de ataque y los metadatos disponibles en comparación con los brokers de mensajes tradicionales.

+ +
+

Pulsa para cerrar

+
+
+ +
+
+ + +
+
+

Múltiples capas
de contenido acolchado

+
+ +

SimpleX utiliza relleno de contenido en cada capa de cifrado para frustrar los ataques al tamaño de los mensajes.

+ +

Esto hace que mensajes de distintos tamaños parezcan iguales desde el punto de vista de servidores y observadores de red.

+ +
+

Pulsa para cerrar

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Red SimpleX

+

Simplex Chat proporciona la mejor privacidad al combinar las ventajas de P2P y las redes federadas.

+ +
+
+
+ + +
+
+

Distinta de las redes P2P

+

+ Todos los mensajes se envían a través de los servidores, proporcionando mejor privacidad para los metadatos y entrega asíncrona fiable, evitando al mismo tiempo muchos de los problemas asociados a las redes P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Distinta de las redes federadas

+

+ Los servidores de SimpleX NO almacenan perfiles de usuario, contactos, o mensajes entregados. NO contactan entre sí y NO existe un directorio de servidores. +

+
+
+ + + +
+
+ + +
+
+

Red Simplex

+

+ los servidores proporcionan colas unidireccionales para conectar a los usuarios pero no ven la gráfica de conexiónes red, sólo los usuarios pueden verla. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explicado

+ + + + + + + +
+
+ +
+
1. Experiencia del usuario
+
+ +

+ Puedes crear contactos y grupos, y mantener conversaciones bidireccionales igual que en cualquier aplicación de mensajería. +

+

+ ¿Cómo puede funcionar con colas unidireccionales y sin identificadores de usuario? +

+
+
+ +
+
2. Cómo funciona la red
+
+ +

+ Por cada conexión se usan dos colas de mensajes separadas, para que el envío y la recepción se realicen a través de servidores diferentes. +

+

+ Los servidores sólo transmiten en un sentido para no disponer de la conversación completa o las conexiones del usuario. +

+
+
+ +
+
3. Qué ven los servidores
+
+ +

+ Para cada cola los servidores disponen de credenciales separadas y anónimas, por lo que desconocen a qué usuarios pertenecen. +

+

+ El usuario puede mejorar aún más la privacidad de sus metadatos, haciendo uso de la red Tor para acceder a los servidores, evitando así la correlación por dirección IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparación con otros protocolos

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plataformasXMPP, MatrixProtocolos P2P
Requiere de identidad globalNo - privado123
Posibilidad de MITMNo - seguro 45
Dependencia del DNSNo - resilienteNo
Red única o centralizadaNo - descentralizadoNo - federado 67
Componente central u otro ataque en toda la redNo - resiliente28
+
+ +
+ +
+
+
    +
  1. Generalmente basada en un número de teléfono, y en algunos casos en nombres de usuario
  2. +
  3. Direcciones basadas en DNS
  4. +
  5. Clave pública o algun otro ID único a nivel global
  6. +
  7. Los servidores no pueden comprometer el cifrado E2E. Para evitar posibles ataques, verifica el código de seguridad mediante un canal alternativo
  8. +
  9. Si los servidores del operador se ven comprometidos. Verifica el código de seguridad en Signal y otras aplicaciónes para mitigarlo
  10. +
  11. No protege la privacidad de los metadatos del usuario
  12. +
  13. A pesar de que las redes P2P son distribuidas, no son federadas. Funcionan como una única red
  14. +
  15. Las redes P2P, o bien disponen de una autoridad central, o bien la red completa podría verse comprometida — ver aquí
  16. +
+
+
+
+
+ +
+
+

Comparativa del cifrado de extremo a extremo en los distintos mensajeros

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Relleno de mensajes✔︎1✔︎✔︎1✔︎
Repudio (negabilidad)✔︎2✔︎3✔︎
Secreto hacia adelante✔︎✔︎✔︎✔︎✔︎
Seguridad tras ser comprometido✔︎4✔︎
Intercambio de claves de dobre factor✔︎✔︎5✔︎5✔︎✔︎5✔︎
Cifrado híbrido postcuántico✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar rellena los mensajes hasta el tamaño redondeado a 1024 bytes, Signal a 160 bytes
  2. +
  3. El repudio no incluye la conexión cliente‑servidor.
  4. +
  5. Parece que el uso de firmas criptográficas compromete el repudio (negabilidad) pero es necesario aclararlo.
  6. +
  7. La implementación multi‑dispositivo compromete la seguridad posterior a ser comprometida del Double Ratchet — ver aquí.
  8. +
  9. El intercambio de clave de doble factor es opcional mediante la verificación del código de seguridad.
  10. +
  11. El acuerdo de claves postcuántico es "parcial", solo protege determinados pasos del ratchet.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/fa/contact/index.html b/fa/contact/index.html index 231e4677e5..5bb98c59ed 100644 --- a/fa/contact/index.html +++ b/fa/contact/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/fa/fdroid/index.html b/fa/fdroid/index.html index 938ce1a928..264ce2aac4 100644 --- a/fa/fdroid/index.html +++ b/fa/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

توضیحات در مورد SimpleX

- - - - - - - -
-
- -
-
۱. تجربه کاربران
-
- -

- شما می‌توانید مخاطبین و گروه‌ها را ایجاد کنید و مانند هر پیام‌رسان دیگری، مکالمات دوطرفه داشته باشید. -

-

- چگونه می‌تواند با صف‌های یک‌طرفه و بدون شناسه‌های پروفایل کاربر کار کند؟ -

-
-
- -
-
۲. چگونه کار می‌کند
-
- -

- برای هر اتصال، شما از دو صف پیام جداگانه برای ارسال و دریافت پیام‌ها از طریق سرورهای مختلف استفاده می‌کنید. -

-

- سرورها فقط پیام‌ها را به یک سمت منتقل می‌کنند و از جزئیات کامل مکالمات یا ارتباطات کاربران بی‌خبر هستند. -

-
-
- -
-
۳. آنچه سرورها می‌بینند
-
- -

- سرورها برای هر صف دارای اعتبارنامه‌های جداگانه و ناشناس هستند و نمی‌دانند که این اعتبارنامه‌ها به کدام کاربران تعلق دارند. -

-

- کاربران می‌توانند با استفاده از Tor برای دسترسی به سرورها، حریم خصوصی فراداده را بیشتر بهبود بخشند و از شناسایی بر اساس آدرس IP جلوگیری کنند. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

مقایسه با سایر پروتکل‌ها

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - سیگنال، پلتفرم‌های بزرگXMPP، Matrixپروتکل‌های P2P
نیاز به هویت جهانی داردخیر - خصوصیبله 1بله 2بله 3
امکان حمله MITMخیر - امن 4بله 5بلهبله
وابستگی به DNSخیر - مقاومبلهبلهخیر
شبکه تک یا متمرکزخیر - غیرمتمرکزبلهخیر - فدرال 6بله 7
مؤلفه مرکزی یا حمله‌ای در سطح شبکهخیر - مقاومبلهبله 2بله 8
-
- -
- -
-
-
    -
  1. معمولاً بر اساس شماره تلفن و در برخی موارد بر اساس نام‌های کاربری
  2. -
  3. آدرس‌های مبتنی بر DNS
  4. -
  5. کلید عمومی یا برخی دیگر از شناسه‌های منحصربه‌فرد جهانی
  6. -
  7. رله‌های SimpleX نمی‌توانند رمزنگاری انتها به انتها را به خطر بیندازند. توصیه می‌شود کد امنیتی را برای کاهش حمله در کانال out-of-band تأیید کنید
  8. -
  9. اگر سرورهای اپراتور به خطر بیفتند. کد امنیتی را در سیگنال و برخی دیگر از برنامه‌ها تأیید کنید تا این خطر را کاهش دهید
  10. -
  11. از حریم خصوصی فراداده‌های کاربران محافظت نمی‌کند
  12. -
  13. در حالی که شبکه‌های P2P توزیع‌شده هستند، اما فدرال نیستند — آن‌ها به‌عنوان یک شبکه واحد عمل می‌کنند
  14. -
  15. شبکه‌های P2P یا دارای یک نهاد مرکزی هستند یا کل شبکه می‌تواند به خطر بیفتد - اینجا را ببینید
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

پیوستن SimpleX

-

ما شما را به پیوستن به گفتگو دعوت می‌کنیم

- - - -

برای دریافت به‌روزرسانی‌های ما ثبت‌نام کنید

- -
- - - -
- -
- -

برنامه دسکتاپ SimpleX را دریافت کنید

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/fa/invitation/index.html b/fa/invitation/index.html index 8579771d29..9c2ac55847 100644 --- a/fa/invitation/index.html +++ b/fa/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/fa/messaging/index.html b/fa/messaging/index.html new file mode 100644 index 0000000000..6218aee742 --- /dev/null +++ b/fa/messaging/index.html @@ -0,0 +1,1927 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

چرا SimpleX منحصربه‌فرد است

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

شما حریم خصوصی کاملی دارید

+
+ +
+ +
+

+ SimpleX حریم خصوصی پروفایل، مخاطبین و فراداده‌های شما را محافظت می‌کند و آن‌ها را از سرورهای شبکه SimpleX و هر ناظر دیگری پنهان می‌سازد. +

+

+ برخلاف هر شبکه پیام‌رسان دیگری، SimpleX هیچ شناسه‌ای به کاربران اختصاص نمی‌دهد — حتی شماره‌های تصادفی نیز وجود ندارد. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

شما از هرزنامه و سوءاستفاده محافظت می‌شوید

+
+ +
+ +
+

+ از آنجا که شما هیچ شناسه یا آدرس ثابتی در شبکه SimpleX ندارید، هیچ‌کس نمی‌تواند با شما تماس بگیرد مگر اینکه یک آدرس کاربری یک‌بار مصرف یا موقتی را به‌عنوان کد QR یا لینک به اشتراک بگذارید. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

شما بر داده‌های خود کنترل دارید

+
+ +
+ +
+

+ SimpleX تمام داده‌های کاربری را بر روی دستگاه‌های کلاینت در یک فرمت پایگاه داده رمزنگاری شده قابل حمل ذخیره می‌کند — این داده‌ها می‌توانند به دستگاه دیگری منتقل شوند. +

+

+ پیام‌های رمزنگاری شده انتها به انتها به‌طور موقت بر روی سرورهای رله SimpleX نگهداری می‌شوند تا دریافت شوند و سپس به‌طور دائمی حذف می‌شوند. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

­شما مالک شبکه SimpleX هستید

+
+ +
+ +
+

+ شبکه SimpleX به‌طور کامل غیرمتمرکز و مستقل از هر ارز دیجیتال یا هر شبکه دیگری به جز اینترنت است. +

+

+ شما می‌توانید از SimpleX با سرورهای خود استفاده کنید یا از سرورهای ارائه‌شده توسط ما استفاده کنید — و همچنان به هر کاربری متصل شوید. +

+ +
+ + + بیشتر بدانید + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

ویژگی‌ها

+ +
+ +
+
+ + +
+

پیام‌های رمزنگاری شده انتها به انتها با ویرایش و فرمت‌بندی Markdown

+
+ +
+
+ + +
+

تصاویر، ویدیوها و فایل‌های رمزنگاری شده انتها به انتها

+
+ +
+
+ + +
+

گروه‌های غیرمتمرکز رمزنگاری شده انتها به انتها — تنها کاربران می‌دانند که این گروه‎ها وجود دارند

+
+ +
+
+ + +
+

پیام‌های صوتی رمزنگاری شده به صورت انتها به انتها

+
+ +
+
+ + +
+

پیام‌های ناپدید شونده

+
+ +
+
+ + +
+

تماس‌های صوتی و ویدیویی رمزنگاری شده انتها به انتها

+
+ +
+
+ + +
+

فضای ذخیره‌سازی رمزنگاری شده قابل حمل — انتقال پروفایل به دستگاه دیگر

+
+ +
+
+ + +
+

حالت ناشناس —
منحصربه‌فرد برای SimpleX Chat

+
+ +
+
+
+ + +
+
+

چه چیزی SimpleX را خصوصی می‌کند

+ +
+
+ + +
+
+ + +
+
+

شناسه‌های موقت ناشناس دوطرفه

+
+ +

SimpleX از آدرس‌ها و اعتبارنامه‌های موقتی و ناشناس جفت‌به‌جفت برای هر مخاطب کاربر یا عضو گروه استفاده می‌کند.

+ +

این امکان را فراهم می‌کند که پیام‌ها بدون شناسه‌های پروفایل کاربر ارسال شوند و حریم خصوصی فراداده بهتری نسبت به گزینه‌های دیگر ارائه می‌دهد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

مبادله کلید خارج از باند

+
+ +

بسیاری از شبکه‌های ارتباطی در برابر حملات MITM توسط سرورها یا ارائه‌دهندگان شبکه آسیب‌پذیر هستند.

+ +

زمانی که آدرسی را به عنوان لینک یا کد QR به اشتراک می‌گذارید، برنامه‌های SimpleX کلیدهای یک‌بار مصرف را به صورت خارج از باند منتقل می‌کنند تا از این موضوع جلوگیری شود.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

دو لایه از
رمزنگاری انتها به انتها

+
+ +

پروتکل Double-ratchet — پیام‌رسانی OTR با محرمانگی کامل پیشرو و بازیابی در صورت نفوذ.

+ +

NaCL cryptobox در هر صف برای جلوگیری از همبستگی ترافیک بین صف‌های پیام اگر TLS به خطر بیفتد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

تأیید صحت پیام

+
+ +

برای تضمین یکپارچگی، پیام‌ها به صورت ترتیبی شماره‌گذاری شده و شامل هش پیام قبلی هستند.

+ +

اگر هر پیامی اضافه، حذف یا تغییر یابد، گیرنده مطلع خواهد شد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

لایه اضافی از
رمزنگاری سرور

+
+ +

برای تحویل به گیرنده، لایه اضافی رمزنگاری سرور اضافه می‌شود تا در صورت به خطر افتادن TLS، از همبستگی بین ترافیک دریافتی و ارسالی سرور جلوگیری شود.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

مخلوط‌سازی پیام
برای کاهش امکان رهگیری

+
+ +

سرورهای SimpleX به عنوان گره‌های میکس با تأخیر کم عمل می‌کنند — پیام‌های ورودی و خروجی ترتیب متفاوتی دارند.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

انتقال TLS امن و تأییدشده

+
+ +

فقط از TLS 1.2/1.3 با الگوریتم‌های قوی برای اتصالات کلاینت-سرور استفاده می‌شود.

+ +

اثر انگشت سرور و اتصال کانال از حملات MITM و حملات replay جلوگیری می‌کنند.

+ +

برای جلوگیری از حملات نشست، از سرگیری اتصال غیرفعال شده است.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

دسترسی اختیاری از طریق
Tor

+
+ +

برای محافظت از آدرس IP خود، می‌توانید از طریق Tor یا برخی دیگر از شبکه‌های حمل و نقل پوششی به سرورها دسترسی پیدا کنید.

+ +

برای استفاده از SimpleX از طریق Tor، لطفاً برنامه Orbot را نصب کرده و پروکسی SOCKS5 (یا VPN در iOS) را فعال کنید.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

صف‌های پیام یک‌طرفه

+
+ +

هر صف پیام، پیام‌ها را در یک جهت منتقل می‌کند و آدرس‌های ارسال و دریافت متفاوتی دارد.

+ +

این کار نسبت به کارگزارهای پیام سنتی و فراداده‌های موجود، بردارهای حمله را کاهش می‌دهد.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+
+ + +
+
+

چندین لایه از
پدینگ محتوا

+
+ +

SimpleX از padding محتوا برای هر لایه رمزنگاری استفاده می‌کند تا از حملات اندازه پیام جلوگیری کند.

+ +

این کار باعث می‌شود که پیام‌های با اندازه‌های مختلف برای سرورها و ناظران شبکه یکسان به نظر برسند.

+ +
+

برای بستن ضربه بزنید

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

شبکه SimpleX

+

چت SimpleX بهترین حریم خصوصی را با ترکیب مزایای شبکه‌های P2P و شبکه‌های فدرال ارائه می‌دهد.

+ +
+
+
+ + +
+
+

برخلاف شبکه‌های P2P

+

+ تمام پیام‌ها از طریق سرورها ارسال می‌شوند که هم حریم خصوصی فراداده را بهتر تأمین می‌کند و هم تحویل پیام‌های غیرهمزمان قابل اعتماد را فراهم می‌آورد، در حالی که از بسیاری از مشکلات جلوگیری می‌کند. مشکلات شبکه‌های P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

برخلاف شبکه‌های فدرال

+

+ سرورهای رله SimpleX پروفایل‌های کاربری، مخاطبین و پیام‌های تحویل‌شده را ذخیره نمی‌کنند، به یکدیگر متصل نمی‌شوند و هیچ دایرکتوری سروری وجود ندارد. +

+
+
+ + + +
+
+ + +
+
+

شبکه SimpleX

+

+ سرورها صف‌های یک‌طرفه را برای اتصال کاربران فراهم می‌کنند، اما هیچ دیدگاهی از نمودار ارتباطات شبکه ندارند — تنها کاربران این دید را دارند. +

+
+
+ +
+
+ +
+ + + + + +
+
+

توضیحات در مورد SimpleX

+ + + + + + + +
+
+ +
+
۱. تجربه کاربران
+
+ +

+ شما می‌توانید مخاطبین و گروه‌ها را ایجاد کنید و مانند هر پیام‌رسان دیگری، مکالمات دوطرفه داشته باشید. +

+

+ چگونه می‌تواند با صف‌های یک‌طرفه و بدون شناسه‌های پروفایل کاربر کار کند؟ +

+
+
+ +
+
۲. چگونه کار می‌کند
+
+ +

+ برای هر اتصال، شما از دو صف پیام جداگانه برای ارسال و دریافت پیام‌ها از طریق سرورهای مختلف استفاده می‌کنید. +

+

+ سرورها فقط پیام‌ها را به یک سمت منتقل می‌کنند و از جزئیات کامل مکالمات یا ارتباطات کاربران بی‌خبر هستند. +

+
+
+ +
+
۳. آنچه سرورها می‌بینند
+
+ +

+ سرورها برای هر صف دارای اعتبارنامه‌های جداگانه و ناشناس هستند و نمی‌دانند که این اعتبارنامه‌ها به کدام کاربران تعلق دارند. +

+

+ کاربران می‌توانند با استفاده از Tor برای دسترسی به سرورها، حریم خصوصی فراداده را بیشتر بهبود بخشند و از شناسایی بر اساس آدرس IP جلوگیری کنند. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

مقایسه با سایر پروتکل‌ها

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + سیگنال، پلتفرم‌های بزرگXMPP، Matrixپروتکل‌های P2P
نیاز به هویت جهانی داردخیر - خصوصیبله 1بله 2بله 3
امکان حمله MITMخیر - امن 4بله 5بلهبله
وابستگی به DNSخیر - مقاومبلهبلهخیر
شبکه تک یا متمرکزخیر - غیرمتمرکزبلهخیر - فدرال 6بله 7
مؤلفه مرکزی یا حمله‌ای در سطح شبکهخیر - مقاومبلهبله 2بله 8
+
+ +
+ +
+
+
    +
  1. معمولاً بر اساس شماره تلفن و در برخی موارد بر اساس نام‌های کاربری
  2. +
  3. آدرس‌های مبتنی بر DNS
  4. +
  5. کلید عمومی یا برخی دیگر از شناسه‌های منحصربه‌فرد جهانی
  6. +
  7. رله‌های SimpleX نمی‌توانند رمزنگاری انتها به انتها را به خطر بیندازند. توصیه می‌شود کد امنیتی را برای کاهش حمله در کانال out-of-band تأیید کنید
  8. +
  9. اگر سرورهای اپراتور به خطر بیفتند. کد امنیتی را در سیگنال و برخی دیگر از برنامه‌ها تأیید کنید تا این خطر را کاهش دهید
  10. +
  11. از حریم خصوصی فراداده‌های کاربران محافظت نمی‌کند
  12. +
  13. در حالی که شبکه‌های P2P توزیع‌شده هستند، اما فدرال نیستند — آن‌ها به‌عنوان یک شبکه واحد عمل می‌کنند
  14. +
  15. شبکه‌های P2P یا دارای یک نهاد مرکزی هستند یا کل شبکه می‌تواند به خطر بیفتد — اینجا را ببینید
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — اینجا را ببینید.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/faq/index.html b/faq/index.html index 328e87445f..ef9b0b3280 100644 --- a/faq/index.html +++ b/faq/index.html @@ -36,6 +36,8 @@ + + @@ -53,12 +55,12 @@ + - -
- + + @@ -99,188 +101,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - -
- -
+
-
+ diff --git a/fdroid/index.html b/fdroid/index.html index ee353d0b08..8f49f6630f 100644 --- a/fdroid/index.html +++ b/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,188 +110,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX selitetynä

- - - - - - - -
-
- -
-
1. Mitä käyttäjät kokevat
-
- -

- Voit luoda yhteyshenkilöitä ja ryhmiä sekä käydä kaksisuuntaisia keskusteluja kuten missä tahansa muussa viestisovelluksessa. -

-

- Kuinka se voi toimia yksisuuntaisten jonotusten kanssa ilman käyttäjäprofiilin tunnisteita? -

-
-
- -
-
2. Miten se toimii
-
- -

- Jokaista yhteyttä varten käytetään kahta erillistä viestintäjonon mahdollistavaa palvelinta viestien lähettämiseen ja vastaanottamiseen. -

-

- Palvelimet välittävät viestejä vain yhteen suuntaan eivätkä saa kokonaiskuvaa käyttäjän keskustelusta tai yhteyksistä. -

-
-
- -
-
3. Mitä palvelimet näkevät
-
- -

- Palvelimilla on erilliset anonyymit tunnistetiedot kullekin jonolle, eivätkä ne tiedä, mille käyttäjille ne kuuluvat. -

-

- Käyttäjät voivat lisäksi parantaa metadata-yksityisyyttään käyttämällä Tor-verkkoa palvelimiin yhdistämiseen, mikä estää IP-osoitteen perusteella tapahtuvan yhteyksien tekemisen. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Vertailu muihin protokolliin

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, suuret alustatXMPP, MatrixP2P-protokollat
Vaati globaalin identiteetinEi - yksityinenKyllä 1Kyllä 2Kyllä 3
Mahdollisuus MITM-hyökkäykseenEi - turvallinen 4Kyllä 5KylläKyllä
Riippuvuus DNS:stäEi - joustavaKylläKylläEi
Yksittäinen tai keskitetty verkkoEi - hajautettuKylläEi - liitetty 6Kyllä 7
Keskuskomponentti tai muu verkkoa koskeva hyökkäysEi - joustavaKylläKyllä 2Kyllä 8
-
- -
- -
-
-
    -
  1. Yleensä pohjautuu puhelinnumeroon, joissain tapauksissa käyttäjänimiin
  2. -
  3. DNS-pohjaiset osoitteet
  4. -
  5. Julkinen avain tai jokin muu maailmanlaajuisesti uniikki tunniste
  6. -
  7. SimpleXin releapalvelimet eivät voi vaarantaa päästä päähän -salausta. Tarkista turvakoodi hyödyntääksesi hyökkäyssuojaa ylitys-kanavalla
  8. -
  9. Jos operaattorin palvelimet ovat vaarantuneet. Tarkista turvakoodi Signalissa ja joissakin muissa sovelluksissa suojautuaksesi hyökkäykseltä
  10. -
  11. Ei suojaa käyttäjien metatietojen yksityisyyttä
  12. -
  13. Vaikka P2P-verkot ovat hajautettuja, ne eivät ole liitettäviä - ne toimivat yhtenä verkostona
  14. -
  15. P2P-verkoilla on joko keskitetty auktoriteetti tai koko verkko voidaan vaarantaa - katso täältä
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Liity SimpleX

-

Kutsumme sinut mukaan keskusteluun

- - - -

Tilaa päivityksemme

- -
- - - -
- -
- -

Hanki SimpleX desktop app

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/fi/invitation/index.html b/fi/invitation/index.html index a7249082d5..a6e566919b 100644 --- a/fi/invitation/index.html +++ b/fi/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/fi/messaging/index.html b/fi/messaging/index.html new file mode 100644 index 0000000000..4a7e3b29a6 --- /dev/null +++ b/fi/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Miksi SimpleX on ainutlaatuinen

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Sinulla on täydellinen yksityisyys

+
+ +
+ +
+

+ SimpleX suojaa profiilisi, yhteystietosi ja metatietosi yksityisyyden, piilottaen ne SimpleX-alustan palvelimilta ja kaikilta havainnoijilta. +

+

+ Toisin kuin millään muulla olemassa olevalla viestintäalustalla, SimpleX:llä ei ole tunnisteita käyttäjille — ei edes satunnaisia numeroita. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Olet suojattu roskapostilta ja väärinkäytöksiltä

+
+ +
+ +
+

+ Koska sinulla ei ole tunnistetta tai kiinteää osoitetta SimpleX-alustalla, kukaan ei voi ottaa sinuun yhteyttä, ellet jaa kertakäyttöistä tai väliaikaista käyttäjäosoitetta, kuten QR-koodia tai linkkiä. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sinä hallitset tietojasi

+
+ +
+ +
+

+ SimpleX tallentaa kaikki käyttäjätiedot asiakaslaitteille siirrettävässä salatussa tietokannan muodossa — se voidaan siirtää toiseen laitteeseen. +

+

+ Päästä päähän salatut viestit säilytetään väliaikaisesti SimpleX-releay-palvelimilla, kunnes ne vastaanotetaan, minkä jälkeen ne poistetaan pysyvästi. +

+ +
+ + + Lue lisää + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Omistat SimpleX-verkon

+
+ +
+ +
+

+ SimpleX-verkko on täysin hajautettu ja riippumaton mistään kryptovaluutasta tai mistään muusta alustasta paitsi Internetistä. +

+

+ Voit käyttää SimpleX:ää omien palvelimiesi kanssa tai meidän tarjoamillamme palvelimilla — ja silti yhdistyä mihin tahansa käyttäjään. +

+ +
+ + + Lue lisää + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Ominaisuudet

+ +
+ +
+
+ + +
+

Päästä päähän salattuja viestejä markdownin ja muokkaamisen kera

+
+ +
+
+ + +
+

Päästä päähän salattuja
kuvia, videoita ja tiedostoja

+
+ +
+
+ + +
+

E2E-salatut hajautetut ryhmät — vain käyttäjät tietävät niiden olemassaolosta

+
+ +
+
+ + +
+

Päästä päähän salattuja ääniviestejä

+
+ +
+
+ + +
+

Katoavia viestejä

+
+ +
+
+ + +
+

Päästä päähän salattuja
puheluita ja videopuheluja

+
+ +
+
+ + +
+

Kannettava salattu sovellustallennus — siirrä profiili toiseen laitteeseen

+
+ +
+
+ + +
+

Incognito-tila —
ainutlaatuinen SimpleX Chatille

+
+ +
+
+
+ + +
+
+

Mikä tekee SimpleX:stä yksityisen

+ +
+
+ + +
+
+ + +
+
+

Väliaikaiset nimettömät parittaiset tunnisteet

+
+ +

SimpleX käyttää väliaikaisia nimettömiä parittaisia osoitteita ja tunnistetietoja jokaiselle käyttäjäkontaktille tai ryhmän jäsenelle.

+ +

Se mahdollistaa viestien toimittamisen ilman käyttäjäprofiilitunnisteita, tarjoten paremman metatietosuojan kuin vaihtoehdot.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Avainvaihto kanavan ulkopuolella
(out-of-band)

+
+ +

Monet viestintäalustat ovat alttiita välikäden hyökkäyksille palvelimilta tai verkko-operaattoreilta.

+ +

Estääkseen sen, SimpleX-sovellukset siirtävät yksittäiset avaimet kanavan ulkopuolella, kun jaat osoitteen linkkinä tai QR-koodina.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

2 kerrosta päästä päähän salattua viestintää

+
+ +

Kaksoisruuviprotokolla —
OTR-viestintä täydellisellä eteenpäinsalauksella ja murron palautuksella.

+ +

NaCL-kryptolaatikko kussakin jonossa estämään liikenteen korrelaatiota viestijonojen välillä, jos TLS vaarantuu.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Viestin eheys
vahvistus

+
+ +

Viestien eheyden varmistamiseksi ne numeroituvat peräkkäin ja sisältävät edellisen viestin tiivisteen.

+ +

Jos viestiä lisätään, poistetaan tai muutetaan, vastaanottaja saa ilmoituksen.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Lisäkerros palvelimen salaukselle

+
+ +

Lisäkerros palvelimen salaukselle vastaanottajalle toimittaessa, jotta lähetetyn ja vastaanotetun palvelinliikenteen korrelaatio estyy, jos TLS vaarantuu.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Viestien sekoitus
korrelaation vähentämiseksi

+
+ +

SimpleX-palvelimet toimivat matalan viiveen sekoitussolmuina — saapuvilla ja lähtevillä viesteillä on erilainen järjestys.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Turvallinen tunnistettu
TLS-tiedonsiirto

+
+ +

Vain TLS 1.2/1.3 vahvoilla algoritmeilla käytetään asiakas-palvelin-yhteyksiin.

+ +

Palvelimen sormenjälki ja kanavan sitominen estävät välikäden hyökkäykset ja toistohyökkäykset.

+ +

Yhteyden jatkaminen on estetty istuntohyökkäysten estämiseksi.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Vaihtoehtoinen pääsy Torin kautta

+
+ +

Suojataksesi IP-osoitettasi, voit käyttää palvelimia Tor-verkon tai jonkin muun kuljetuskerroksen päällä.

+ +

Käyttääksesi SimpleX:ää Torin kautta, asenna Orbot-sovellus ja ota käyttöön SOCKS5-välityspalvelin (tai VPN iOS:lla).

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Yksisuuntaisia
viestijonoja

+
+ +

Jokainen viestijono siirtää viestejä yhteen suuntaan, eri lähettävillä ja vastaanottavilla osoitteilla.

+ +

Se vähentää hyökkäysvektoreita verrattuna perinteisiin viestivälittimiin ja saatavilla oleviin metatietoihin.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+
+ + +
+
+

Useita tasoja
sisältöpakkauksia

+
+ +

SimpleX käyttää sisältöpakkauksia jokaiselle salauskerrokselle estämään viestikoon hyökkäyksiä.

+ +

Se saa erikokoiset viestit näyttämään samalta palvelimille ja verkon tarkkailijoille.

+ +
+

Napauta sulkeaksesi

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Verkko

+

Simplex Chat tarjoaa parhaan yksityisyyden yhdistämällä P2P-verkkojen ja liitettävien verkkojen edut.

+ +
+
+
+ + +
+
+

Toisin kuin P2P-verkot

+

+ Kaikki viestit lähetetään palvelimien kautta, mikä sekä parantaa metatietojen yksityisyyttä että mahdollistaa luotettavan asynkronisen viestien toimituksen, samalla välttäen monia P2P-verkkojen ongelmia. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Toisin kuin liitettävät verkot

+

+ SimpleXin relea-palvelimet EIVÄT tallenna käyttäjäprofiileja, yhteystietoja ja toimitettuja viestejä, ne EIVÄT yhdisty toisiinsa, eikä ole OLE olemassa palvelinluetteloa. +

+
+
+ + + +
+
+ + +
+
+

SimpleX-verkko

+

+ palvelimet tarjoavat yksisuuntaisia jonopalveluja yhdistääkseen käyttäjät, mutta niillä ei ole näkyvyyttä verkon yhteyskarttaan — ainoastaan käyttäjillä on. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX selitetynä

+ + + + + + + +
+
+ +
+
1. Mitä käyttäjät kokevat
+
+ +

+ Voit luoda yhteyshenkilöitä ja ryhmiä sekä käydä kaksisuuntaisia keskusteluja kuten missä tahansa muussa viestisovelluksessa. +

+

+ Kuinka se voi toimia yksisuuntaisten jonotusten kanssa ilman käyttäjäprofiilin tunnisteita? +

+
+
+ +
+
2. Miten se toimii
+
+ +

+ Jokaista yhteyttä varten käytetään kahta erillistä viestintäjonon mahdollistavaa palvelinta viestien lähettämiseen ja vastaanottamiseen. +

+

+ Palvelimet välittävät viestejä vain yhteen suuntaan eivätkä saa kokonaiskuvaa käyttäjän keskustelusta tai yhteyksistä. +

+
+
+ +
+
3. Mitä palvelimet näkevät
+
+ +

+ Palvelimilla on erilliset anonyymit tunnistetiedot kullekin jonolle, eivätkä ne tiedä, mille käyttäjille ne kuuluvat. +

+

+ Käyttäjät voivat lisäksi parantaa metadata-yksityisyyttään käyttämällä Tor-verkkoa palvelimiin yhdistämiseen, mikä estää IP-osoitteen perusteella tapahtuvan yhteyksien tekemisen. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vertailu muihin protokolliin

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, suuret alustatXMPP, MatrixP2P-protokollat
Vaati globaalin identiteetinEi - yksityinenKyllä 1Kyllä 2Kyllä 3
Mahdollisuus MITM-hyökkäykseenEi - turvallinen 4Kyllä 5KylläKyllä
Riippuvuus DNS:stäEi - joustavaKylläKylläEi
Yksittäinen tai keskitetty verkkoEi - hajautettuKylläEi - liitetty 6Kyllä 7
Keskuskomponentti tai muu verkkoa koskeva hyökkäysEi - joustavaKylläKyllä 2Kyllä 8
+
+ +
+ +
+
+
    +
  1. Yleensä pohjautuu puhelinnumeroon, joissain tapauksissa käyttäjänimiin
  2. +
  3. DNS-pohjaiset osoitteet
  4. +
  5. Julkinen avain tai jokin muu maailmanlaajuisesti uniikki tunniste
  6. +
  7. SimpleXin releapalvelimet eivät voi vaarantaa päästä päähän -salausta. Tarkista turvakoodi hyödyntääksesi hyökkäyssuojaa ylitys-kanavalla
  8. +
  9. Jos operaattorin palvelimet ovat vaarantuneet. Tarkista turvakoodi Signalissa ja joissakin muissa sovelluksissa suojautuaksesi hyökkäykseltä
  10. +
  11. Ei suojaa käyttäjien metatietojen yksityisyyttä
  12. +
  13. Vaikka P2P-verkot ovat hajautettuja, ne eivät ole liitettäviä - ne toimivat yhtenä verkostona
  14. +
  15. P2P-verkoilla on joko keskitetty auktoriteetti tai koko verkko voidaan vaarantaa — katso täältä
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — katso täältä.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Bold-Oblique.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Bold-Oblique.woff2 new file mode 100644 index 0000000000..d20029ca02 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Bold-Oblique.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Bold.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Bold.woff2 new file mode 100644 index 0000000000..da6193cb44 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Bold.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Light-Oblique.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Light-Oblique.woff2 new file mode 100644 index 0000000000..9ca1ce587f Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Light-Oblique.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Light.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Light.woff2 new file mode 100644 index 0000000000..aca9bafb98 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Light.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Medium-Oblique.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Medium-Oblique.woff2 new file mode 100644 index 0000000000..e89622ceee Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Medium-Oblique.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Medium.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Medium.woff2 new file mode 100644 index 0000000000..b0dda04414 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Medium.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Regular-Oblique.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Regular-Oblique.woff2 new file mode 100644 index 0000000000..ad49910ea8 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Regular-Oblique.woff2 differ diff --git a/fonts/GT-Walsheim/GT-Walsheim-LC-Regular.woff2 b/fonts/GT-Walsheim/GT-Walsheim-LC-Regular.woff2 new file mode 100644 index 0000000000..38921cd7a6 Binary files /dev/null and b/fonts/GT-Walsheim/GT-Walsheim-LC-Regular.woff2 differ diff --git a/fonts/GT-Walsheim/README.md b/fonts/GT-Walsheim/README.md new file mode 100644 index 0000000000..bf86ea6c47 --- /dev/null +++ b/fonts/GT-Walsheim/README.md @@ -0,0 +1 @@ +Please note that these fonts are not free open-source and cannot be re-used in other projects. diff --git a/fonts/GT-Walsheim/README/index.html b/fonts/GT-Walsheim/README/index.html new file mode 100644 index 0000000000..3fced0d9bb --- /dev/null +++ b/fonts/GT-Walsheim/README/index.html @@ -0,0 +1 @@ +

Please note that these fonts are not free open-source and cannot be re-used in other projects.

diff --git a/fonts/Manrope/Manrope-Bold.ttf b/fonts/Manrope/Manrope-Bold.ttf new file mode 100644 index 0000000000..62a6183939 Binary files /dev/null and b/fonts/Manrope/Manrope-Bold.ttf differ diff --git a/fonts/Manrope/Manrope-ExtraBold.ttf b/fonts/Manrope/Manrope-ExtraBold.ttf new file mode 100644 index 0000000000..2fa671c215 Binary files /dev/null and b/fonts/Manrope/Manrope-ExtraBold.ttf differ diff --git a/fonts/Manrope/Manrope-ExtraLight.ttf b/fonts/Manrope/Manrope-ExtraLight.ttf new file mode 100644 index 0000000000..c55745a49b Binary files /dev/null and b/fonts/Manrope/Manrope-ExtraLight.ttf differ diff --git a/fonts/Manrope/Manrope-Light.ttf b/fonts/Manrope/Manrope-Light.ttf new file mode 100644 index 0000000000..8a771c26e1 Binary files /dev/null and b/fonts/Manrope/Manrope-Light.ttf differ diff --git a/fonts/Manrope/Manrope-Medium.ttf b/fonts/Manrope/Manrope-Medium.ttf new file mode 100644 index 0000000000..c6d28def6d Binary files /dev/null and b/fonts/Manrope/Manrope-Medium.ttf differ diff --git a/fonts/Manrope/Manrope-Regular.ttf b/fonts/Manrope/Manrope-Regular.ttf new file mode 100644 index 0000000000..9a108f1cee Binary files /dev/null and b/fonts/Manrope/Manrope-Regular.ttf differ diff --git a/fonts/Manrope/Manrope-SemiBold.ttf b/fonts/Manrope/Manrope-SemiBold.ttf new file mode 100644 index 0000000000..46a13d6198 Binary files /dev/null and b/fonts/Manrope/Manrope-SemiBold.ttf differ diff --git a/fr/contact/index.html b/fr/contact/index.html index 4b5278d43c..afcd2af049 100644 --- a/fr/contact/index.html +++ b/fr/contact/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/fr/fdroid/index.html b/fr/fdroid/index.html index e5230f8c28..de943019e3 100644 --- a/fr/fdroid/index.html +++ b/fr/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX expliqué

- - - - - - - -
-
- -
-
1. L'expérience des utilisateurs
-
- -

- Vous pouvez créer des contacts et des groupes, et avoir des conversations bidirectionnelles, comme dans n'importe quelle autre messagerie. -

-

- Comment cela peut-il fonctionner avec des files d'attente unidirectionnelles et sans identifiants de profil utilisateur ? -

-
-
- -
-
2. Comment ça marche
-
- -

- Pour chaque connexion, vous utilisez deux files d'attente de messages distinctes pour envoyer et recevoir des messages via des serveurs différents. -

-

- Les serveurs ne transmettent les messages que dans une direction, sans connaître la totalité de la conversation ou des connexions de l'utilisateur. -

-
-
- -
-
3. Ce que voient les serveurs
-
- -

- Les serveurs disposent d'identifiants anonymes distincts pour chaque file d'attente, et ne savent pas à quels utilisateurs ils appartiennent. -

-

- Les utilisateurs peuvent améliorer davantage leur protection des métadonnées en utilisant Tor pour accéder aux serveurs, ce qui empêche la corrélation par adresse IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparaison avec d'autres protocoles

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, grandes plateformesXMPP, MatrixProtocoles P2P
Identifiant global nécessaireNon - privéOui 1Oui 2Oui 3
Risque d'attaque MITMNon - sécurisé 4Oui 5OuiOui
Dépendance au DNSNon - résistantOuiOuiNon
Réseau unique ou centraliséNon - décentraliséOuiNon - fédéré 6Oui 7
Attaque à l'échelle du réseauNon - résistantOuiOui 2Oui 8
-
- -
- -
-
-
    -
  1. Généralement basé sur un numéro de téléphone, dans certains cas sur des noms d'utilisateur
  2. -
  3. Adresses basées sur le DNS
  4. -
  5. Clé publique ou tout autre identifiant global unique
  6. -
  7. Les relais SimpleX ne peuvent pas compromettre le chiffrement e2e. Vérifier le code de sécurité pour limiter les attaques sur le canal hors bande
  8. -
  9. Si les serveurs de l'opérateur sont compromis. Vérifier les codes de sécurités sur Signal et d'autres applications pour limiter les risques
  10. -
  11. Ne protège pas la confidentialité des métadonnées des utilisateurs
  12. -
  13. Bien que les P2P soient distribués, ils ne sont pas fédérés - ils fonctionnent comme un seul réseau
  14. -
  15. Les réseaux P2P ont soit une autorité centrale, soit l'ensemble du réseau peut être compromis - voir ici
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Rejoindre SimpleX

-

Nous vous invitons à rejoindre la conversation

- - - -

Inscrivez-vous pour recevoir nos mises à jour

- -
- - - -
- -
- -

Obtenir SimpleX desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/fr/invitation/index.html b/fr/invitation/index.html index 188883fe07..5dee0f5295 100644 --- a/fr/invitation/index.html +++ b/fr/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/fr/messaging/index.html b/fr/messaging/index.html new file mode 100644 index 0000000000..a096ba10ee --- /dev/null +++ b/fr/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Pourquoi SimpleX est unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Vous avez une confidentialité totale

+
+ +
+ +
+

+ SimpleX protège la confidentialité de votre profil, de vos contacts et de vos métadonnées, en les cachant des serveurs du réseau SimpleX et de tout observateur. +

+

+ Contrairement à tout autre réseau de messagerie existant, SimpleX n'a aucun identifiant attribué aux utilisateurs — pas même de nombres aléatoires. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Vous êtes protégé
contre les spams et les abus

+
+ +
+ +
+

+ Parce que vous n'avez pas d'identifiant ou d'adresse fixe sur le réseau SimpleX, personne ne peut vous contacter sauf si vous partagez une adresse d'utilisateur unique ou temporaire, comme un code QR ou un lien. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Vous contrôlez vos données

+
+ +
+ +
+

+ SimpleX stocke toutes les données utilisateur sur les appareils clients dans un format de base de données chiffrée portable — elles peuvent être transférées vers un autre appareil. +

+

+ Les messages chiffrés de bout en bout sont conservés temporairement sur les serveurs relais SimpleX jusqu'à leur réception, puis ils sont définitivement supprimés. +

+ +
+ + + En savoir plus + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Vous possédez le réseau SimpleX

+
+ +
+ +
+

+ Le réseau SimpleX est entièrement décentralisé et indépendant de toute crypto-monnaie ou de tout autre réseau, autre que l'Internet. +

+

+ Vous pouvez utiliser SimpleX avec vos propres serveurs ou avec les serveurs que nous fournissons — et toujours vous connecter à n'importe quel utilisateur. +

+ +
+ + + En savoir plus + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Fonctionnalités

+ +
+ +
+
+ + +
+

Messages chiffrés E2E avec édition et format markdown

+
+ +
+
+ + +
+

Images, vidéos et fichiers
chiffrés E2E

+
+ +
+
+ + +
+

Groupes chiffrés E2E décentralisés — où seuls les membres en connaissent l'existence

+
+ +
+
+ + +
+

Messages vocaux chiffrés E2E

+
+ +
+
+ + +
+

Conversations secrètes éphémères

+
+ +
+
+ + +
+

Appels audio et vidéo
chiffrés E2E

+
+ +
+
+ + +
+

Stockage de l'app portable chiffré — déplacez votre profil vers un autre appareil

+
+ +
+
+ + +
+

Mode incognito —
unique à SimpleX Chat

+
+ +
+
+
+ + +
+
+

Ce qui rend SimpleX privé

+ +
+
+ + +
+
+ + +
+
+

Identifiants temporaires anonymes par paires

+
+ +

SimpleX utilise des adresses et des informations d'identification anonymes temporaires par paires pour chaque contact utilisateur ou membre de groupe.

+ +

Il permet la distribution de messages sans identifiants de profil utilisateur, offrant une meilleure confidentialité des métadonnées que les alternatives.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Échange de clés
hors bande

+
+ +

De nombreux réseaux de communication sont vulnérables aux attaques MITM par des serveurs ou des fournisseurs de réseau.

+ +

Pour l'empêcher, les applications SimpleX transmettent des clés à usage unique hors bande, lorsque vous partagez une adresse sous forme de lien ou de code QR.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

2 couches de
chiffrement de bout en bout

+
+ +

Protocole à double ratchet —
Messagerie OTR avec confidentialité persistante et récupération en cas d'effraction.

+ +

Cryptobox NaCL dans chaque file d'attente pour empêcher toute corrélation de trafic entre les files d'attente de messages si le TLS est compromis.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Vérification de l'intégrité
des messages

+
+ +

Pour garantir l'intégrité, les messages sont numérotés séquentiellement et incluent le hachage du message précédent.

+ +

Si un message est ajouté, supprimé ou modifié, le destinataire sera alerté.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Couche supplémentaire de
chiffrement du serveur

+
+ +

Couche supplémentaire de chiffrement du serveur pour la livraison au destinataire, afin d'empêcher la corrélation entre le trafic du serveur reçu et envoyé si le TLS est compromis.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Mélange de messages
pour réduire la corrélation

+
+ +

Les serveurs SimpleX agissent comme des nœuds de mixage à faible latence - les messages entrants et sortants ont un ordre différent.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Transport TLS
sécurisé et authentifié

+
+ +

Les connexions client-serveur ne sont établies qu'avec des algorithmes de chiffrement robustes et en TLS 1.2/1.3.

+ +

L'empreinte du serveur et la fixation des canaux empêchent les attaques MITM et les attaques par rejeu.

+ +

La reprise de connexion est désactivée pour empêcher les attaques de session.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Accès
possible via Tor

+
+ +

Pour protéger votre adresse IP, vous pouvez accéder aux serveurs via Tor ou un autre réseau de transport superposé.

+ +

Pour utiliser SimpleX via Tor, veuillez installer l'application Orbot et activez le proxy SOCKS5 (ou le mode VPN sur iOS).

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Files d'attente de messages
unidirectionnelles

+
+ +

Chaque file d'attente de messages transmet les messages dans une direction, avec des adresses d'envoi et de réception différentes.

+ +

Il réduit les vecteurs d'attaque, par rapport aux agents de messagerie traditionnels, et les métadonnées disponibles.

+ +
+

Appuyez pour fermer

+
+
+ +
+
+ + +
+
+

Plusieurs couches de
couverture de contenu

+
+ +

SimpleX utilise une couverture de contenu pour chaque couche de chiffrement afin de résister aux attaques ciblant la taille des messages.

+ +

Cela rend les messages de différentes tailles identiques pour les serveurs et les observateurs du réseau.

+ +
+

Appuyez pour fermer

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Réseau SimpleX

+

Simplex Chat offre la meilleure protection pour votre vie privée en combinant les avantages du P2P et des réseaux fédérés.

+ +
+
+
+ + +
+
+

Contrairement aux réseaux P2P

+

+ Tous les messages sont envoyés via les serveurs, offrant à la fois une meilleure protection des métadonnées et une livraison asynchrone fiable des messages, tout en évitant de nombreux problèmes des réseaux P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Contrairement aux réseaux fédérés

+

+ Les serveurs de relais SimpleX NE stockent PAS les profils d'utilisateurs, les contacts et les messages distribués, NE se connectent PAS les uns aux autres et il N'y a AUCUN répertoire de serveurs. +

+
+
+ + + +
+
+ + +
+
+

Réseau SimpleX

+

+ les serveurs fournissent des files d'attente unidirectionnelles pour connecter les utilisateurs, mais ils n'ont aucune visibilité sur le graphique de connexion réseau — seuls les utilisateurs l'ont. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX expliqué

+ + + + + + + +
+
+ +
+
1. L'expérience des utilisateurs
+
+ +

+ Vous pouvez créer des contacts et des groupes, et avoir des conversations bidirectionnelles, comme dans n'importe quelle autre messagerie. +

+

+ Comment cela peut-il fonctionner avec des files d'attente unidirectionnelles et sans identifiants de profil utilisateur ? +

+
+
+ +
+
2. Comment ça marche
+
+ +

+ Pour chaque connexion, vous utilisez deux files d'attente de messages distinctes pour envoyer et recevoir des messages via des serveurs différents. +

+

+ Les serveurs ne transmettent les messages que dans une direction, sans connaître la totalité de la conversation ou des connexions de l'utilisateur. +

+
+
+ +
+
3. Ce que voient les serveurs
+
+ +

+ Les serveurs disposent d'identifiants anonymes distincts pour chaque file d'attente, et ne savent pas à quels utilisateurs ils appartiennent. +

+

+ Les utilisateurs peuvent améliorer davantage leur protection des métadonnées en utilisant Tor pour accéder aux serveurs, ce qui empêche la corrélation par adresse IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparaison avec d'autres protocoles

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plateformesXMPP, MatrixProtocoles P2P
Identifiant global nécessaireNon - privéOui 1Oui 2Oui 3
Risque d'attaque MITMNon - sécurisé 4Oui 5OuiOui
Dépendance au DNSNon - résistantOuiOuiNon
Réseau unique ou centraliséNon - décentraliséOuiNon - fédéré 6Oui 7
Attaque à l'échelle du réseauNon - résistantOuiOui 2Oui 8
+
+ +
+ +
+
+
    +
  1. Généralement basé sur un numéro de téléphone, dans certains cas sur des noms d'utilisateur
  2. +
  3. Adresses basées sur le DNS
  4. +
  5. Clé publique ou tout autre identifiant global unique
  6. +
  7. Les relais SimpleX ne peuvent pas compromettre le chiffrement e2e. Vérifier le code de sécurité pour limiter les attaques sur le canal hors bande
  8. +
  9. Si les serveurs de l'opérateur sont compromis. Vérifier les codes de sécurités sur Signal et d'autres applications pour limiter les risques
  10. +
  11. Ne protège pas la confidentialité des métadonnées des utilisateurs
  12. +
  13. Bien que les P2P soient distribués, ils ne sont pas fédérés - ils fonctionnent comme un seul réseau
  14. +
  15. Les réseaux P2P ont soit une autorité centrale, soit l'ensemble du réseau peut être compromis — voir ici
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — voir ici.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/he/contact/index.html b/he/contact/index.html index 2a3435393c..6c66d4a296 100644 --- a/he/contact/index.html +++ b/he/contact/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/he/fdroid/index.html b/he/fdroid/index.html index 87a7f1e6ce..1bb60df5dc 100644 --- a/he/fdroid/index.html +++ b/he/fdroid/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

תיאור SimpleX

- - - - - - - -
-
- -
-
1. חוויית משתמש
-
- -

- אתם יכולים ליצור אנשי קשר וקבוצות, ולנהל שיחות דו-כיווניות, כמו בכל תוכנה אחרת לשליחת הודעות. -

-

- איך זה יכול לעבוד עם תורים חד-כיווניים וללא מזהי פרופיל משתמש? -

-
-
- -
-
2. איך זה עובד
-
- -

- עבור כל חיבור, שני תורי העברת הודעות נפרדים משמשים לשליחה וקבלה של הודעות דרך שרתים שונים. -

-

- שרתים מעבירים הודעות רק בכיוון אחד, מבלי לקבל את התמונה המלאה של השיחות או החיבורים של המשתמש. -

-
-
- -
-
3. מה השרתים רואים
-
- -

- לשרתים יש אישורים אנונימיים נפרדים לכל תור, ואינם יודעים לאילו משתמשים הם שייכים. -

-

- משתמשים יכולים לשפר עוד יותר את פרטיות המטא-נתונים על ידי שימוש ב- Tor כדי לגשת לשרתים, ולמנוע קורלציה לפי כתובת IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

השוואה לפרוטוקולים אחרים

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, פלטפורמות גדולותXMPP, Matrixפרוטוקולי P2P
דורש זהות גלובליתלא - פרטיכן 1כן 2כן 3
אפשרות של התקפת MITMלא - מאובטח 4כן 5כןכן
תלות ב-DNSלא - גמישכןכןלא
רשת בודדת או מרכזיתלא - מבוזרכןלא - פדרלית 6כן 7
רכיב מרכזי או מתקפת רשת רחבהלא - גמישכןכן 2כן 8
-
- -
- -
-
-
    -
  1. בדרך כלל מבוססת על מספר טלפון, במקרים מסוימים על שמות משתמש
  2. -
  3. כתובות מבוססות DNS
  4. -
  5. מפתח ציבורי או מזהה ייחודי גלובלי אחר
  6. -
  7. ממסרי SimpleX אינם יכולים לסכן הצפנה מקצה לקצה. ודא קוד אבטחה כדי לצמצם התקפות על ערוץ "מחוץ לרשת"
  8. -
  9. אם השרתי המפעיל נפגעים. אמת את קוד האבטחה ב-Signal ובכמה אפליקציות אחרות כדי למתן את זה
  10. -
  11. אינו מגן על פרטיות המטא נתונים של המשתמשים
  12. -
  13. בעוד שרשתות עמית לעמית (P2P) מבוזרות, הן אינן מאוחדות (פדרטיביות) — הן פועלות כרשת יחידה
  14. -
  15. לרשתות P2P יש רשות מרכזית או שכל הרשת יכולה להיפגע - ראו כאן
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

הצטרפו SimpleX

-

אנו מזמינים אתכם להצטרף לשיחה

- - - -

הירשמו כדי לקבל את העדכונים שלנו

- -
- - - -
- -
- -

הורידו את אפליקציית שולחן העבודה SimpleX

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/he/invitation/index.html b/he/invitation/index.html index 09b8e4d6a0..a82b6453a6 100644 --- a/he/invitation/index.html +++ b/he/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/he/messaging/index.html b/he/messaging/index.html new file mode 100644 index 0000000000..2e7f781008 --- /dev/null +++ b/he/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

מדוע SimpleX הוא ייחודי

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

יש לך פרטיות מלאה

+
+ +
+ +
+

+ SimpleX מגן על פרטיות הפרופיל, אנשי הקשר והמטא נתונים שלכם, מסתיר אותם משרתי רשת SimpleX ומכל צופה. +

+

+ בניגוד לכל רשת הודעות קיימת אחרת, ל-SimpleX אין מזהים המשויכים למשתמשים — אפילו לא מספרים אקראיים. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

אתה מוגן
מפני ספאם וניצול לרעה

+
+ +
+ +
+

+ מכיוון שאין לך מזהה או כתובת קבועה ברשת SimpleX, אף אחד לא יכול ליצור איתך קשר אלא אם כן אתה משתף כתובת משתמש חד-פעמית או זמנית, כקוד QR או קישור. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

אתה שולט בנתונים שלך

+
+ +
+ +
+

+ SimpleX מאחסן את כל נתוני המשתמש במכשירי הלקוח בפורמט מסד נתונים מוצפן נייד — ניתן להעביר אותו למכשיר אחר. +

+

+ ההודעות המוצפנות מקצה לקצה מוחזקות באופן זמני בשרתי ממסר של SimpleX עד שמתקבלות, ואז הן נמחקות לצמיתות. +

+ +
+ + + למדו עוד + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

רשת SimpleX בבעלותך

+
+ +
+ +
+

+ רשת SimpleX מבוזרת לחלוטין ואינה תלויה בכל מטבע קריפטוגרפי או בכל רשת אחרת, מלבד האינטרנט. +

+

+ אתם יכולים להשתמש ב-SimpleX עם השרתים שלכם או עם השרתים שסופקו על ידינו — ועדיין להתחבר לכל משתמש. +

+ +
+ + + למדו עוד + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

מאפיינים

+ +
+ +
+
+ + +
+

הודעות מוצפנות מקצה לקצה עם סימונים ואפשרויות עריכה

+
+ +
+
+ + +
+

תמונות, וידאו וקבצים
בהצפנת קצה-אל-קצה

+
+ +
+
+ + +
+

קבוצות סודיות מבוזרות —
רק המשתמשים יודעים שהן קיימות

+
+ +
+
+ + +
+

הודעות קוליות מוצפנות מקצה לקצה

+
+ +
+
+ + +
+

הודעות נעלמות

+
+ +
+
+ + +
+

שיחות שמע ווידאו
מוצפנות מקצה לקצה

+
+ +
+
+ + +
+

מסד נתונים מוצפן נייד — העבר פרופיל למכשיר אחר

+
+ +
+
+ + +
+

מצב זהות נסתרת —
ייחודי ל-SimpleX Chat

+
+ +
+
+
+ + +
+
+

מה הופך את SimpleX לפרטי

+ +
+
+ + +
+
+ + +
+
+

מזהים זמניים אנונימיים בזוגות

+
+ +

SimpleX משתמש בכתובות ואישורים אנונימיים זמניים בזוגות עבור כל איש קשר של משתמש או חבר בקבוצה.

+ +

זה מאפשר להעביר הודעות ללא מזהי פרופיל משתמש, ומספק פרטיות מטא-נתונים טובה יותר מאשר חלופות אחרות.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

החלפת מפתחות
מחוץ לרשת

+
+ +

רשתות תקשורת רבות פגיעות להתקפות MITM על ידי שרתים או ספקי רשת.

+ +

כדי למנוע זאת, אפליקציות SimpleX מעבירות מפתחות חד-פעמיים מחוץ לפס, כאשר אתם משתפים כתובת כקישור או כקוד QR.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

2 שכבות של
הצפנה מקצה לקצה

+
+ +

פרוטוקול ראצ'ט כפול —
העברת הודעות OTR עם סודיות מושלמת קדימה ושחזור פריצה.

+ +

תיבת הצפנה NaCL בכל תור כדי למנוע קורלציית תעבורה בין תורי הודעות במקרה שאבטחת TLS נפגעה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

בדיקת תקינות
ההודעה

+
+ +

על מנת להבטיח את שלמות ההודעות, הן ממוספרות ברצף וכוללות את הגיבוב (hash) של ההודעה הקודמת.

+ +

אם הודעה כלשהי תתווסף, תוסר או תשתנה, הנמען יקבל התראה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

שכבה נוספת של
הצפנת שרת

+
+ +

שכבה נוספת של הצפנת שרת למסירה לנמען, כדי למנוע קורלציה בין תעבורת השרת המתקבלת ונשלחת במקרה שאבטחת TLS נפגעה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

ערבוב הודעות
לשם הפחתת קורלציה

+
+ +

שרתי SimpleX פועלים כצמתי ערבוב עם זמן השהיה נמוך — להודעות הנכנסות והיוצאות יש סדר שונה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

תעבורת TLS
מאובטחת ומאומתת

+
+ +

עבור חיבורי שרת-לקוח, נעשה שימוש רק ב-TLS 1.2/1.3 עם אלגוריתמים חזקים.

+ +

טביעת אצבע של שרת ואיגוד ערוצים מונעים התקפת אדם בתווך (MITM) והתקפת שליחה מחדש (Replay attack).

+ +

חידוש החיבור מושבת כדי למנוע התקפות הפעלה.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

אופציונלי
גישה דרך Tor

+
+ +

כדי להגן על כתובת ה-IP שלכם, אתם יכולים לגשת לשרתים דרך Tor או רשת שכבת-על אחרת של תעבורה.

+ +

כדי להשתמש ב-SimpleX דרך Tor, התקן את אפליקציית Orbot והפעל את SOCKS5 proxy (או VPN ב-iOS).

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

תורי הודעות
חד-כיווניים

+
+ +

כל תור הודעות מעביר הודעות בכיוון אחד, עם כתובות השליחה והקבלה השונות.

+ +

זה מפחית את וקטורי ההתקפה, בהשוואה למתווכי הודעות מסורתיים, ואת המטא-נתונים הזמינים.

+ +
+

הקישו כדי לסגור

+
+
+ +
+
+ + +
+
+

שכבות מרובות של
ריפוד תוכן

+
+ +

SimpleX משתמש בריווח התוכן עבור כל שכבת הצפנה כדי לסכל התקפות על גודל הודעה.

+ +

זה גורם להודעות בגדלים שונים להיראות זהים לשרתים ולמשקיפים ברשת.

+ +
+

הקישו כדי לסגור

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

רשת SimpleX

+

Simplex Chat מספק את הפרטיות הטובה ביותר על ידי שילוב היתרונות של P2P ורשתות מאוחדות.

+ +
+
+
+ + +
+
+

בניגוד לרשתות P2P

+

+ כל ההודעות נשלחות דרך השרתים, שמספקים פרטיות טובה יותר של מטא נתונים וגם מסירת הודעות אסינכרונית אמינה, תוך הימנעות מהרבה בעיות של רשתות P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

בניגוד לרשתות מאוחדות

+

+ שרתי ממסר SimpleX אינם מאחסנים פרופילי משתמש, אנשי קשר והודעות שנמסרו, אינם מתחברים זה לזה, ואין ספריית שרתים. +

+
+
+ + + +
+
+ + +
+
+

רשת SimpleX

+

+ השרתים מספקים תורים חד-כיווניים לחיבור המשתמשים, אך הם לא יכול לראות את גרף חיבור הרשת — רק המשתמשים יכולים לראות זאת. +

+
+
+ +
+
+ +
+ + + + + +
+
+

תיאור SimpleX

+ + + + + + + +
+
+ +
+
1. חוויית משתמש
+
+ +

+ אתם יכולים ליצור אנשי קשר וקבוצות, ולנהל שיחות דו-כיווניות, כמו בכל תוכנה אחרת לשליחת הודעות. +

+

+ איך זה יכול לעבוד עם תורים חד-כיווניים וללא מזהי פרופיל משתמש? +

+
+
+ +
+
2. איך זה עובד
+
+ +

+ עבור כל חיבור, שני תורי העברת הודעות נפרדים משמשים לשליחה וקבלה של הודעות דרך שרתים שונים. +

+

+ שרתים מעבירים הודעות רק בכיוון אחד, מבלי לקבל את התמונה המלאה של השיחות או החיבורים של המשתמש. +

+
+
+ +
+
3. מה השרתים רואים
+
+ +

+ לשרתים יש אישורים אנונימיים נפרדים לכל תור, ואינם יודעים לאילו משתמשים הם שייכים. +

+

+ משתמשים יכולים לשפר עוד יותר את פרטיות המטא-נתונים על ידי שימוש ב- Tor כדי לגשת לשרתים, ולמנוע קורלציה לפי כתובת IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

השוואה לפרוטוקולים אחרים

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, פלטפורמות גדולותXMPP, Matrixפרוטוקולי P2P
דורש זהות גלובליתלא - פרטיכן 1כן 2כן 3
אפשרות של התקפת MITMלא - מאובטח 4כן 5כןכן
תלות ב-DNSלא - גמישכןכןלא
רשת בודדת או מרכזיתלא - מבוזרכןלא - פדרלית 6כן 7
רכיב מרכזי או מתקפת רשת רחבהלא - גמישכןכן 2כן 8
+
+ +
+ +
+
+
    +
  1. בדרך כלל מבוססת על מספר טלפון, במקרים מסוימים על שמות משתמש
  2. +
  3. כתובות מבוססות DNS
  4. +
  5. מפתח ציבורי או מזהה ייחודי גלובלי אחר
  6. +
  7. ממסרי SimpleX אינם יכולים לסכן הצפנה מקצה לקצה. ודא קוד אבטחה כדי לצמצם התקפות על ערוץ "מחוץ לרשת"
  8. +
  9. אם השרתי המפעיל נפגעים. אמת את קוד האבטחה ב-Signal ובכמה אפליקציות אחרות כדי למתן את זה
  10. +
  11. אינו מגן על פרטיות המטא נתונים של המשתמשים
  12. +
  13. בעוד שרשתות עמית לעמית (P2P) מבוזרות, הן אינן מאוחדות (פדרטיביות) — הן פועלות כרשת יחידה
  14. +
  15. לרשתות P2P יש רשות מרכזית או שכל הרשת יכולה להיפגע — ראו כאן
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — ראו כאן.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/hu/contact/index.html b/hu/contact/index.html index 083344716f..b33f4bceee 100644 --- a/hu/contact/index.html +++ b/hu/contact/index.html @@ -37,6 +37,8 @@ + + > @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/hu/fdroid/index.html b/hu/fdroid/index.html index d9214c8087..7882033d1a 100644 --- a/hu/fdroid/index.html +++ b/hu/fdroid/index.html @@ -37,6 +37,8 @@ + + > @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

A SimpleX bemutatása

- - - - - - - -
-
- -
-
1. Felhasználói élmény
-
- -

- Csoportokat hozhat létre, valamint kétirányú beszélgetéseket folytathat a partnereivel, ugyanúgy mint bármely más üzenetváltó-alkalmazásban. -

-

- Hogyan működhet egyirányú várólistával és felhasználói profilazonosítók nélkül? -

-
-
- -
-
2. Hogyan működik
-
- -

- Minden kapcsolathoz két különböző üzenetküldési várólistát használ a különböző kiszolgálókon keresztül történő üzenetküldéshez és -fogadáshoz. -

-

- A kiszolgálók csak egyetlen irányba továbbítják az üzeneteket, anélkül, hogy teljes képet kapnának a felhasználók beszélgetéseiről vagy kapcsolatairól. -

-
-
- -
-
3. Mit látnak a kiszolgálók
-
- -

- A kiszolgálók minden egyes várólistához külön névtelen hitelesítő-adatokkal rendelkeznek, és nem tudják, hogy melyik felhasználóhoz tartoznak. -

-

- A felhasználók tovább fokozhatják a metaadatok védelmét, ha a Tor hálózat használatával férnek hozzá a kiszolgálókhoz, így megakadályozva az IP-cím szerinti korrelációt. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Legyen
szabad

+

Az Ön kommunikációjának
szabadsága és biztonsága

+

Az első olyan hálózat, ahol Ön a tulajdonosa saját identitásának, partnereinek és csoportjainak.

- -
-
-

Összehasonlítás más protokollokkal

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, és a nagy platformokXMPP, MatrixP2P-protokollok
Globális személyazonosságot igényelNem - privátIgen 1Igen 2Igen 3
A MITM lehetőségeNem - biztonságos 4Igen 5IgenIgen
Függés a DNS-tőlNem - ellenállóIgenIgenNem
Egyetlen vagy központosított hálózatNem - decentralizáltIgenNem - föderált 6Igen 7
Központi komponens vagy más hálózati szintű támadásNem - ellenállóIgenIgen 2Igen 8
-
- -
- -
-
-
    -
  1. Általában telefonszám alapján, néhány esetben felhasználónév alapján
  2. -
  3. DNS-alapú címek
  4. -
  5. Nyilvános kulcs vagy más globális egyedi azonosító
  6. -
  7. A SimpleX továbbítókiszolgálói nem veszélyeztethetik a végpontok közötti titkosítást. Hitelesítse a biztonsági kódot a sávon kívüli csatorna elleni támadások veszélyeinek csökkentésére
  8. -
  9. Ha az üzemeltetett kiszolgálók veszélybe kerülnek. Hitelesítse a biztonsági kódot a Signal vagy más biztonságos üzenetküldő alkalmazás segítségével a támadások veszélyeinek csökkentésére
  10. -
  11. Nem védi a felhasználók metaadatait
  12. -
  13. Bár a P2P elosztott, de nem föderált — egyetlen hálózatként működnek
  14. -
  15. A P2P-hálózatoknak vagy van egy központi hitelesítője, vagy az egész hálózat kompromittálódhat - tekintse meg itt
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Biztonsági
auditok +

+
+ +
-
-
-
+
+
+
+
+
+
+

A világ legbiztonságosabb üzenetváltó alkalmazása

+

Az üzenetváltás a SimpleXben élvonalbeli végpontok közötti titkosítással rendelkezik.

+

Az Ön biztonsága és magánszférájának védelme érdekében a kiszolgálók nem látják az üzeneteit, és azt sem, hogy kivel beszélget.

+ Tudjon meg többet a SimpleX üzenetváltó alkalmazásról +
+
+
+
+
+
+

Legyen az Öné
A jövő hálózata

+

A SimpleX arra a meggyőződésre épül, hogy Önnek kell birtokolnia a saját identitását és a kapcsolatot partnereivel és a közösségeivel.

+

A nyílt és decentralizált hálózat lehetővé teszi, hogy kapcsolatba lépjen másokkal és ötleteket osszon meg: legyen szabad biztonságban.

+
+
+
+
+
+
+

Időtálló közösségek

+

A jövőben közösségi utalványokkal támogathatja a kedvenc csoportjait.

+

Az utalványokkal fizetni tudja a kiszolgálókat, hogy a közösségek szabadok és függetlenek maradhassanak.

+ Tudjon meg többet, és szerezzen ingyenes NFT-t
az előzetes tesztelésért.
+
+
+
-
-
-

Csatlakozzon a közösségeinkhez SimpleX

-

Meghívjuk Önt, hogy csatlakozzon a beszélgetésekhez

- - - -

Regisztráljon a hírleveleinkre, hogy ne maradjon le semmiről

- -
- - - -
- -
- -

A SimpleX számítógépes alkalmazásának letöltése

-
- - - - - -
-
-
- - +
+
+
+

A SimpleX ütemterve a szabad internethez

+
+

2025

+

: Skálázódás nagy közösségekre

+

Központosított platformok elhagyása

+
+
+

2026

+

: Fenntartható közösségek és kiszolgálók

+

Közösségi utalványok elindítása

+
+
+

2027

+

: Növelje közösségeit

+

Eszközök a közösségei népszerűsítéséhez

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Csatlakozzon a SimpleX közösségekhez

+

Már emberek százezrei bíznak a SimpleXen való üzenetváltásban.

+

Találja meg a kedvenc közösségeit a SimpleX csoportjegyzékében, vagy hozza létre a saját csoportját!

+ SimpleX csoportjegyzék megtekintése +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/hu/invitation/index.html b/hu/invitation/index.html index 55e0cf707d..af9ac6467b 100644 --- a/hu/invitation/index.html +++ b/hu/invitation/index.html @@ -37,6 +37,8 @@ + + > @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,183 +110,174 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/hu/messaging/index.html b/hu/messaging/index.html new file mode 100644 index 0000000000..a45feb7461 --- /dev/null +++ b/hu/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Miért egyedülálló a SimpleX

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Teljes magánéletet élvezhet

+
+ +
+ +
+

+ A SimpleX megvédi a profilhoz tartozó partnereket és azok metaadatait is, elrejtve azokat a SimpleX hálózat kiszolgálói és a megfigyelők elől. +

+

+ Minden más létező üzenetküldő hálózattól eltérően a SimpleX nem rendelkezik a felhasználókhoz rendelt azonosítókkal — még véletlenszerű számokkal sem. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Véd a kéretlen tartalmaktól
és a visszaélésektől

+
+ +
+ +
+

+ Mivel a SimpleX hálózaton senkinek sincs azonosítója vagy állandó címe, ezért senki sem tud kapcsolatba lépni Önnel, hacsak nem oszt meg egy egyszeri vagy ideiglenes felhasználói címet, például QR-kódot vagy hivatkozást. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Ön kezeli a saját adatait

+
+ +
+ +
+

+ A SimpleX Chat az összes felhasználói adatot kizárólag a klienseken tárolja egy hordozható titkosított adatbázis-formátumban —, amely exportálható és átvihető bármely más támogatott eszközre. +

+

+ A végpontok között titkosított üzenetek átmenetileg a SimpleX továbbítókiszolgálóin tartózkodnak, amíg be nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Öné a SimpleX hálózat

+
+ +
+ +
+

+ A SimpleX hálózat teljesen decentralizált és független bármely kriptopénztől vagy bármely más hálózattól, kivéve az internetet. +

+

+ Használhatja a SimpleXet a saját kiszolgálóival vagy az általunk biztosított kiszolgálókkal, és továbbra is kapcsolódhat bármely felhasználóhoz. +

+ +
+ + + Tudjon meg többet + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkciók

+ +
+ +
+
+ + +
+

Végpontok között titkosított üzenetek markdown formázással és szerkesztéssel

+
+ +
+
+ + +
+

Végpontok között titkosított
képek, videók és fájlok

+
+ +
+
+ + +
+

Végpontok között titkosított, decentralizált csoportok — csak a felhasználók tudják, hogy ezek léteznek

+
+ +
+
+ + +
+

Végpontok között titkosított hangüzenetek

+
+ +
+
+ + +
+

Eltűnő üzenetek

+
+ +
+
+ + +
+

Végpontok között titkosított
hang- és videóhívások

+
+ +
+
+ + +
+

Hordozható, titkosított alkalmazás-adattárolás — profil átköltöztetése egy másik eszközre

+
+ +
+
+ + +
+

Az inkognitómód —
egyedülálló a SimpleX Chatben

+
+ +
+
+
+ + +
+
+

Mitől lesz a SimpleX privát

+ +
+
+ + +
+
+ + +
+
+

Ideiglenes, névtelen, páronkénti azonosítók

+
+ +

A SimpleX ideiglenes, névtelen, páros címeket és hitelesítő adatokat használ minden egyes felhasználói kapcsolathoz vagy csoporttaghoz.

+ +

Lehetővé teszi az üzenetek felhasználói profilazonosítók nélküli kézbesítését, ami az alternatíváknál jobb metaadat-védelmet biztosít.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Sávon kívüli
kulcscsere

+
+ +

Számos kommunikációs hálózat sebezhető a kiszolgálók vagy a hálózat-szolgáltatók MITM-támadásaival szemben.

+ +

Ennek megakadályozása érdekében a SimpleX alkalmazások egyszeri kulcsokat adnak át sávon kívül, amikor egy címet hivatkozásként vagy QR-kódként oszt meg.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

2 rétegű végpontok közötti titkosítás

+
+ +

Dupla racsnis protokoll —
OTR-üzenetküldés, kompromittálás előtti és utáni titkosság-védelemmel.

+ +

NaCL cryptobox minden egyes várólistához, hogy megakadályozza a forgalom korrelációját az üzenetek várólistái között, ha a TLS veszélybe kerül.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Üzenetintegritás
hitelesítés

+
+ +

Az integritás garantálása érdekében az üzenetek sorszámozással vannak ellátva, és tartalmazzák az előző üzenet kivonatát.

+ +

Ha bármilyen üzenetet hozzáadnak, eltávolítanak vagy módosítanak, a címzett értesítést kap róla.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

További rétege a
kiszolgáló-titkosítás

+
+ +

Kiegészítő kiszolgáló titkosítási réteg a címzettnek történő kézbesítéshez, hogy megakadályozza a fogadott és az elküldött kiszolgálóforgalom közötti korrelációt, ha a TLS veszélybe kerül.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Üzenetek keverése
a korreláció csökkentése érdekében

+
+ +

A SimpleX kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Biztonságos, hitelesített
TLS-adatátvitel

+
+ +

A kliens és a kiszolgálók közötti kapcsolatokhoz csak az erős algoritmusokkal rendelkező TLS 1.2/1.3 protokollt használja.

+ +

A kiszolgáló ujjlenyomata és a csatornakötés megakadályozza a MITM- és a visszajátszási támadásokat.

+ +

Az újrakapcsolódás le van tiltva a munkamenet elleni támadások megelőzése érdekében.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Hozzáférés a Tor hálózaton keresztül
(nem kötelező)

+
+ +

Az IP-címe védelme érdekében a kiszolgálókat a Tor hálózaton vagy más átvitelátfedő hálózaton keresztül is elérheti.

+ +

A SimpleX, Tor hálózaton keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Egyirányú
várólista az üzenetekhez

+
+ +

Minden várólista az üzenetekhez egy irányba továbbítja az üzeneteket, a különböző küldési és fogadási címeken.

+ +

Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó-alkalmazások, és kevesebb metaadatot tesz elérhetővé.

+ +
+

Bezárás

+
+
+ +
+
+ + +
+
+

Több rétegű
tartalomkitöltés

+
+ +

A SimpleX minden titkosítási réteghez tartalomkitöltést használ az üzenetméretre irányuló támadások meghiúsítása érdekében.

+ +

A kiszolgálók és a hálózatot megfigyelők számára a különböző méretű üzenetek egyformának tűnnek.

+ +
+

Bezárás

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX hálózat

+

A Simplex Chat a P2P- és a föderált hálózatok előnyeinek kombinálásával biztosítja a legjobb adatvédelmet.

+ +
+
+
+ + +
+
+

A P2P-hálózatokkal ellentétben

+

+ Minden üzenet a kiszolgálókon keresztül kerül elküldésre, ami jobb metaadat-védelmet és megbízható aszinkron üzenetkézbesítést biztosít, miközben elkerülhető a sok a P2P-hálózatok problémái. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

A föderált hálózatokkal ellentétben

+

+ A SimpleX továbbítókiszolgálói NEM tárolnak felhasználói profilokat, kapcsolatokat és kézbesített üzeneteket, NEM kapcsolódnak egymáshoz, és NINCS kiszolgálójegyzék. +

+
+
+ + + +
+
+ + +
+
+

SimpleX hálózat

+

+ a kiszolgálók egyirányú várólistákat biztosítanak a felhasználók összekapcsolásához, de nem látják a hálózati kapcsolati gráfot; azt csak a felhasználók látják. +

+
+
+ +
+
+ +
+ + + + + +
+
+

A SimpleX bemutatása

+ + + + + + + +
+
+ +
+
1. Felhasználói élmény
+
+ +

+ Csoportokat hozhat létre, valamint kétirányú beszélgetéseket folytathat a partnereivel, ugyanúgy mint bármely más üzenetváltó-alkalmazásban. +

+

+ Hogyan működhet egyirányú várólistával és felhasználói profilazonosítók nélkül? +

+
+
+ +
+
2. Hogyan működik
+
+ +

+ Minden kapcsolathoz két különböző üzenetküldési várólistát használ a különböző kiszolgálókon keresztül történő üzenetküldéshez és -fogadáshoz. +

+

+ A kiszolgálók csak egyetlen irányba továbbítják az üzeneteket, anélkül, hogy teljes képet kapnának a felhasználók beszélgetéseiről vagy kapcsolatairól. +

+
+
+ +
+
3. Mit látnak a kiszolgálók
+
+ +

+ A kiszolgálók minden egyes várólistához külön névtelen hitelesítő-adatokkal rendelkeznek, és nem tudják, hogy melyik felhasználóhoz tartoznak. +

+

+ A felhasználók tovább fokozhatják a metaadatok védelmét, ha a Tor hálózat használatával férnek hozzá a kiszolgálókhoz, így megakadályozva az IP-cím szerinti korrelációt. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Összehasonlítás más protokollokkal

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, és a nagy platformokXMPP, MatrixP2P-protokollok
Globális személyazonosságot igényelNem - privátIgen 1Igen 2Igen 3
A MITM lehetőségeNem - biztonságos 4Igen 5IgenIgen
Függés a DNS-tőlNem - ellenállóIgenIgenNem
Egyetlen vagy központosított hálózatNem - decentralizáltIgenNem - föderált 6Igen 7
Központi komponens vagy más hálózati szintű támadásNem - ellenállóIgenIgen 2Igen 8
+
+ +
+ +
+
+
    +
  1. Általában telefonszám alapján, néhány esetben felhasználónév alapján
  2. +
  3. DNS-alapú címek
  4. +
  5. Nyilvános kulcs vagy más globális egyedi azonosító
  6. +
  7. A SimpleX továbbítókiszolgálói nem veszélyeztethetik a végpontok közötti titkosítást. Hitelesítse a biztonsági kódot a sávon kívüli csatorna elleni támadások veszélyeinek csökkentésére
  8. +
  9. Ha az üzemeltetett kiszolgálók veszélybe kerülnek. Hitelesítse a biztonsági kódot a Signal vagy más biztonságos üzenetküldő alkalmazás segítségével a támadások veszélyeinek csökkentésére
  10. +
  11. Nem védi a felhasználók metaadatait
  12. +
  13. Bár a P2P elosztott, de nem föderált — egyetlen hálózatként működnek
  14. +
  15. A P2P-hálózatoknak vagy van egy központi hitelesítője, vagy az egész hálózat kompromittálódhat — tekintse meg itt
  16. +
+
+
+
+
+ +
+
+

A végpontok közötti titkosítás összehasonlítása más üzenetváltó alkalmazásokkal

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Tartalomkitöltés✔︎1✔︎✔︎1✔︎
Letagadhatóság✔︎2✔︎3✔︎
Kompromittálás előtti titkosságvédelem✔︎✔︎✔︎✔︎✔︎
Kompromittálás utáni titkosságvédelem✔︎4✔︎
Kétlépcsős kulcscsere✔︎✔︎5✔︎5✔︎✔︎5✔︎
Kvantumbiztos, hibrid kriptográfia✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. A Briar 1024 bájtra, a Signal pedig 160 bájtra kerekítve tölti ki az üzenetek tartalmát
  2. +
  3. A letagadhatóság nem foglalja magába a kliens és a kiszolgáló közötti kapcsolatot.
  4. +
  5. Úgy tűnik, hogy a kriptográfiai aláírások használata rontja a letagadhatóságot, de ez tisztázásra szorul.
  6. +
  7. A többeszközös megvalósítás rontja a dupla racsni kompromittálás utáni biztonságát — tekintse meg itt.
  8. +
  9. A kétlépcsős kulcscsere nem követelmény a biztonsági kód ellenőrzéséhez.
  10. +
  11. A kvantumbiztos kulcscsere „ritka” — csak a racsnis lépések egy részét védi.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/id/contact/index.html b/id/contact/index.html index 1239e34575..3877d9863f 100644 --- a/id/contact/index.html +++ b/id/contact/index.html @@ -20,6 +20,10 @@ + dir="ltr" + + + @@ -56,15 +60,16 @@ + + - -
- + + @@ -84,6 +89,10 @@ + + + + @@ -104,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -843,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/id/fdroid/index.html b/id/fdroid/index.html index b0db45c38b..c070cce38c 100644 --- a/id/fdroid/index.html +++ b/id/fdroid/index.html @@ -20,6 +20,10 @@ + dir="ltr" + + + @@ -56,15 +60,16 @@ + + - -
- + + @@ -84,6 +89,10 @@ + + + + @@ -104,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

SimpleX dijelaskan

- - - - - - - -
-
- -
-
1. Apa pengalaman pengguna
-
- -

- Anda dapat membuat kontak dan grup, dan melakukan percakapan dua arah, seperti pada aplikasi perpesanan lainnya. -

-

- Bagaimana cara kerjanya dengan antrean searah dan tanpa ID profil pengguna? -

-
-
- -
-
2. Bagaimana cara kerjanya
-
- -

- Untuk setiap koneksi, Anda menggunakan dua antrean pesan terpisah untuk mengirim dan menerima pesan melalui server yang berbeda. -

-

- Server hanya menyampaikan pesan satu arah, tanpa memiliki gambaran lengkap mengenai percakapan atau koneksi pengguna. -

-
-
- -
-
3. Apa yang dilihat server
-
- -

- Server memiliki kredensial anonim terpisah untuk setiap antrean, dan tidak mengetahui pengguna mana yang menjadi milik mereka. -

-

- Pengguna dapat tingkatkan privasi metadata dengan memakai Tor untuk akses server, mencegah korelasi berdasarkan alamat IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Bebaslah

+

Kebebasan & Keamanan
Komunikasi Anda

+

Jaringan pertama tempat Anda memiliki identitas, kontak, dan grup Anda.

- -
-
-

Perbandingan dengan protokol lain

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, platform besarXMPP, MatrixProtokol P2P
Membutuhkan identitas globalTidak - privatYa 1Ya 2Ya 3
Kemungkinan MITMTidak - aman 4Ya 5YaYa
Ketergantungan pada DNSTidak - tangguhYaYaTidak
Jaringan tunggal atau terpusatTidak - terdesentralisasiYaTidak - terfederasi 6Ya 7
Komponen pusat atau serangan di seluruh jaringan lainnyaTidak - tangguhYaYa 2Ya 8
-
- -
- -
-
-
    -
  1. Biasanya berdasarkan nomor telepon, dalam beberapa kasus berdasarkan nama pengguna
  2. -
  3. Alamat berbasis DNS
  4. -
  5. Kunci publik atau ID unik global lainnya
  6. -
  7. Relay SimpleX tidak dapat membahayakan enkripsi e2e. Verifikasi kode keamanan untuk memitigasi serangan pada saluran out-of-band
  8. -
  9. Jika server operator disusupi. Verifikasi kode keamanan di Signal dan beberapa aplikasi lain untuk mengatasinya
  10. -
  11. Tidak melindungi privasi metadata pengguna
  12. -
  13. Meskipun P2P didistribusikan, mereka tidak terfederasi — mereka beroperasi sebagai jaringan tunggal
  14. -
  15. Jaringan P2P memiliki otoritas pusat atau seluruh jaringan dapat terkompromi - lihat disini
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Audit
Keamanan +

+
+ +
-
-
-
+
+
+
+
+
+
+

Perpesanan Paling Aman di Dunia

+

Perpesanan SimpleX memiliki enkripsi end-to-end yang canggih.

+

Demi keamanan dan privasi Anda, server tidak dapat melihat pesan Anda atau dengan siapa Anda bicara.

+ Pelajari lebih lanjut tentang perpesanan SimpleX +
+
+
+
+
+
+

Anda Pemilik
Web Berikutnya

+

SimpleX didirikan atas keyakinan bahwa Anda harus memiliki identitas, kontak, dan komunitas Anda sendiri.

+

Jaringan yang terbuka dan terdesentralisasi membuat Anda terhubung dengan orang lain dan berbagi ide: bebas dan aman.

+
+
+
+
+
+
+

Komunitas yang Bertahan Lama

+

Anda akan mendukung grup favorit Anda dengan voucher Komunitas di masa mendatang.

+

Voucher akan membayar server, agar komunitas Anda tetap bebas dan independen.

+ Pelajari lebih lanjut tentang Voucher Komunitas +
+
+
-
-
-

Gabung SimpleX

-

Kami mengundang Anda untuk gabung ke percakapan

- - - -

Daftar untuk menerima pembaruan kami

- -
- - - -
- -
- -

Dapatkan aplikasi desktop SimpleX

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

- +
+
+
+

SimpleX Roadmap Menuju Internet Bebas

+
+

2025

+

: Skala ke Komunitas Besar

+

Menghindari platform terpusat

+
+
+

2026

+

: Komunitas & Server Berkelanjutan

+

Perilisan Voucher Komunitas

+
+
+

2027

+

: Buat Komunitas Anda Meningkat

+

Alat untuk promosikan komunitas Anda

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Gabung ke Komunitas SimpleX

+

Ratusan ribu orang sudah memercayai perpesanan SimpleX.

+

Temukan komunitas Anda di direktori SimpleX dan buat komunitas Anda sendiri!

+ Lihat Direktori SimpleX +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/id/invitation/index.html b/id/invitation/index.html index 6070ffd4cb..e8e5630533 100644 --- a/id/invitation/index.html +++ b/id/invitation/index.html @@ -20,6 +20,10 @@ + dir="ltr" + + + @@ -56,15 +60,16 @@ + + - -
- + + @@ -84,6 +89,10 @@ + + + + @@ -104,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -843,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/id/messaging/index.html b/id/messaging/index.html new file mode 100644 index 0000000000..777478a828 --- /dev/null +++ b/id/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Mengapa SimpleX unik

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Anda memiliki privasi penuh

+
+ +
+ +
+

+ SimpleX melindungi privasi profil, kontak, dan metadata Anda, menyembunyikannya dari server jaringan SimpleX dan pengamat mana pun. +

+

+ Tidak seperti jaringan perpesanan lain yang ada, SimpleX tidak memiliki ID tetap kepada pengguna — bahkan nomor acak. +

+ +
+ + + Lebih lanjut + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Anda terlindungi dari
spam dan penyalahgunaan

+
+ +
+ +
+

+ Karena Anda tidak memiliki ID atau alamat tetap di jaringan SimpleX, tidak seorang pun dapat menghubungi Anda kecuali Anda membagikan alamat pengguna 1-kali atau sementara, seperti kode QR atau tautan. +

+ +
+ + + Lebih lanjut + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Data Anda kendali Anda

+
+ +
+ +
+

+ SimpleX menyimpan semua data pengguna pada perangkat klien dalam format basis data terenkripsi portabel — data tersebut dapat ditransfer ke perangkat lain. +

+

+ Pesan yang dienkripsi end-to-end disimpan sementara di server relay SimpleX hingga diterima, lalu dihapus secara permanen. +

+ +
+ + + Lebih lanjut + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Anda memiliki jaringan SimpleX

+
+ +
+ +
+

+ Jaringan SimpleX sepenuhnya terdesentralisasi dan independen dari crypto-currency atau jaringan lain apa pun, selain Internet. +

+

+ Anda dapat menggunakan SimpleX dengan server Anda sendiri atau dengan server yang disediakan oleh kami — dan tetap terhubung dengan pengguna mana pun. +

+ +
+ + + Lebih lanjut + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Fitur

+ +
+ +
+
+ + +
+

Pesan terenkripsi E2E dengan markdown dan pengeditan

+
+ +
+
+ + +
+

Gambar, video, dan berkas
terenkripsi E2E

+
+ +
+
+ + +
+

Grup terenkripsi E2E yang terdesentralisasi — hanya pengguna yang tahu keberadaannya

+
+ +
+
+ + +
+

Pesan suara terenkripsi E2E

+
+ +
+
+ + +
+

Pesan menghilang

+
+ +
+
+ + +
+

Panggilan suara dan video
terenkripsi E2E

+
+ +
+
+ + +
+

Penyimpanan aplikasi terenkripsi portabel — pindahkan profil ke perangkat lain

+
+ +
+
+ + +
+

Mode penyamaran —
unik untuk SimpleX Chat

+
+ +
+
+
+ + +
+
+

Apa yang membuat SimpleX privat

+ +
+
+ + +
+
+ + +
+
+

Pengidentifikasi berpasangan anonim sementara

+
+ +

SimpleX menggunakan alamat terhubung anonim sementara dan kredensial untuk setiap kontak pengguna atau anggota grup.

+ +

Mengirim pesan tanpa pengenal profil pengguna, menyediakan privasi meta-data yang lebih baik daripada alternatif lain.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Pertukaran kunci
out-of-band

+
+ +

Banyak jaringan komunikasi yang rentan terhadap serangan MITM oleh server atau penyedia jaringan.

+ +

Untuk mencegahnya, aplikasi SimpleX meneruskan kunci 1-kali di luar jalur, saat bagikan alamat sebagai tautan atau kode QR.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

2 lapisan
enkripsi end-to-end

+
+ +

Protokol double-ratchet —
Pesan OTR dengan perfect forward secrecy dan pemulihan pembobolan.

+ +

Kotak kripto NaCL di setiap antrean untuk mencegah korelasi lalu lintas antara antrean pesan jika TLS disusupi.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Verifikasi integritas
pesan

+
+ +

Untuk menjamin integritas, pesan diberi nomor urut dan menyertakan hash dari pesan sebelumnya.

+ +

Jika ada pesan yang ditambah, dihapus atau diubah, penerima akan diberi tahu.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Lapisan enkripsi
tambahan server

+
+ +

Lapisan enkripsi server tambahan untuk pengiriman ke penerima, untuk mencegah korelasi antara lalu lintas server yang diterima dan dikirim jika TLS disusupi.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Campuran pesan
untuk kurangi korelasi

+
+ +

Server SimpleX bertindak sebagai node campuran latensi rendah — pesan masuk dan keluar memiliki urutan yang berbeda.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Transport TLS terautentikasi
yang aman

+
+ +

Hanya TLS 1.2/1.3 dengan algoritma kuat yang digunakan untuk koneksi client-server.

+ +

Sidikjari server dan pengikatan saluran mencegah serangan MITM secara berulang.

+ +

Pemulihan koneksi dinonaktifkan untuk mencegah serangan sesi.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Akses opsional
via Tor

+
+ +

Untuk melindungi alamat IP Anda, Anda dapat mengakses server melalui Tor atau lapisan jaringan transport lainnya.

+ +

Untuk menggunakan SimpleX melalui Tor, silakan instal aplikasi Orbot dan aktifkan proksi SOCKS5 (atau VPN di iOS).

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Antrean pesan
searah

+
+ +

Setiap antrean pesan meneruskan pesan dalam satu arah, dengan alamat kirim dan terima yang berbeda.

+ +

Ini mengurangi vektor serangan, dibandingkan dengan perantara pesan tradisional, dan meta-data yang ada.

+ +
+

Ketuk untuk tutup

+
+
+ +
+
+ + +
+
+

Beberapa lapisan
kuat konten

+
+ +

SimpleX menggunakan pengunci konten untuk setiap lapisan enkripsi guna menggagalkan serangan pesan.

+ +

Ini membuat pesan dengan ukuran berbeda terlihat sama bagi server dan pengamat jaringan.

+ +
+

Ketuk untuk tutup

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Jaringan SimpleX

+

SimpleX Chat memberikan privasi terbaik dengan menggabungkan keunggulan P2P dan jaringan terfederasi.

+ +
+
+
+ + +
+
+

Tidak seperti jaringan P2P

+

+ Semua pesan dikirim melalui server, keduanya memberikan privasi metadata yang lebih baik dan pengiriman pesan asinkron yang andal, sekaligus menghindari banyak masalah jaringan P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Tidak seperti jaringan terfederasi

+

+ Server relay SimpleX TIDAK menyimpan profil pengguna, kontak dan pesan yang terkirim, TIDAK terhubung satu sama lain, dan TIDAK ada direktori server. +

+
+
+ + + +
+
+ + +
+
+

Jaringan SimpleX

+

+ server menyediakan antrian searah untuk hubungkan pengguna, tetapi mereka tidak dapat melihat grafik koneksi jaringan — hanya pengguna yang dapat melihatnya. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX dijelaskan

+ + + + + + + +
+
+ +
+
1. Apa pengalaman pengguna
+
+ +

+ Anda dapat membuat kontak dan grup, dan melakukan percakapan dua arah, seperti pada aplikasi perpesanan lainnya. +

+

+ Bagaimana cara kerjanya dengan antrean searah dan tanpa ID profil pengguna? +

+
+
+ +
+
2. Bagaimana cara kerjanya
+
+ +

+ Untuk setiap koneksi, Anda menggunakan dua antrean pesan terpisah untuk mengirim dan menerima pesan melalui server yang berbeda. +

+

+ Server hanya menyampaikan pesan satu arah, tanpa memiliki gambaran lengkap mengenai percakapan atau koneksi pengguna. +

+
+
+ +
+
3. Apa yang dilihat server
+
+ +

+ Server memiliki kredensial anonim terpisah untuk setiap antrean, dan tidak mengetahui pengguna mana yang menjadi milik mereka. +

+

+ Pengguna dapat tingkatkan privasi metadata dengan memakai Tor untuk akses server, mencegah korelasi berdasarkan alamat IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Perbandingan dengan protokol lain

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, platform besarXMPP, MatrixProtokol P2P
Membutuhkan identitas globalTidak - privatYa 1Ya 2Ya 3
Kemungkinan MITMTidak - aman 4Ya 5YaYa
Ketergantungan pada DNSTidak - tangguhYaYaTidak
Jaringan tunggal atau terpusatTidak - terdesentralisasiYaTidak - terfederasi 6Ya 7
Komponen pusat atau serangan di seluruh jaringan lainnyaTidak - tangguhYaYa 2Ya 8
+
+ +
+ +
+
+
    +
  1. Biasanya berdasarkan nomor telepon, dalam beberapa kasus berdasarkan nama pengguna
  2. +
  3. Alamat berbasis DNS
  4. +
  5. Kunci publik atau ID unik global lainnya
  6. +
  7. Relay SimpleX tidak dapat membahayakan enkripsi e2e. Verifikasi kode keamanan untuk memitigasi serangan pada saluran out-of-band
  8. +
  9. Jika server operator disusupi. Verifikasi kode keamanan di Signal dan beberapa aplikasi lain untuk mengatasinya
  10. +
  11. Tidak melindungi privasi metadata pengguna
  12. +
  13. Meskipun P2P didistribusikan, mereka tidak terfederasi — mereka beroperasi sebagai jaringan tunggal
  14. +
  15. Jaringan P2P memiliki otoritas pusat atau seluruh jaringan dapat terkompromi — lihat disini
  16. +
+
+
+
+
+ +
+
+

Seberapa amankah enkripsi end-to-end di berbagai aplikasi perpesanan?

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Lapisan pesan✔︎1✔︎✔︎1✔︎
Penolakan (penyangkalan)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Keamanan post-compromise✔︎4✔︎
Pertukaran kunci 2 faktor✔︎✔︎5✔︎5✔︎✔︎5✔︎
Gabungan kriptografi dan post-quantum✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Lapisan pesan ke ukuran yang dibulatkan hingga 1024 byte, Signal - hingga 160 byte
  2. +
  3. Penolakan tidak mencakup koneksi klien-server.
  4. +
  5. Tampaknya penggunaan signature kriptografi membahayakan penolakan (penyangkalan), tetapi hal ini perlu diperjelas.
  6. +
  7. Implementasi multi-perangkat membahayakan keamanan post-compromise Double Ratchet — lihat disini.
  8. +
  9. Pertukaran kunci 2 faktor bersifat opsional via verifikasi kode keamanan.
  10. +
  11. Kesepakatan kunci Post-quantum "jarang" — hanya melindungi beberapa langkah ratchet.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/img/design_3/android-dark.png b/img/design_3/android-dark.png new file mode 100644 index 0000000000..d4feead139 Binary files /dev/null and b/img/design_3/android-dark.png differ diff --git a/img/design_3/community_vouchers_dark.jpg b/img/design_3/community_vouchers_dark.jpg new file mode 100644 index 0000000000..7b5cf61747 Binary files /dev/null and b/img/design_3/community_vouchers_dark.jpg differ diff --git a/img/design_3/community_vouchers_light.jpg b/img/design_3/community_vouchers_light.jpg new file mode 100644 index 0000000000..1a44dc7500 Binary files /dev/null and b/img/design_3/community_vouchers_light.jpg differ diff --git a/img/design_3/cover-light.jpg b/img/design_3/cover-light.jpg new file mode 100644 index 0000000000..5964d065f5 Binary files /dev/null and b/img/design_3/cover-light.jpg differ diff --git a/img/design_3/cover-light.webp b/img/design_3/cover-light.webp new file mode 100644 index 0000000000..9868c80f83 Binary files /dev/null and b/img/design_3/cover-light.webp differ diff --git a/img/design_3/cover.jpg b/img/design_3/cover.jpg new file mode 100644 index 0000000000..9c7b987f26 Binary files /dev/null and b/img/design_3/cover.jpg differ diff --git a/img/design_3/cover.webp b/img/design_3/cover.webp new file mode 100644 index 0000000000..1d57283693 Binary files /dev/null and b/img/design_3/cover.webp differ diff --git a/img/design_3/green-tick.svg b/img/design_3/green-tick.svg new file mode 100644 index 0000000000..b3087f3f33 --- /dev/null +++ b/img/design_3/green-tick.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/img/design_3/logo-light.png b/img/design_3/logo-light.png new file mode 100644 index 0000000000..93751c0f90 Binary files /dev/null and b/img/design_3/logo-light.png differ diff --git a/img/design_3/publications/heise.png b/img/design_3/publications/heise.png new file mode 100644 index 0000000000..185d814fd5 Binary files /dev/null and b/img/design_3/publications/heise.png differ diff --git a/img/design_3/publications/kuketz-blog.png b/img/design_3/publications/kuketz-blog.png new file mode 100644 index 0000000000..f3a033ed15 Binary files /dev/null and b/img/design_3/publications/kuketz-blog.png differ diff --git a/img/design_3/publications/optout.png b/img/design_3/publications/optout.png new file mode 100644 index 0000000000..c2d11e5320 Binary files /dev/null and b/img/design_3/publications/optout.png differ diff --git a/img/design_3/publications/privacy-guides.png b/img/design_3/publications/privacy-guides.png new file mode 100644 index 0000000000..c59594212d Binary files /dev/null and b/img/design_3/publications/privacy-guides.png differ diff --git a/img/design_3/publications/trail-of-bits.png b/img/design_3/publications/trail-of-bits.png new file mode 100644 index 0000000000..84603a414c Binary files /dev/null and b/img/design_3/publications/trail-of-bits.png differ diff --git a/img/design_3/publications/whonix.png b/img/design_3/publications/whonix.png new file mode 100644 index 0000000000..bbad541f71 Binary files /dev/null and b/img/design_3/publications/whonix.png differ diff --git a/img/design_3/red-x.svg b/img/design_3/red-x.svg new file mode 100644 index 0000000000..5b4b3a5e02 --- /dev/null +++ b/img/design_3/red-x.svg @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/img/design_3/section-2-desktop-light.webp b/img/design_3/section-2-desktop-light.webp new file mode 100644 index 0000000000..8575125b1f Binary files /dev/null and b/img/design_3/section-2-desktop-light.webp differ diff --git a/img/design_3/section-2-desktop.webp b/img/design_3/section-2-desktop.webp new file mode 100644 index 0000000000..6a95856181 Binary files /dev/null and b/img/design_3/section-2-desktop.webp differ diff --git a/img/design_3/section-2-mobile-light.webp b/img/design_3/section-2-mobile-light.webp new file mode 100644 index 0000000000..a3a4b7c309 Binary files /dev/null and b/img/design_3/section-2-mobile-light.webp differ diff --git a/img/design_3/section-2-mobile.webp b/img/design_3/section-2-mobile.webp new file mode 100644 index 0000000000..a3d5b4b108 Binary files /dev/null and b/img/design_3/section-2-mobile.webp differ diff --git a/img/design_3/section-3-desktop-light.webp b/img/design_3/section-3-desktop-light.webp new file mode 100644 index 0000000000..b77bb2cea8 Binary files /dev/null and b/img/design_3/section-3-desktop-light.webp differ diff --git a/img/design_3/section-3-desktop.webp b/img/design_3/section-3-desktop.webp new file mode 100644 index 0000000000..3e8305f83f Binary files /dev/null and b/img/design_3/section-3-desktop.webp differ diff --git a/img/design_3/section-3-mobile-light.webp b/img/design_3/section-3-mobile-light.webp new file mode 100644 index 0000000000..bae7f00183 Binary files /dev/null and b/img/design_3/section-3-mobile-light.webp differ diff --git a/img/design_3/section-3-mobile.webp b/img/design_3/section-3-mobile.webp new file mode 100644 index 0000000000..30ea2d0ef6 Binary files /dev/null and b/img/design_3/section-3-mobile.webp differ diff --git a/img/design_3/section-4-desktop-light.webp b/img/design_3/section-4-desktop-light.webp new file mode 100644 index 0000000000..a1f0257494 Binary files /dev/null and b/img/design_3/section-4-desktop-light.webp differ diff --git a/img/design_3/section-4-desktop.webp b/img/design_3/section-4-desktop.webp new file mode 100644 index 0000000000..83fce91f55 Binary files /dev/null and b/img/design_3/section-4-desktop.webp differ diff --git a/img/design_3/section-4-mobile-light.webp b/img/design_3/section-4-mobile-light.webp new file mode 100644 index 0000000000..f2a38ff08f Binary files /dev/null and b/img/design_3/section-4-mobile-light.webp differ diff --git a/img/design_3/section-4-mobile.webp b/img/design_3/section-4-mobile.webp new file mode 100644 index 0000000000..8878460423 Binary files /dev/null and b/img/design_3/section-4-mobile.webp differ diff --git a/img/design_3/section-5-desktop-light.webp b/img/design_3/section-5-desktop-light.webp new file mode 100644 index 0000000000..8ce4908f83 Binary files /dev/null and b/img/design_3/section-5-desktop-light.webp differ diff --git a/img/design_3/section-5-desktop.webp b/img/design_3/section-5-desktop.webp new file mode 100644 index 0000000000..ba28f542f4 Binary files /dev/null and b/img/design_3/section-5-desktop.webp differ diff --git a/img/design_3/section-5-mobile-light.webp b/img/design_3/section-5-mobile-light.webp new file mode 100644 index 0000000000..6e7536418a Binary files /dev/null and b/img/design_3/section-5-mobile-light.webp differ diff --git a/img/design_3/section-5-mobile.webp b/img/design_3/section-5-mobile.webp new file mode 100644 index 0000000000..0e4384954b Binary files /dev/null and b/img/design_3/section-5-mobile.webp differ diff --git a/img/design_3/secure_messaging_dark.jpg b/img/design_3/secure_messaging_dark.jpg new file mode 100644 index 0000000000..19462345be Binary files /dev/null and b/img/design_3/secure_messaging_dark.jpg differ diff --git a/img/design_3/secure_messaging_light.jpg b/img/design_3/secure_messaging_light.jpg new file mode 100644 index 0000000000..7fee3cf764 Binary files /dev/null and b/img/design_3/secure_messaging_light.jpg differ diff --git a/img/design_3/simplex_nft_smpx.jpg b/img/design_3/simplex_nft_smpx.jpg new file mode 100644 index 0000000000..91260056a2 Binary files /dev/null and b/img/design_3/simplex_nft_smpx.jpg differ diff --git a/img/design_3/socials/apple.png b/img/design_3/socials/apple.png new file mode 100644 index 0000000000..7aad34dc47 Binary files /dev/null and b/img/design_3/socials/apple.png differ diff --git a/img/design_3/socials/linux.png b/img/design_3/socials/linux.png new file mode 100644 index 0000000000..155a9a48ee Binary files /dev/null and b/img/design_3/socials/linux.png differ diff --git a/img/design_3/socials/windows.png b/img/design_3/socials/windows.png new file mode 100644 index 0000000000..d9b192c8cc Binary files /dev/null and b/img/design_3/socials/windows.png differ diff --git a/img/design_3/testflight-dark.png b/img/design_3/testflight-dark.png new file mode 100644 index 0000000000..ddcdd58fd9 Binary files /dev/null and b/img/design_3/testflight-dark.png differ diff --git a/img/design_3/yellow-tick.svg b/img/design_3/yellow-tick.svg new file mode 100644 index 0000000000..b14b1da701 --- /dev/null +++ b/img/design_3/yellow-tick.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/img/flags/id.svg b/img/flags/id.svg new file mode 100644 index 0000000000..3b7c8fcfd9 --- /dev/null +++ b/img/flags/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/img/groups/images/478ec86_izoJb95VXKWEhg.jpg b/img/groups/images/478ec86_izoJb95VXKWEhg.jpg new file mode 100644 index 0000000000..f03198fd37 Binary files /dev/null and b/img/groups/images/478ec86_izoJb95VXKWEhg.jpg differ diff --git a/img/groups/images/5QzoN8PNFD2dkButszPu5g.png b/img/groups/images/5QzoN8PNFD2dkButszPu5g.png new file mode 100644 index 0000000000..4c10b4a359 Binary files /dev/null and b/img/groups/images/5QzoN8PNFD2dkButszPu5g.png differ diff --git a/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg b/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg new file mode 100644 index 0000000000..cd73ac72d6 Binary files /dev/null and b/img/groups/images/9aT7qRY_JbSJsW4qDaIHEg.jpg differ diff --git a/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png b/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png new file mode 100644 index 0000000000..baf5e2cb75 Binary files /dev/null and b/img/groups/images/AXalaTZ4HsgGtEkaGFbclg.png differ diff --git a/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg b/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg new file mode 100644 index 0000000000..d4309d9d41 Binary files /dev/null and b/img/groups/images/B3xza7zUzYi3dHiRsg6Afg.jpg differ diff --git a/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg b/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg new file mode 100644 index 0000000000..7fa4ffeded Binary files /dev/null and b/img/groups/images/BD6FXuHO-eKOnYCAzkRfmA.jpg differ diff --git a/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg b/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg new file mode 100644 index 0000000000..60c50722a1 Binary files /dev/null and b/img/groups/images/CX-1MPD3r3a7NYBvW7de6g.jpg differ diff --git a/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png b/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png new file mode 100644 index 0000000000..e17fd8ca1d Binary files /dev/null and b/img/groups/images/ESomaJp7MlFlThqcoj3Ycg.png differ diff --git a/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg b/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg new file mode 100644 index 0000000000..9497a640a0 Binary files /dev/null and b/img/groups/images/F4hPy5IGO6G9QUH6-nM_-A.jpg differ diff --git a/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png b/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png new file mode 100644 index 0000000000..b8a3e92f79 Binary files /dev/null and b/img/groups/images/HylzOLARvIhUR1wiq0fnJA.png differ diff --git a/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg b/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg new file mode 100644 index 0000000000..445dd6b359 Binary files /dev/null and b/img/groups/images/NvmOInofh4RSB2fHdN0zQA.jpg differ diff --git a/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png b/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png new file mode 100644 index 0000000000..7c8608bdbb Binary files /dev/null and b/img/groups/images/PPTLdveOyb9Wsg3bm6Y_IQ.png differ diff --git a/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png b/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png new file mode 100644 index 0000000000..b0a5b871f7 Binary files /dev/null and b/img/groups/images/TwaN96DcV2OCMfUo6oJ4LQ.png differ diff --git a/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg b/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg new file mode 100644 index 0000000000..54e49c659b Binary files /dev/null and b/img/groups/images/Wsdcf731ufbEOYpHc2rqrg.jpg differ diff --git a/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg b/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg new file mode 100644 index 0000000000..dccd0279bb Binary files /dev/null and b/img/groups/images/YLLz-47eBnAoIH1PKYJ75g.jpg differ diff --git a/img/groups/images/YhyznG68PNewCNjoD_ceOg.png b/img/groups/images/YhyznG68PNewCNjoD_ceOg.png new file mode 100644 index 0000000000..1d6149ff7b Binary files /dev/null and b/img/groups/images/YhyznG68PNewCNjoD_ceOg.png differ diff --git a/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg b/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg new file mode 100644 index 0000000000..e51aa1c8a4 Binary files /dev/null and b/img/groups/images/eb2RINRsdEBI0a06ghzqVg.jpg differ diff --git a/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg b/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg new file mode 100644 index 0000000000..b5c27d1cd5 Binary files /dev/null and b/img/groups/images/gqyRO21CwqK3huZ2zbkOqQ.jpg differ diff --git a/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg b/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg new file mode 100644 index 0000000000..f7cf6ed19b Binary files /dev/null and b/img/groups/images/n3VLCEBWhqU9rVtlEAKUhQ.jpg differ diff --git a/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg b/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg new file mode 100644 index 0000000000..e2fbccf16e Binary files /dev/null and b/img/groups/images/t1RmI4AhKgelVoWeSBTqUA.jpg differ diff --git a/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg b/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg new file mode 100644 index 0000000000..0ce158cb20 Binary files /dev/null and b/img/groups/images/uZU6Cn1przsjVJ-DBm1-eA.jpg differ diff --git a/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg b/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg new file mode 100644 index 0000000000..88184b12b2 Binary files /dev/null and b/img/groups/images/zIotMF8Zoe85k956B48N9g.jpg differ diff --git a/img/messengers/briar.svg b/img/messengers/briar.svg new file mode 100644 index 0000000000..8aea1a2bd9 --- /dev/null +++ b/img/messengers/briar.svg @@ -0,0 +1,4 @@ + + + + diff --git a/img/messengers/cwtch.png b/img/messengers/cwtch.png new file mode 100644 index 0000000000..e50812f7eb Binary files /dev/null and b/img/messengers/cwtch.png differ diff --git a/img/messengers/element.svg b/img/messengers/element.svg new file mode 100644 index 0000000000..ebeaaa705a --- /dev/null +++ b/img/messengers/element.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/messengers/session.svg b/img/messengers/session.svg new file mode 100644 index 0000000000..ac6a6417a0 --- /dev/null +++ b/img/messengers/session.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/messengers/signal.png b/img/messengers/signal.png new file mode 100644 index 0000000000..ba683e155d Binary files /dev/null and b/img/messengers/signal.png differ diff --git a/img/new/arrow-left-dark.svg b/img/new/arrow-left-dark.svg index 6300e60e17..db62cf93a0 100644 --- a/img/new/arrow-left-dark.svg +++ b/img/new/arrow-left-dark.svg @@ -1,6 +1,6 @@ - + diff --git a/img/new/arrow-right-dark.svg b/img/new/arrow-right-dark.svg index 303c86e7d0..526e2dcf47 100644 --- a/img/new/arrow-right-dark.svg +++ b/img/new/arrow-right-dark.svg @@ -1,6 +1,6 @@ - + diff --git a/img/new/tab-video.svg b/img/new/tab-video.svg index 55e8b2d36e..55b6825866 100644 --- a/img/new/tab-video.svg +++ b/img/new/tab-video.svg @@ -1,7 +1,7 @@ - + diff --git a/index.html b/index.html index ef092e6573..881e7c7166 100644 --- a/index.html +++ b/index.html @@ -1,3 +1,4 @@ + - - - - - SimpleX Chat: private and secure messenger without any user IDs (not even random) - - - - - - - - - - - - - - - - - - - - -
- + + + + + + SimpleX Chat: private and secure messenger without any user IDs (not even random) + + + + + + + + + + + + + + + + + + + + + + @@ -107,188 +130,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
- -
-
-
-
-
- - - -
-

Privacy redefined

-

The first messenger
without user IDs

-

- Other apps have user IDs: Signal, Matrix, Session, Briar, Jami, Cwtch, etc.
SimpleX does not, not even random numbers.
This radically improves your privacy. -

- Why user IDs are bad for privacy? - - - - - How does SimpleX work? - - - - - Security assessments - - - - -
- - -
-
- -
-
-
- -
- - - -
- - -
- -
-

- Make a private connection -

-

- The video shows how you connect to your friend via their 1-time QR-code, in person or via a video link. You can also connect by sharing an invitation link. -

-
- - -
-
-
- -
-
- - - - -
-
-

Why privacy matters

-

Preserving the privacy of your metadata — who you talk with — protects you from:

-
- - -
-
- -
-
-

Advertising and price discrimination

- - Privacy saves you money - - - - - -
-
- -
-
- -
-
-

Manipulation of elections

- - Privacy gives you power - - - - - -
-
- -
-
- -
-
-

Prosecution due to innocent association

- - Privacy protects your freedom - - - - - -
-
- - -
-

Make sure your messenger can't access your data!

-
-
- - -
-
-

Why SimpleX is unique

- -
-
- - -
- -
- - -
- -
-
-

#1

-

You have complete privacy

-
- -
- -
-

- SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. -

-

- Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. -

- -
- - - Learn more - -
-
- - -
- -
- -
- - -
- -
-
-

#2

-

You are protected
from spam and abuse

-
- -
- -
-

- Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. -

- -
- - - Learn more - -
-
- - -
- -
- -
- - -
- -
-
-

#3

-

You control your data

-
- -
- -
-

- SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. -

-

- The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. -

- -
- - - Learn more - -
-
- - -
- -
- -
- - -
- -
-
-

#4

-

You own SimpleX network

-
- -
- -
-

- The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. -

-

- You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. -

- -
- - - Learn more - -
-
- - -
- - -
- - - - - - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-

Features

- -
- -
-
- - -
-

E2E-encrypted messages with markdown and editing

-
- -
-
- - -
-

E2E-encrypted
images, videos and files

-
- -
-
- - -
-

E2E-encrypted decentralized groups — only users know they exist

-
- -
-
- - -
-

E2E-encrypted voice messages

-
- -
-
- - -
-

Disappearing messages

-
- -
-
- - -
-

E2E-encrypted
audio and video calls

-
- -
-
- - -
-

Portable encrypted app storage — move profile to another device

-
- -
-
- - -
-

Incognito mode —
unique to SimpleX Chat

-
- -
-
-
- - -
-
-

What makes SimpleX private

- -
-
- - -
-
- - -
-
-

Temporary anonymous pairwise identifiers

-
- -

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

- -

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Out-of-band
Key exchange

-
- -

Many communication networks are vulnerable to MITM attacks by servers or network providers.

- -

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

2-layers of
End-to-end encryption

-
- -

Double-ratchet protocol —
OTR messaging with perfect Forward secrecy and Break-in recovery.

- -

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Message integrity
verification

-
- -

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

- -

If any message is added, removed or changed the recipient will be alerted.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Additional layer of
server encryption

-
- -

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Message mixing
to reduce correlation

-
- -

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Secure authenticated
TLS transport

-
- -

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

- -

Server fingerprint and channel binding prevent MITM and replay attacks.

- -

Connection resumption is disabled to prevent session attacks.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Optional
access via Tor

-
- -

To protect your IP address you can access the servers via Tor or some other transport Overlay network.

- -

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Unidirectional
message queues

-
- -

Each message queue passes messages in one direction, with the different send and receive addresses.

- -

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

- -
-

Tap to close

-
-
- -
-
- - -
-
-

Multiple layers of
Content padding

-
- -

SimpleX uses Content padding for each encryption layer to frustrate message size attacks.

- -

It makes messages of different sizes look the same to the servers and network observers.

- -
-

Tap to close

-
-
- -
- - - - - - - - - - - -
-
-
-
- - -
-
-

SimpleX Network

-

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

- -
-
-
- - -
-
-

Unlike P2P networks

-

- All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. - - -

- -

-
-
- - - -
-
- - -
-
-

Unlike federated networks

-

- SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. -

-
-
- - - -
-
- - -
-
-

SimpleX network

-

- servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. -

-
-
- -
-
- -
- - - - - -
-
-

SimpleX explained

- - - - - - - -
-
- -
-
1. What users experience
-
- -

- You can create contacts and groups, and have two-way conversations, as in any other messenger. -

-

- How can it work with unidirectional queues and without user profile identifiers? -

-
-
- -
-
2. How does it work
-
- -

- For each connection you use two separate messaging queues to send and receive messages via different servers. -

-

- Servers only pass messages one way, without having the full picture of user's conversations or connections. -

-
-
- -
-
3. What servers see
-
- -

- The servers have separate Anonymous credentials for each queue, and do not know which users they belong to. -

-

- Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparison with other protocols

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
-
- -
- -
-
-
    -
  1. Usually based on a phone number, in some cases on usernames
  2. -
  3. DNS-based addresses
  4. -
  5. Public key or some other globally unique ID
  6. -
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. -
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. -
  11. Does not protect users' metadata privacy
  12. -
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. -
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Join SimpleX

-

We invite you to join the conversation

- - - -

Sign up to receive our updates

- -
- - - -
- -
- -

Get SimpleX desktop app

-
- - - - - -
-
-
-

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/invitation/index.html b/invitation/index.html index 77993b80bc..fe03c5aa5c 100644 --- a/invitation/index.html +++ b/invitation/index.html @@ -35,6 +35,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -107,188 +110,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/it/contact/index.html b/it/contact/index.html index cb3d9d785f..9bcacd8e53 100644 --- a/it/contact/index.html +++ b/it/contact/index.html @@ -18,6 +18,8 @@ + + dir="ltr" @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/it/fdroid/index.html b/it/fdroid/index.html index 6dd05edb78..75ad29d6b3 100644 --- a/it/fdroid/index.html +++ b/it/fdroid/index.html @@ -18,6 +18,8 @@ + + dir="ltr" @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

SimpleX spiegato

- - - - - - - -
-
- -
-
1. Cosa fanno gli utenti
-
- -

- Puoi creare contatti e gruppi, ed avere conversazioni bidirezionali, come in qualsiasi altro messenger. -

-

- Come può funzionare con code unidirezionali e senza identificatori utente? -

-
-
- -
-
2. Come funziona
-
- -

- Per ogni connessione usi due code di messaggi distinte per inviare e ricevere i messaggi attraverso server diversi. -

-

- I server passano i messaggi solo in una direzione, senza avere il quadro completo delle conversazioni dell'utente o delle connessioni. -

-
-
- -
-
3. Cosa vedono i server
-
- -

- I server hanno credenziali anonime separate per ogni coda e non sanno a quali utenti appartengano. -

-

- Gli utenti possono aumentare ulteriormente la privacy dei metadati usando Tor per accedere ai server, evitando correlazioni per indirizzo IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Vivi
libero

+

Libertà e sicurezza
delle tue comunicazioni

+

La prima rete in cui possiedi la tua identità, i contatti e i gruppi.

- -
-
-

Confronto con altri protocolli

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, grandi piattaformeXMPP, MatrixProtocolli P2P
Richiede un'identità globaleNo - privato123
Possibilità di MITMNo - sicuro 45
Dipendenza dai DNSNo - resistenteNo
Rete singola o centralizzataNo - decentralizzatoNo - federato 67
Componente centrale o altro attacco a livello di reteNo - resistente28
-
- -
- -
-
-
    -
  1. Solitamente si basa su un numero di telefono, in alcuni casi su nomi utente
  2. -
  3. Indirizzi basati su DNS
  4. -
  5. Chiave pubblica o altro ID univoco globale
  6. -
  7. I relay di SimpleX non possono compromettere la crittografia e2e. Verifica il codice di sicurezza per mitigare gli attacchi sul canale fuori banda
  8. -
  9. Se i server dell'operatore sono compromessi. Verifica il codice di sicurezza in Signal e alcune altre app per mitigarlo
  10. -
  11. Non protegge la privacy dei metadati degli utenti
  12. -
  13. Sebbene i P2P siano distribuiti, non sono federati — operano come un'unica rete
  14. -
  15. Le reti P2P hanno un'autorità centrale o l'intera rete può essere compromessa - vedi qui
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Analisi della
sicurezza +

+
+ +
-
-
-
+
+
+
+
+
+
+

La messaggistica più sicuro del mondo

+

SimpleX usa una crittografia end-to-end all'avanguardia.

+

Per la tua sicurezza e privacy, i server non possono vedere i messaggi e con chi parli.

+ Scopri di più sui messaggi di SimpleX +
+
+
+
+
+
+

Il nuovo web
è tuo

+

SimpleX è fondato sulla convinzione che devi possedere la tua identità, i tuoi contatti e le tue comunità.

+

La rete aperta e decentralizzata consente di connetterti con persone e condividere idee: sii libero e al sicuro.

+
+
+
+
+
+
+

Comunità fatte per restare

+

Sosterrai i tuoi gruppi preferiti con futuri buoni comunitari.

+

I buoni pagheranno i server, per consentire alle tue comunità di rimanere libere e indipendenti.

+ Scopri di più e ricevi un NFT gratuito
per provarlo in anticipo.
+
+
+
-
-
-

Unisciti a SimpleX

-

Ti invitiamo ad unirti alla conversazione

- - - -

Iscriviti per ricevere i nostri aggiornamenti

- -
- - - -
- -
- -

Ottieni l'app desktop di SimpleX

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

- +
+
+
+

Tabella di marcia per un internet libero

+
+

2025

+

: Scalabilità per comunità numerose

+

Fuga da piattaforme centralizzate

+
+
+

2026

+

: Comunità e server sostenibili

+

Pubblicazione di buoni comunitari

+
+
+

2027

+

: Fare crescere le tue comunità

+

Strumenti per promuovere le tue comunità

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Unisciti alle comunità di SimpleX

+

Centinaia di migliaia di persone si fidano già di SimpleX.

+

Trova le comunità nella directory di SimpleX e creane una tua!

+ Vedi la directory di SimpleX +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/it/invitation/index.html b/it/invitation/index.html index 088cb4984e..f1d18125d3 100644 --- a/it/invitation/index.html +++ b/it/invitation/index.html @@ -18,6 +18,8 @@ + + dir="ltr" @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/it/messaging/index.html b/it/messaging/index.html new file mode 100644 index 0000000000..c0c42d5d29 --- /dev/null +++ b/it/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Perché SimpleX è unico

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Hai una privacy completa

+
+ +
+ +
+

+ SimpleX protegge la privacy del tuo profilo, contatti e metadati, nascondendoli ai server della rete SimpleX e ad eventuali osservatori. +

+

+ A differenza di qualsiasi altra rete di messaggistica esistente, SimpleX non ha identificatori assegnati agli utenti — nemmeno numeri casuali. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Sei protetto
da spam e abusi

+
+ +
+ +
+

+ Poiché non hai un identificatore o un indirizzo fisso sulla rete SimpleX, nessuno può contattarti a meno che tu non condivida un indirizzo utente una tantum o temporaneo, come codice un QR o un link. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Sei tu a controllare i tuoi dati

+
+ +
+ +
+

+ SimpleX conserva tutti i dati utente sui dispositivi client in un formato trasferibile di database crittografato — può essere trasferito su un altro dispositivo. +

+

+ I messaggi crittografati end-to-end vengono conservati temporaneamente sui server di inoltro SimpleX fino alla ricezione, quindi vengono eliminati definitivamente. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Possiedi la rete SimpleX

+
+ +
+ +
+

+ La rete SimpleX è completamente decentralizzata e indipendente da qualsiasi criptovaluta o altra rete, ad eccezione di internet. +

+

+ Puoi usare SimpleX con i tuoi server personali o con i server forniti da noi — e connetterti comunque a qualsiasi utente. +

+ +
+ + + Maggiori informazioni + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Caratteristiche

+ +
+ +
+
+ + +
+

Messaggi crittografati E2E con markdown e modifica

+
+ +
+
+ + +
+

Immagini, video e file
crittografati E2E

+
+ +
+
+ + +
+

Gruppi decentralizzati crittografati E2E — solo gli utenti sanno che esistono

+
+ +
+
+ + +
+

Messaggi vocali crittografati E2E

+
+ +
+
+ + +
+

Conversazioni segrete a tempo

+
+ +
+
+ + +
+

Chiamate audio e video
crittografate E2E

+
+ +
+
+ + +
+

Archiviazione dell'app crittografata e trasferibile — sposta il profilo su un altro dispositivo

+
+ +
+
+ + +
+

Modalità incognito —
unica su SimpleX Chat

+
+ +
+
+
+ + +
+
+

Cosa rende SimpleX privato

+ +
+
+ + +
+
+ + +
+
+

Identificatori temporanei anonimi a coppie

+
+ +

SimpleX usa indirizzi e credenziali temporanei anonimi a coppie, per ogni contatto o membro del gruppo.

+ +

Ciò consente di recapitare messaggi senza identificatori del profilo utente, garantendo una migliore privacy dei metadati rispetto alle alternative.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Scambio di chiavi
fuori banda

+
+ +

Molte reti di comunicazione sono vulnerabili agli attacchi MITM da parte di server o fornitori di rete.

+ +

Per evitarlo, le app SimpleX passano chiavi monouso fuori banda, quando condividi un indirizzo come link o codice QR.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

2 livelli di
crittografia end-to-end

+
+ +

Protocollo Double-ratchet —
Messaggistica OTR con Perfect Forward Secrecy e recupero da intrusione.

+ +

Cryptobox NaCL in ogni coda per evitare correlazioni di traffico tra code di messaggi se il TLS è compromesso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Verifica
dell'integrità dei messaggi

+
+ +

Per garantire l'integrità, i messaggi sono numerati in sequenza e includono l'hash del messaggio precedente.

+ +

Se un messaggio viene aggiunto, rimosso o modificato, il destinatario verrà avvisato.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Livello aggiuntivo di
crittografia lato server

+
+ +

Livello aggiuntivo di crittografia lato server per il recapito al destinatario, per impedire la correlazione tra il traffico del server ricevuto e inviato se il TLS è compromesso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Mescolamento dei messaggi
per ridurre le correlazioni

+
+ +

I server SimpleX fungono da nodi mix a bassa latenza — i messaggi in entrata e in uscita hanno un ordine diverso.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Trasporto TLS
autenticato sicuro

+
+ +

Usato solo TLS 1.2/1.3 con algoritmi avanzati per connessioni client-server.

+ +

Impronta del server e associazione dei canali evitano attacchi MITM e replay.

+ +

Ripresa della connessione disattivata per evitare attacchi alla sessione.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Accesso via Tor
opzionale

+
+ +

Per proteggere il tuo indirizzo IP puoi accedere ai server tramite Tor o un'altra rete di trasporto sovrapposta.

+ +

Per usare SimpleX tramite Tor, installa l'app Orbot e attiva il proxy SOCKS5 (o VPN su iOS).

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Code di messaggi
unidirezionali

+
+ +

Ogni coda di messaggi passa i messaggi in una direzione, con i diversi indirizzi di invio e ricezione.

+ +

Riduce i vettori di attacco, rispetto ai broker di messaggi tradizionali, e i metadati disponibili.

+ +
+

Tocca per chiudere

+
+
+ +
+
+ + +
+
+

Diversi strati di
riempimento dei contenuti

+
+ +

SimpleX usa il riempimento dei contenuti per ogni livello di crittografia per frustrare gli attacchi alle dimensioni dei messaggi.

+ +

Fa sì che i messaggi di dimensioni diverse appaiano uguali ai server e a chi osserva la rete.

+ +
+

Tocca per chiudere

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Rete di SimpleX

+

Simplex Chat offre la migliore privacy combinando i vantaggi del P2P e delle reti federate.

+ +
+
+
+ + +
+
+

A differenza delle reti P2P

+

+ tutti i messaggi vengono inviati tramite i server, garantendo una migliore privacy dei metadati e una consegna asincrona dei messaggi affidabile, evitando molti problemi delle reti P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

A differenza delle reti federate

+

+ i server di inoltro SimpleX NON conservano i profili utente, i contatti e i messaggi consegnati, NON si connettono tra loro e NON esiste una directory dei server. +

+
+
+ + + +
+
+ + +
+
+

Nella rete di SimpleX

+

+ i server forniscono code unidirezionali per connettere gli utenti, ma non hanno visibilità del grafo delle connessioni di rete — solo gli utenti. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX spiegato

+ + + + + + + +
+
+ +
+
1. Cosa fanno gli utenti
+
+ +

+ Puoi creare contatti e gruppi, ed avere conversazioni bidirezionali, come in qualsiasi altro messenger. +

+

+ Come può funzionare con code unidirezionali e senza identificatori utente? +

+
+
+ +
+
2. Come funziona
+
+ +

+ Per ogni connessione usi due code di messaggi distinte per inviare e ricevere i messaggi attraverso server diversi. +

+

+ I server passano i messaggi solo in una direzione, senza avere il quadro completo delle conversazioni dell'utente o delle connessioni. +

+
+
+ +
+
3. Cosa vedono i server
+
+ +

+ I server hanno credenziali anonime separate per ogni coda e non sanno a quali utenti appartengano. +

+

+ Gli utenti possono aumentare ulteriormente la privacy dei metadati usando Tor per accedere ai server, evitando correlazioni per indirizzo IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Confronto con altri protocolli

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandi piattaformeXMPP, MatrixProtocolli P2P
Richiede un'identità globaleNo - privato123
Possibilità di MITMNo - sicuro 45
Dipendenza dai DNSNo - resistenteNo
Rete singola o centralizzataNo - decentralizzatoNo - federato 67
Componente centrale o altro attacco a livello di reteNo - resistente28
+
+ +
+ +
+
+
    +
  1. Solitamente si basa su un numero di telefono, in alcuni casi su nomi utente
  2. +
  3. Indirizzi basati su DNS
  4. +
  5. Chiave pubblica o altro ID univoco globale
  6. +
  7. I relay di SimpleX non possono compromettere la crittografia e2e. Verifica il codice di sicurezza per mitigare gli attacchi sul canale fuori banda
  8. +
  9. Se i server dell'operatore sono compromessi. Verifica il codice di sicurezza in Signal e alcune altre app per mitigarlo
  10. +
  11. Non protegge la privacy dei metadati degli utenti
  12. +
  13. Sebbene i P2P siano distribuiti, non sono federati — operano come un'unica rete
  14. +
  15. Le reti P2P hanno un'autorità centrale o l'intera rete può essere compromessa — vedi qui
  16. +
+
+
+
+
+ +
+
+

Confronto della sicurezza di crittografia end-to-end in diverse app di messaggistica

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Riempimento dei messaggi✔︎1✔︎✔︎1✔︎
Ripudio (negabilità)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Sicurezza post-compromissione✔︎4✔︎
Scambio di chiavi a 2 fattori✔︎✔︎5✔︎5✔︎✔︎5✔︎
Crittografia ibrida quantistica✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar riempie i messaggi ad una dimensione arrotondata fino a 1024 byte, Signal a 160 byte
  2. +
  3. Il ripudio non include la connessione client-server.
  4. +
  5. Sembra che l'uso di firme crittografiche comprometta il ripudio (negabilità), ma occorrono chiarimenti.
  6. +
  7. L'implementazione multi-dispositivo compromette la sicurezza post-compromissione di Double Ratchet — vedi qui.
  8. +
  9. Lo scambio di chiavi a 2 fattori è facoltativo tramite la verifica del codice di sicurezza.
  10. +
  11. L'accordo sulle chiavi post-quantistico è “scarno” — protegge solo alcuni dei passaggi del ratchet.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/ja/contact/index.html b/ja/contact/index.html index f904a07108..1591d85c5c 100644 --- a/ja/contact/index.html +++ b/ja/contact/index.html @@ -19,6 +19,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ja/fdroid/index.html b/ja/fdroid/index.html index 81c083c520..6c59b827a0 100644 --- a/ja/fdroid/index.html +++ b/ja/fdroid/index.html @@ -19,6 +19,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

SimpleXの説明

- - - - - - - -
-
- -
-
1. ユーザーが経験すること
-
- -

- 他のメッセンジャーと同様に、連絡先やグループを作成し、双方向の会話を行うことができます。 -

-

- ユーザー プロファイル識別子なしで単方向キューをどのように処理できるのでしょうか? -

-
-
- -
-
2. 仕組み
-
- -

- 接続ごとに 2 つの個別のメッセージング キューを使用して、異なるサーバー経由でメッセージを送受信します。 -

-

- サーバーは、ユーザーの会話や接続の全体像を把握することなく、メッセージを一方向に渡すだけです。 -

-
-
- -
-
3. サーバーが認識するもの
-
- -

- サーバーはキューごとに個別の匿名認証情報を持っており、どのユーザーに属しているかはわかりません。 -

-

- ユーザーは、Tor を使用してサーバーにアクセスし、IP アドレスによる相関を防ぐことで、メタデータのプライバシーをさらに向上させることができます。 -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

他のプロトコルとの比較

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal、大きなプラットフォームXMPP、MatrixP2Pプロトコル
グローバル ID が必要いいえ - プライベートはい 1はい 2はい 3
MITMの可能性いいえ - 安全 4はい 5はいはい
DNS への依存いいえ - 弾力性はいはいいいえ
単一または集中型ネットワークいいえ - 分散型はいいいえ - 連合型 6はい 7
中央コンポーネントまたはその他のネットワーク全体の攻撃いいえ - 弾力性はいはい 2はい 8
-
- -
- -
-
-
    -
  1. 通常は電話番号に基づいていますが、場合によってはユーザー名に基づいています
  2. -
  3. DNSベースのアドレス
  4. -
  5. 公開キーまたはその他のグローバルに一意な ID
  6. -
  7. SimpleX リレーは e2e 暗号化を侵害できません。 セキュリティ コードを検証して帯域外チャネルへの攻撃を軽減します
  8. -
  9. オペレーターのサーバーが侵害された場合。 Signal およびその他の一部のアプリでセキュリティ コードを検証して緩和する
  10. -
  11. ユーザーのメタデータのプライバシーを保護しない
  12. -
  13. P2Pは分散されていますが、フェデレーションされていません — 単一のネットワークとして動作します
  14. -
  15. P2Pネットワークには中央当局が存在するか、ネットワーク全体が侵害される可能性がある - こちらを見る
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

参加 SimpleX

-

ぜひ会話にご参加ください

- - - -

最新情報を受け取る

- -
- - - -
- -
- -

SimpleXを入手する desktop app

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/ja/invitation/index.html b/ja/invitation/index.html index cb1437f6fc..23eeddbff6 100644 --- a/ja/invitation/index.html +++ b/ja/invitation/index.html @@ -19,6 +19,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -87,6 +90,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ja/messaging/index.html b/ja/messaging/index.html new file mode 100644 index 0000000000..b9a3fdd99b --- /dev/null +++ b/ja/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

なぜSimpleXなのか唯一

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

プライバシーが完全に守られます

+
+ +
+ +
+

+ SimpleXは、SimpleXネットワークのサーバやその他の観察者から隠すことで、あなたのプロフィール、連絡先やメタデータのプライバシーを守ります。 +

+

+ その他の既存のメッセージネットワークと異なり、SimpleXはユーザへ識別子を割り当てません — ランダムな番号さえありません。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

スパムや悪用から
保護されています

+
+ +
+ +
+

+ あなたは識別子や固定されたアドレスをSimpleXネットワーク上で持たないため、あなたがQRコードやリンクといった一度のみ使用可能もしくは一時的なユーザアドレスを共有しない限り、誰もあなたへ連絡することができません。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

データを管理するのはあなたです

+
+ +
+ +
+

+ SimpleXはクライアント端末上の全てのユーザデータを ポータブルで暗号化されたデータベースフォーマットで保管します—別の端末へ移行することができます。 +

+

+ エンドツーエンドで暗号化されたメッセージは、SimpleXのリレーサーバ上で受信されるまで一時的に保管され、その後永久的に削除されます。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

SimpleX ネットワークを所有

+
+ +
+ +
+

+ SimpleXネットワークは、インターネット以外のいかなる暗号通貨やネットワークから独立しており、完全に分散化されています。 +

+

+ あなたは私たちの提供するサーバや 自分自身のサーバでSimpleXを使う ことができます — そして別のユーザとつながることができます。 +

+ +
+ + + さらに詳しく + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

特徴

+ +
+ +
+
+ + +
+

マークダウンと編集を使用可能なE2E 暗号化メッセージ

+
+ +
+
+ + +
+

E2E暗号化された
画像とファイル

+
+ +
+
+ + +
+

分散型シークレットグループ —
ユーザーのみがその存在を知っています

+
+ +
+
+ + +
+

E2E暗号化された音声メッセージ

+
+ +
+
+ + +
+

消えるメッセージ

+
+ +
+
+ + +
+

E2E暗号化された
音声通話とビデオ通話

+
+ +
+
+ + +
+

ポータブルな暗号化データベース — プロファイルを別のデバイスに移動する

+
+ +
+
+ + +
+

シークレット モード —
SimpleX Chat に固有の

+
+ +
+
+
+ + +
+
+

SimpleX をプライベートにするもの

+ +
+
+ + +
+
+ + +
+
+

一時的な匿名のペア識別子

+
+ +

SimpleX は、ユーザー連絡先またはグループ メンバーごとに、一時的な匿名のペアごとのアドレスと資格情報を使用します。

+ +

ユーザー プロファイル識別子なしでメッセージを配信できるため、他の方法よりも優れたメタデータ プライバシーが提供されます。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

帯域外の
鍵交換

+
+ +

多くの通信ネットワークは、サーバーやネットワーク プロバイダーによるMITM 攻撃に対して脆弱です。

+ +

これを防ぐために、SimpleX アプリは、アドレスをリンクまたは QR コードとして共有するときに、ワンタイム キーを帯域外で渡します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

2レイヤーの
エンドツーエンド暗号化

+
+ +

ダブルラチェットプロトコル —
完全な前方秘匿性と侵入回復機能を備えたOTRメッセージング。

+ +

各キューのNaCL cryptoboxは、TLSが侵害された場合にメッセージキュー間のトラフィック相関を防止します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

メッセージの整合性
検証

+
+ +

整合性を保証するために、メッセージには連続した番号が付けられ、前のメッセージのハッシュが含まれます。

+ +

メッセージが追加、削除、または変更されると、受信者に警告が表示されます。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

追加レイヤーの
サーバー暗号化

+
+ +

TLSが侵害された場合、受信したサーバー・トラフィックと送信したサーバー・トラフィックの相関を防ぐため、受信者に配信するサーバー暗号化レイヤーを追加します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

メッセージのミキシング
相関性を減らす

+
+ +

SimpleX サーバーは、低遅延の混合ノードとして機能します — 受信メッセージと送信メッセージの順序が異なります。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

セキュアな認証付き
TLSトランスポート

+
+ +

クライアント/サーバー接続には、強力なアルゴリズムを備えた TLS 1.2/1.3 のみが使用されます。

+ +

サーバーのフィンガープリントとチャネル バインディングにより、MITM 攻撃やリプレイ攻撃を防止します。

+ +

セッション攻撃を防ぐために、接続の再開は無効になっています。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

オプション
Tor経由のアクセス

+
+ +

IP アドレスを保護するために、Tor またはその他のトランスポート オーバーレイ ネットワーク経由でサーバーにアクセスできます。

+ +

Tor経由でSimpleXを使用するには、Orbotアプリをインストールし、SOCKS5プロキシを有効にしてください(iOSの場合はVPN)。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

単方向
メッセージキュー

+
+ +

各メッセージ キューは、異なる送信アドレスと受信アドレスを使用してメッセージを一方向に渡します。

+ +

従来のメッセージ ブローカーと比較して、攻撃ベクトルが減少し、利用可能なメタデータが減少します。

+ +
+

タップして閉じる

+
+
+ +
+
+ + +
+
+

何レイヤーもの
コンテンツパディング

+
+ +

SimpleX は、各暗号化レイヤーにコンテンツ パディングを使用して、メッセージ サイズ攻撃を阻止します。

+ +

これにより、異なるサイズのメッセージがサーバーやネットワーク オブザーバーには同じように見えます。

+ +
+

タップして閉じる

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX ネットワーク

+

Simplex Chat は、P2P とフェデレーション ネットワークの利点を組み合わせて最高のプライバシーを提供します。

+ +
+
+
+ + +
+
+

P2Pネットワークとは異なります

+

+ すべてのメッセージはサーバー経由で送信され、メタデータのプライバシーが向上し、信頼性の高い非同期メッセージ配信が提供されると同時に、多くが回避されます P2Pネットワークの問題点. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

連合型ネットワークとは異なります

+

+ SimpleX リレー サーバーは、ユーザー プロファイル、連絡先、配信されたメッセージを保存せず、相互に接続せず、サーバー ディレクトリもありません。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX ネットワーク

+

+ サーバーはユーザーを接続するための一方向キューを提供しますが、ネットワーク接続グラフは表示されません— ユーザーだけがそうします。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleXの説明

+ + + + + + + +
+
+ +
+
1. ユーザーが経験すること
+
+ +

+ 他のメッセンジャーと同様に、連絡先やグループを作成し、双方向の会話を行うことができます。 +

+

+ ユーザー プロファイル識別子なしで単方向キューをどのように処理できるのでしょうか? +

+
+
+ +
+
2. 仕組み
+
+ +

+ 接続ごとに 2 つの個別のメッセージング キューを使用して、異なるサーバー経由でメッセージを送受信します。 +

+

+ サーバーは、ユーザーの会話や接続の全体像を把握することなく、メッセージを一方向に渡すだけです。 +

+
+
+ +
+
3. サーバーが認識するもの
+
+ +

+ サーバーはキューごとに個別の匿名認証情報を持っており、どのユーザーに属しているかはわかりません。 +

+

+ ユーザーは、Tor を使用してサーバーにアクセスし、IP アドレスによる相関を防ぐことで、メタデータのプライバシーをさらに向上させることができます。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

他のプロトコルとの比較

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal、大きなプラットフォームXMPP、MatrixP2Pプロトコル
グローバル ID が必要いいえ - プライベートはい 1はい 2はい 3
MITMの可能性いいえ - 安全 4はい 5はいはい
DNS への依存いいえ - 弾力性はいはいいいえ
単一または集中型ネットワークいいえ - 分散型はいいいえ - 連合型 6はい 7
中央コンポーネントまたはその他のネットワーク全体の攻撃いいえ - 弾力性はいはい 2はい 8
+
+ +
+ +
+
+
    +
  1. 通常は電話番号に基づいていますが、場合によってはユーザー名に基づいています
  2. +
  3. DNSベースのアドレス
  4. +
  5. 公開キーまたはその他のグローバルに一意な ID
  6. +
  7. SimpleX リレーは e2e 暗号化を侵害できません。 セキュリティ コードを検証して帯域外チャネルへの攻撃を軽減します
  8. +
  9. オペレーターのサーバーが侵害された場合。 Signal およびその他の一部のアプリでセキュリティ コードを検証して緩和する
  10. +
  11. ユーザーのメタデータのプライバシーを保護しない
  12. +
  13. P2Pは分散されていますが、フェデレーションされていません — 単一のネットワークとして動作します
  14. +
  15. P2Pネットワークには中央当局が存在するか、ネットワーク全体が侵害される可能性がある — こちらを見る
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — こちらを見る.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/jobs/index.html b/jobs/index.html index 810a6e7511..a400561378 100644 --- a/jobs/index.html +++ b/jobs/index.html @@ -35,6 +35,8 @@ + + @@ -52,12 +54,12 @@ + - -
- + + @@ -98,198 +100,298 @@ + -
-
- - - - - +
- + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - -
- -
+

Join SimpleX Chat team

SimpleX Chat is a seed stage startup with a lot of user growth in 2022-2025, and a lot of exciting technical and product problems to solve to grow faster.

@@ -428,7 +512,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/js/design3.js b/js/design3.js new file mode 100644 index 0000000000..97c1275b05 --- /dev/null +++ b/js/design3.js @@ -0,0 +1,309 @@ +const isMobile = { + Android: () => navigator.userAgent.match(/Android/i), + iOS: () => navigator.userAgent.match(/iPhone|iPad|iPod/i), + any: () => navigator.userAgent.match(/Android|iPhone|iPad|iPod/i) +}; + +(function() { +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializePage); +} else { + initializePage(); +} + +function initializePage() { + const googlePlayBtn = document.querySelector('.google-play-btn'); + const appleStoreBtn = document.querySelector('.apple-store-btn'); + const fDroidBtn = document.querySelector('.f-droid-btn'); + const testflightBtn = document.querySelector('.testflight-btn'); + const androidBtn = document.querySelector('.android-btn'); + const desktopAppBtn = document.querySelector('.desktop-app-btn'); + + if (!googlePlayBtn || !appleStoreBtn || !fDroidBtn || !testflightBtn || !androidBtn || !desktopAppBtn) return; + + + if (isMobile.Android()) { + googlePlayBtn.classList.remove('hidden'); + fDroidBtn.classList.remove('hidden'); + androidBtn.classList.remove('hidden'); + } + else if (isMobile.iOS()) { + appleStoreBtn.classList.remove('hidden'); + testflightBtn.classList.remove('hidden'); + } + else { + appleStoreBtn.classList.remove('hidden'); + googlePlayBtn.classList.remove('hidden'); + desktopAppBtn.classList.remove('hidden'); + // fDroidBtn.classList.remove('hidden'); + // testflightBtn.classList.remove('hidden'); + // androidBtn.classList.remove('hidden'); + } + + showPromotedGroups(); +} + +async function showPromotedGroups() { + welcome(); + const listing = await fetchJSON(simplexDirectoryDataURL + 'promoted.json'); + let [entries, imgPath] = + Array.isArray(listing?.entries) && listing.entries.length > 0 + ? [listing.entries, simplexDirectoryDataURL] + : [fallbackEntries(), '/img/groups/']; + // Uncomment to log fallback entries + // entries.forEach(e => { + // delete e.activeAt; + // delete e.createdAt; + // delete e.entryType; + // delete e.groupLink.connFullLink; + // delete e.shortDescr; + // delete e.welcomeMessage; + // }); + // console.log(entries); + const links = document.querySelectorAll('.group-images a.group-image'); + entries = shuffleEntries(entries, links.length); + + for (let i = 0; i < links.length; i++) { + const link = links[i] + const img = link.querySelector('img'); + const {displayName, imageFile, groupLink} = entries[i % entries.length]; + img.src = imageFile ? imgPath + imageFile : '/img/group.svg'; + img.addEventListener('error', () => img.src = '/img/group.svg'); + link.title = displayName; + const groupLinkUri = groupLink.connShortLink ?? groupLink.connFullLink + try { + link.href = platformSimplexUri(groupLinkUri); + } catch(e) { + console.log(e); + link.href = groupLinkUri; + } + } + + function shuffleEntries(entries, count) { + let a = entries.filter(e => e.displayName != simplexUsersGroup) + shuffle(); + let result = a; + while (result.length < count) { + shuffle(); + result = result.concat(a); + } + return result; + + function shuffle() { + for (let i = a.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [a[i], a[j]] = [a[j], a[i]]; + } + } + } + + async function fetchJSON(url) { + try { + const response = await fetch(url) + if (!response.ok) throw new Error(`HTTP status: ${response.status}`) + return await response.json() + } catch (e) { + console.error(e) + } + } + + function welcome() { + console.log('%c%s', 'font-family: monospace; white-space: pre;', +`Welcome to __ __ + ___ ___ __ __ ___ _ ___\\ \\ / / ___ _ _ _ _____ +/ __|_ _| \\/ | _ \\ | | __ \\ V / / __| || | /_\\_ _| +\\__ \\| || |\\/| | _/ |__| _| / . \\| (__| __ |/ _ \\| | +|___/___|_| |_|_| |____|___/_/ \\_\\\\___|_||_/_/ \\_\\_| + +Mint SimpleX NFT for SMPX testnet access in 2026: https://simplex.chat/token + +SimpleX directory: https://simplex.chat/directory +Ask SimpleX team: https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw +GitHub: https://github.com/simplex-chat/simplex-chat +Reddit: https://www.reddit.com/r/SimpleXChat +X/Twitter: https://x.com/SimpleXChat + +Docs +---- +Whitepaper: https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md +Bots API: https://github.com/simplex-chat/simplex-chat/tree/stable/bots +TypeScript library: https://github.com/simplex-chat/simplex-chat/tree/stable/packages/simplex-chat-client/typescript +Terminal CLI: https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md +Hosting SMP servers: https://simplex.chat/docs/server.html + +Downloads +--------- +Apps: https://simplex.chat/downloads +Servers: https://github.com/simplex-chat/simplexmq/releases + +Project +------- +About & Contact us: https://simplex.chat/about +Privacy policy: https://simplex.chat/privacy +Join team: https://simplex.chat/jobs +Donations: https://github.com/simplex-chat/simplex-chat#please-support-us-with-your-donations +` + ); + } + + function fallbackEntries() { + console.log('Error: using hardcoded listing as fallback'); + return [ + { + displayName: "Bitcoin&LightningNetwork", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#-xXBhQRrvRB1ffhxcPpB44Im1_ci4BMIdCHwj8m8IHo" + }, + imageFile: "images/F4hPy5IGO6G9QUH6-nM_-A.jpg" + }, + { + displayName: "Freedom.Tech", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#r5z3uzHp8_pL3ZPyuBCJWmvzQxMnc0Tj3QMLTEnyw6c" + }, + imageFile: "images/HylzOLARvIhUR1wiq0fnJA.png" + }, + { + displayName: "Spirituality", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#OZ8ml_2dj5AutxnNIrHy0CPn1QdnSkQ0oh_84nAv5io" + }, + imageFile: "images/eb2RINRsdEBI0a06ghzqVg.jpg" + }, + { + displayName: "SovereignStack", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#u2D3BdOb3nt9wMR_qoweAINLcEZaU60Xjwfpf74Dq2I" + }, + imageFile: "images/YLLz-47eBnAoIH1PKYJ75g.jpg" + }, + { + displayName: "Monero", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#FlIy4-q4TzZDI9fK2aw3lQTUvnmaoiLCyeKCoP27kGU" + }, + imageFile: "images/TwaN96DcV2OCMfUo6oJ4LQ.png" + }, + { + displayName: "Start9 - Sovereign Computing", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#JArWigpS6OB0gYE2U94pDSzPQyejOdmqe98ohBNoW2Q" + }, + imageFile: "images/478ec86_izoJb95VXKWEhg.jpg" + }, + { + displayName: "Meshtastic", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#Ub1c3ByH5vkhXMMsRdG0fBhSik_qPuEZHcx8AQ2f2Tw" + }, + imageFile: "images/PPTLdveOyb9Wsg3bm6Y_IQ.png" + }, + { + displayName: "GrapheneOS (unofficial)", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#6OTo6kP4ccV4lPOOHekZfOajdxGkxC1_DkAR39_cU4U" + }, + imageFile: "images/zIotMF8Zoe85k956B48N9g.jpg" + }, + { + displayName: "BasicSwap", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#yXMQy5Si6sD5YAdCB4DlUM0kvlKYcUfSiIvOA-RXI_U" + }, + imageFile: "images/AXalaTZ4HsgGtEkaGFbclg.png" + }, + { + displayName: "Linux", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#gqXY-Fxwral34c4bsHlYKZ5QuB6ptVSRMwhWgLKHz54" + }, + imageFile: "images/gqyRO21CwqK3huZ2zbkOqQ.jpg" + }, + { + displayName: "ModernSurvival", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#e4_r2E20FSWl97XGsHyXoPOkW5B6SmjlWQ1ngVW6Umc" + }, + imageFile: "images/5QzoN8PNFD2dkButszPu5g.png" + }, + { + displayName: "Qubes OS", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#COegA1s1ppZG4hRbcpuWwx_QWB4ScouQcIDWwXx64SY" + }, + imageFile: "images/Wsdcf731ufbEOYpHc2rqrg.jpg" + }, + { + displayName: "RoboSats", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#PNRhbupXbsSr5SpkjqP8IjkI6ACPCr2WOxAqSAW4jr0" + }, + imageFile: "images/uZU6Cn1przsjVJ-DBm1-eA.jpg" + }, + { + displayName: "Guardian Project (Unofficial)", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#7zpeTUzhVIwEbZpvo9SUGz1LE35jKfmF_AHYx5YLsxQ" + }, + imageFile: "images/NvmOInofh4RSB2fHdN0zQA.jpg" + }, + { + displayName: "Private Messaging Apps 2", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#aPhAePNB7Nn-W4kUBNBpZELXttysG-yAM8ZiU2XoB10" + }, + imageFile: "images/9aT7qRY_JbSJsW4qDaIHEg.jpg" + }, + { + displayName: "Cake Wallet - Official", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#D46rZgLF1eLDLkOyqYnaifRuZcYjlEMgkujKV2buH6k" + }, + imageFile: "images/YhyznG68PNewCNjoD_ceOg.png" + }, + { + displayName: "CoMaps (EN)", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#mBdIDCJotrN7pimTmXoaAPybC7CmCaaAFxQcwultCvo" + }, + imageFile: "images/BD6FXuHO-eKOnYCAzkRfmA.jpg" + }, + { + displayName: "SimpleX users group", + groupLink: { + connShortLink: "https://smp4.simplex.im/g#hr4lvFeBmndWMKTwqiodPz3VBo_6UmdGWocXd1SupsM" + }, + imageFile: "images/CX-1MPD3r3a7NYBvW7de6g.jpg" + }, + { + displayName: "NBTV Community", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#RX598AUwyQBG6bqa4TOnEnUg7xONdrA-_e0CmNGxEBI" + }, + imageFile: "images/n3VLCEBWhqU9rVtlEAKUhQ.jpg" + }, + { + displayName: "Lossless Audio Community", + groupLink: { + connShortLink: "https://smp6.simplex.im/g#D4P5ENAzT-JoVlFNvRC7geHkkMUuQ9IuhQQC15OFE-o" + }, + imageFile: "images/B3xza7zUzYi3dHiRsg6Afg.jpg" + }, + { + displayName: "RetoSwap – Official SimpleXChat Group", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#-_h6fBWisca6RKhteZtVuXol1a49vFH1Jo-n74fnRK0" + }, + imageFile: "images/ESomaJp7MlFlThqcoj3Ycg.png" + }, + { + displayName: "UW Support 💬", + groupLink: { + connShortLink: "https://smp5.simplex.im/g#6KPZcRjE6KDNQ1VcS1a2wd9LRuJy1zgdvldaE5bhg5c" + }, + imageFile: "images/t1RmI4AhKgelVoWeSBTqUA.jpg" + } + ] + } +} +})(); diff --git a/js/directory.js b/js/directory.js index eb8b457c59..6ccdf23033 100644 --- a/js/directory.js +++ b/js/directory.js @@ -1,7 +1,5 @@ (function() { -const directoryDataURL = 'https://directory.simplex.chat/data/'; - -// const directoryDataURL = 'http://localhost:8080/directory-data/'; +if (!document.location.pathname.startsWith('/directory')) return; let allEntries = []; @@ -14,7 +12,7 @@ let currentSearch = ''; let currentPage = 1; async function initDirectory() { - const listing = await fetchJSON(directoryDataURL + 'listing.json') + const listing = await fetchJSON(simplexDirectoryDataURL + 'listing.json') const liveBtn = document.querySelector('#top-pagination .live'); const newBtn = document.querySelector('#top-pagination .new'); const topBtn = document.querySelector('#top-pagination .top'); @@ -122,8 +120,6 @@ function roundedTs(s) { } } -const simplexUsersGroup = 'SimpleX users group'; - function entrySortPriority(entry) { return entry.displayName === simplexUsersGroup ? Number.MAX_VALUE @@ -175,7 +171,7 @@ function displayEntries(entries) { try { const { entryType, displayName, groupLink, shortDescr, welcomeMessage, imageFile } = entry; const entryDiv = document.createElement('div'); - entryDiv.className = 'entry w-full flex flex-col items-start md:flex-row rounded-[4px] overflow-hidden shadow-[0px_20px_30px_rgba(0,0,0,0.12)] dark:shadow-none bg-white dark:bg-[#11182F] mb-8'; + entryDiv.className = 'entry w-full flex flex-col items-start md:flex-row rounded-[4px] overflow-hidden shadow-[0px_20px_30px_rgba(0,0,0,0.12)] dark:shadow-none bg-white dark:bg-[#0B2A59] mb-8'; const textContainer = document.createElement('div'); textContainer.className = 'text-container'; @@ -262,7 +258,7 @@ function displayEntries(entries) { imgLinkElement.title = `Join ${displayName}`; const imgElement = document.createElement('img'); - imgElement.src = imageFile ? directoryDataURL + imageFile : '/img/group.svg'; + imgElement.src = imageFile ? simplexDirectoryDataURL + imageFile : '/img/group.svg'; imgElement.alt = displayName; imgElement.addEventListener('error', () => imgElement.src = '/img/group.svg'); imgLinkElement.appendChild(imgElement); @@ -412,34 +408,6 @@ function targetBlank(uri) { return isCurrentSite(uri) ? '' : ' target="_blank"' } -const simplexAddressRegexp = /^simplex:\/([a-z]+)#(.+)/i; - -const simplexShortLinkTypes = ["a", "c", "g", "i", "r"]; - -function platformSimplexUri(uri) { - if (isMobile.any()) return uri; - const res = uri.match(simplexAddressRegexp); - if (!res || !Array.isArray(res) || res.length < 3) return uri; - const linkType = res[1]; - const fragment = res[2]; - if (simplexShortLinkTypes.includes(linkType)) { - const queryIndex = fragment.indexOf('?'); - if (queryIndex === -1) return uri; - const hashPart = fragment.substring(0, queryIndex); - const queryStr = fragment.substring(queryIndex + 1); - const params = new URLSearchParams(queryStr); - const host = params.get('h'); - if (!host) return uri; - params.delete('h'); - let newFragment = hashPart; - const remainingParams = params.toString(); - if (remainingParams) newFragment += '?' + remainingParams; - return `https://${host}:/${linkType}#${newFragment}`; - } else { - return `https://simplex.chat/${linkType}#${fragment}`; - } -} - function renderMarkdown(fts) { let html = ''; for (const ft of fts) { @@ -509,3 +477,37 @@ function renderMarkdown(fts) { return html; } })(); + +const simplexDirectoryDataURL = 'https://directory.simplex.chat/data/'; + +// const simplexDirectoryDataURL = 'http://localhost:8080/directory-data/'; + +const simplexUsersGroup = 'SimpleX users group'; + +const simplexAddressRegexp = /^simplex:\/([a-z]+)#(.+)/i; + +const simplexShortLinkTypes = ["a", "c", "g", "i", "r"]; + +function platformSimplexUri(uri) { + if (isMobile.any()) return uri; + const res = uri.match(simplexAddressRegexp); + if (!res || !Array.isArray(res) || res.length < 3) return uri; + const linkType = res[1]; + const fragment = res[2]; + if (simplexShortLinkTypes.includes(linkType)) { + const queryIndex = fragment.indexOf('?'); + if (queryIndex === -1) return uri; + const hashPart = fragment.substring(0, queryIndex); + const queryStr = fragment.substring(queryIndex + 1); + const params = new URLSearchParams(queryStr); + const host = params.get('h'); + if (!host) return uri; + params.delete('h'); + let newFragment = hashPart; + const remainingParams = params.toString(); + if (remainingParams) newFragment += '?' + remainingParams; + return `https://${host}:/${linkType}#${newFragment}`; + } else { + return `https://simplex.chat/${linkType}#${fragment}`; + } +} diff --git a/js/ethers.umd.js.map b/js/ethers.umd.js.map new file mode 100644 index 0000000000..a8ec1e55c1 --- /dev/null +++ b/js/ethers.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ethers.umd.js","sources":["../lib.esm/_version.js","../lib.esm/utils/properties.js","../lib.esm/utils/errors.js","../lib.esm/utils/data.js","../lib.esm/utils/maths.js","../lib.esm/utils/base58.js","../lib.esm/utils/base64-browser.js","../lib.esm/utils/events.js","../lib.esm/utils/utf8.js","../lib.esm/utils/geturl-browser.js","../lib.esm/utils/fetch.js","../lib.esm/utils/fixednumber.js","../lib.esm/utils/rlp-decode.js","../lib.esm/utils/rlp-encode.js","../lib.esm/utils/units.js","../lib.esm/utils/uuid.js","../lib.esm/abi/coders/abstract-coder.js","../node_modules/@noble/hashes/esm/_assert.js","../node_modules/@noble/hashes/esm/crypto.js","../node_modules/@noble/hashes/esm/utils.js","../node_modules/@noble/hashes/esm/hmac.js","../node_modules/@noble/hashes/esm/pbkdf2.js","../node_modules/@noble/hashes/esm/_sha2.js","../node_modules/@noble/hashes/esm/sha256.js","../node_modules/@noble/hashes/esm/_u64.js","../node_modules/@noble/hashes/esm/sha512.js","../lib.esm/crypto/crypto-browser.js","../lib.esm/crypto/hmac.js","../node_modules/@noble/hashes/esm/sha3.js","../lib.esm/crypto/keccak.js","../node_modules/@noble/hashes/esm/ripemd160.js","../lib.esm/crypto/ripemd160.js","../lib.esm/crypto/pbkdf2.js","../lib.esm/crypto/random.js","../node_modules/@noble/hashes/esm/scrypt.js","../lib.esm/crypto/scrypt.js","../lib.esm/crypto/sha2.js","../node_modules/@noble/curves/esm/abstract/utils.js","../node_modules/@noble/curves/esm/abstract/modular.js","../node_modules/@noble/curves/esm/abstract/curve.js","../node_modules/@noble/curves/esm/abstract/weierstrass.js","../node_modules/@noble/curves/esm/_shortw_utils.js","../node_modules/@noble/curves/esm/secp256k1.js","../lib.esm/constants/addresses.js","../lib.esm/constants/hashes.js","../lib.esm/constants/numbers.js","../lib.esm/constants/strings.js","../lib.esm/crypto/signature.js","../lib.esm/crypto/signing-key.js","../lib.esm/crypto/index.js","../lib.esm/address/address.js","../lib.esm/address/contract-address.js","../lib.esm/address/checks.js","../lib.esm/abi/typed.js","../lib.esm/abi/coders/address.js","../lib.esm/abi/coders/anonymous.js","../lib.esm/abi/coders/array.js","../lib.esm/abi/coders/boolean.js","../lib.esm/abi/coders/bytes.js","../lib.esm/abi/coders/fixed-bytes.js","../lib.esm/abi/coders/null.js","../lib.esm/abi/coders/number.js","../lib.esm/abi/coders/string.js","../lib.esm/abi/coders/tuple.js","../lib.esm/transaction/accesslist.js","../lib.esm/transaction/authorization.js","../lib.esm/transaction/address.js","../lib.esm/transaction/transaction.js","../lib.esm/hash/authorization.js","../lib.esm/hash/id.js","../node_modules/@adraffy/ens-normalize/dist/index.mjs","../lib.esm/hash/namehash.js","../lib.esm/hash/message.js","../lib.esm/hash/solidity.js","../lib.esm/hash/typed-data.js","../lib.esm/abi/fragments.js","../lib.esm/abi/abi-coder.js","../lib.esm/abi/bytes32.js","../lib.esm/abi/interface.js","../lib.esm/providers/provider.js","../lib.esm/contract/wrappers.js","../lib.esm/contract/contract.js","../lib.esm/contract/factory.js","../lib.esm/providers/ens-resolver.js","../lib.esm/providers/format.js","../lib.esm/providers/plugins-network.js","../lib.esm/providers/network.js","../lib.esm/providers/subscriber-polling.js","../lib.esm/providers/abstract-provider.js","../lib.esm/providers/abstract-signer.js","../lib.esm/providers/community.js","../lib.esm/providers/subscriber-filterid.js","../lib.esm/providers/provider-jsonrpc.js","../lib.esm/providers/provider-ankr.js","../lib.esm/providers/provider-alchemy.js","../lib.esm/providers/provider-chainstack.js","../lib.esm/providers/provider-cloudflare.js","../lib.esm/providers/provider-etherscan.js","../lib.esm/providers/ws-browser.js","../lib.esm/providers/provider-socket.js","../lib.esm/providers/provider-websocket.js","../lib.esm/providers/provider-infura.js","../lib.esm/providers/provider-quicknode.js","../lib.esm/providers/provider-fallback.js","../lib.esm/providers/default-provider.js","../lib.esm/providers/signer-noncemanager.js","../lib.esm/providers/provider-browser.js","../lib.esm/providers/provider-blockscout.js","../lib.esm/providers/provider-pocket.js","../lib.esm/providers/provider-ipcsocket-browser.js","../lib.esm/wallet/base-wallet.js","../lib.esm/wordlists/decode-owl.js","../lib.esm/wordlists/wordlist.js","../lib.esm/wordlists/wordlist-owl.js","../lib.esm/wordlists/lang-en.js","../lib.esm/wallet/mnemonic.js","../node_modules/aes-js/lib.esm/aes.js","../node_modules/aes-js/lib.esm/mode.js","../node_modules/aes-js/lib.esm/mode-cbc.js","../node_modules/aes-js/lib.esm/mode-ctr.js","../node_modules/aes-js/lib.esm/padding.js","../lib.esm/wallet/utils.js","../lib.esm/wallet/json-keystore.js","../lib.esm/wallet/hdwallet.js","../lib.esm/wallet/json-crowdsale.js","../lib.esm/wallet/wallet.js","../lib.esm/wordlists/bit-reader.js","../lib.esm/wordlists/decode-owla.js","../lib.esm/wordlists/wordlist-owla.js","../lib.esm/wordlists/wordlists-browser.js","../lib.esm/ethers.js"],"sourcesContent":["/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.15.0\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value, seen) {\n if (value == null) {\n return \"null\";\n }\n if (seen == null) {\n seen = new Set();\n }\n if (typeof (value) === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map((v) => stringify(v, seen))).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON(), seen);\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"number\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k, seen)}: ${stringify(value[k], seen)}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && value.match(/^0x(?:[0-9a-f][0-9a-f])*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","/**\n * Some mathematic operations.\n *\n * @_subsection: api/utils:Math Helpers [about-maths]\n */\nimport { hexlify, isBytesLike } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\n//const BN_Max256 = (BN_1 << BigInt(256)) - BN_1;\n// IEEE 754 support 53-bits of mantissa\nconst maxValue = 0x1fffffffffffff;\n/**\n * Convert %%value%% from a twos-compliment representation of %%width%%\n * bits to its value.\n *\n * If the highest bit is ``1``, the result will be negative.\n */\nexport function fromTwos(_value, _width) {\n const value = getUint(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n assert((value >> width) === BN_0, \"overflow\", \"NUMERIC_FAULT\", {\n operation: \"fromTwos\", fault: \"overflow\", value: _value\n });\n // Top bit set; treat as a negative value\n if (value >> (width - BN_1)) {\n const mask = (BN_1 << width) - BN_1;\n return -(((~value) & mask) + BN_1);\n }\n return value;\n}\n/**\n * Convert %%value%% to a twos-compliment representation of\n * %%width%% bits.\n *\n * The result will always be positive.\n */\nexport function toTwos(_value, _width) {\n let value = getBigInt(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n const limit = (BN_1 << (width - BN_1));\n if (value < BN_0) {\n value = -value;\n assert(value <= limit, \"too low\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n const mask = (BN_1 << width) - BN_1;\n return ((~value) & mask) + BN_1;\n }\n else {\n assert(value < limit, \"too high\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n }\n return value;\n}\n/**\n * Mask %%value%% with a bitmask of %%bits%% ones.\n */\nexport function mask(_value, _bits) {\n const value = getUint(_value, \"value\");\n const bits = BigInt(getNumber(_bits, \"bits\"));\n return value & ((BN_1 << bits) - BN_1);\n}\n/**\n * Gets a BigInt from %%value%%. If it is an invalid value for\n * a BigInt, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getBigInt(value, name) {\n switch (typeof (value)) {\n case \"bigint\": return value;\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return BigInt(value);\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n if (value[0] === \"-\" && value[1] !== \"-\") {\n return -BigInt(value.substring(1));\n }\n return BigInt(value);\n }\n catch (e) {\n assertArgument(false, `invalid BigNumberish string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid BigNumberish value\", name || \"value\", value);\n}\n/**\n * Returns %%value%% as a bigint, validating it is valid as a bigint\n * value and that it is positive.\n */\nexport function getUint(value, name) {\n const result = getBigInt(value, name);\n assert(result >= BN_0, \"unsigned value cannot be negative\", \"NUMERIC_FAULT\", {\n fault: \"overflow\", operation: \"getUint\", value\n });\n return result;\n}\nconst Nibbles = \"0123456789abcdef\";\n/*\n * Converts %%value%% to a BigInt. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data.\n */\nexport function toBigInt(value) {\n if (value instanceof Uint8Array) {\n let result = \"0x0\";\n for (const v of value) {\n result += Nibbles[v >> 4];\n result += Nibbles[v & 0x0f];\n }\n return BigInt(result);\n }\n return getBigInt(value);\n}\n/**\n * Gets a //number// from %%value%%. If it is an invalid value for\n * a //number//, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getNumber(value, name) {\n switch (typeof (value)) {\n case \"bigint\":\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return Number(value);\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return value;\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n return getNumber(BigInt(value), name);\n }\n catch (e) {\n assertArgument(false, `invalid numeric string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid numeric value\", name || \"value\", value);\n}\n/**\n * Converts %%value%% to a number. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data. Throws if the value is not safe.\n */\nexport function toNumber(value) {\n return getNumber(toBigInt(value));\n}\n/**\n * Converts %%value%% to a Big Endian hexstring, optionally padded to\n * %%width%% bytes.\n */\nexport function toBeHex(_value, _width) {\n const value = getUint(_value, \"value\");\n let result = value.toString(16);\n if (_width == null) {\n // Ensure the value is of even length\n if (result.length % 2) {\n result = \"0\" + result;\n }\n }\n else {\n const width = getNumber(_width, \"width\");\n assert(width * 2 >= result.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeHex\",\n fault: \"overflow\",\n value: _value\n });\n // Pad the value to the required width\n while (result.length < (width * 2)) {\n result = \"0\" + result;\n }\n }\n return \"0x\" + result;\n}\n/**\n * Converts %%value%% to a Big Endian Uint8Array.\n */\nexport function toBeArray(_value) {\n const value = getUint(_value, \"value\");\n if (value === BN_0) {\n return new Uint8Array([]);\n }\n let hex = value.toString(16);\n if (hex.length % 2) {\n hex = \"0\" + hex;\n }\n const result = new Uint8Array(hex.length / 2);\n for (let i = 0; i < result.length; i++) {\n const offset = i * 2;\n result[i] = parseInt(hex.substring(offset, offset + 2), 16);\n }\n return result;\n}\n/**\n * Returns a [[HexString]] for %%value%% safe to use as a //Quantity//.\n *\n * A //Quantity// does not have and leading 0 values unless the value is\n * the literal value `0x0`. This is most commonly used for JSSON-RPC\n * numeric values.\n */\nexport function toQuantity(value) {\n let result = hexlify(isBytesLike(value) ? value : toBeArray(value)).substring(2);\n while (result.startsWith(\"0\")) {\n result = result.substring(1);\n }\n if (result === \"\") {\n result = \"0\";\n }\n return \"0x\" + result;\n}\n//# sourceMappingURL=maths.js.map","/**\n * The [Base58 Encoding](link-base58) scheme allows a **numeric** value\n * to be encoded as a compact string using a radix of 58 using only\n * alpha-numeric characters. Confusingly similar characters are omitted\n * (i.e. ``\"l0O\"``).\n *\n * Note that Base58 encodes a **numeric** value, not arbitrary bytes,\n * since any zero-bytes on the left would get removed. To mitigate this\n * issue most schemes that use Base58 choose specific high-order values\n * to ensure non-zero prefixes.\n *\n * @_subsection: api/utils:Base58 Encoding [about-base58]\n */\nimport { getBytes } from \"./data.js\";\nimport { assertArgument } from \"./errors.js\";\nimport { toBigInt } from \"./maths.js\";\nconst Alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\nlet Lookup = null;\nfunction getAlpha(letter) {\n if (Lookup == null) {\n Lookup = {};\n for (let i = 0; i < Alphabet.length; i++) {\n Lookup[Alphabet[i]] = BigInt(i);\n }\n }\n const result = Lookup[letter];\n assertArgument(result != null, `invalid base58 value`, \"letter\", letter);\n return result;\n}\nconst BN_0 = BigInt(0);\nconst BN_58 = BigInt(58);\n/**\n * Encode %%value%% as a Base58-encoded string.\n */\nexport function encodeBase58(_value) {\n const bytes = getBytes(_value);\n let value = toBigInt(bytes);\n let result = \"\";\n while (value) {\n result = Alphabet[Number(value % BN_58)] + result;\n value /= BN_58;\n }\n // Account for leading padding zeros\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i]) {\n break;\n }\n result = Alphabet[0] + result;\n }\n return result;\n}\n/**\n * Decode the Base58-encoded %%value%%.\n */\nexport function decodeBase58(value) {\n let result = BN_0;\n for (let i = 0; i < value.length; i++) {\n result *= BN_58;\n result += getAlpha(value[i]);\n }\n return result;\n}\n//# sourceMappingURL=base58.js.map","// utils/base64-browser\nimport { getBytes } from \"./data.js\";\nexport function decodeBase64(textData) {\n textData = atob(textData);\n const data = new Uint8Array(textData.length);\n for (let i = 0; i < textData.length; i++) {\n data[i] = textData.charCodeAt(i);\n }\n return getBytes(data);\n}\nexport function encodeBase64(_data) {\n const data = getBytes(_data);\n let textData = \"\";\n for (let i = 0; i < data.length; i++) {\n textData += String.fromCharCode(data[i]);\n }\n return btoa(textData);\n}\n//# sourceMappingURL=base64-browser.js.map","/**\n * Events allow for applications to use the observer pattern, which\n * allows subscribing and publishing events, outside the normal\n * execution paths.\n *\n * @_section api/utils/events:Events [about-events]\n */\nimport { defineProperties } from \"./properties.js\";\n/**\n * When an [[EventEmitterable]] triggers a [[Listener]], the\n * callback always ahas one additional argument passed, which is\n * an **EventPayload**.\n */\nexport class EventPayload {\n /**\n * The event filter.\n */\n filter;\n /**\n * The **EventEmitterable**.\n */\n emitter;\n #listener;\n /**\n * Create a new **EventPayload** for %%emitter%% with\n * the %%listener%% and for %%filter%%.\n */\n constructor(emitter, listener, filter) {\n this.#listener = listener;\n defineProperties(this, { emitter, filter });\n }\n /**\n * Unregister the triggered listener for future events.\n */\n async removeListener() {\n if (this.#listener == null) {\n return;\n }\n await this.emitter.off(this.filter, this.#listener);\n }\n}\n//# sourceMappingURL=events.js.map","/**\n * Using strings in Ethereum (or any security-basd system) requires\n * additional care. These utilities attempt to mitigate some of the\n * safety issues as well as provide the ability to recover and analyse\n * strings.\n *\n * @_subsection api/utils:Strings and UTF-8 [about-strings]\n */\nimport { getBytes } from \"./data.js\";\nimport { assertArgument, assertNormalize } from \"./errors.js\";\nfunction errorFunc(reason, offset, bytes, output, badCodepoint) {\n assertArgument(false, `invalid codepoint at offset ${offset}; ${reason}`, \"bytes\", bytes);\n}\nfunction ignoreFunc(reason, offset, bytes, output, badCodepoint) {\n // If there is an invalid prefix (including stray continuation), skip any additional continuation bytes\n if (reason === \"BAD_PREFIX\" || reason === \"UNEXPECTED_CONTINUE\") {\n let i = 0;\n for (let o = offset + 1; o < bytes.length; o++) {\n if (bytes[o] >> 6 !== 0x02) {\n break;\n }\n i++;\n }\n return i;\n }\n // This byte runs us past the end of the string, so just jump to the end\n // (but the first byte was read already read and therefore skipped)\n if (reason === \"OVERRUN\") {\n return bytes.length - offset - 1;\n }\n // Nothing to skip\n return 0;\n}\nfunction replaceFunc(reason, offset, bytes, output, badCodepoint) {\n // Overlong representations are otherwise \"valid\" code points; just non-deistingtished\n if (reason === \"OVERLONG\") {\n assertArgument(typeof (badCodepoint) === \"number\", \"invalid bad code point for replacement\", \"badCodepoint\", badCodepoint);\n output.push(badCodepoint);\n return 0;\n }\n // Put the replacement character into the output\n output.push(0xfffd);\n // Otherwise, process as if ignoring errors\n return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n}\n/**\n * A handful of popular, built-in UTF-8 error handling strategies.\n *\n * **``\"error\"``** - throws on ANY illegal UTF-8 sequence or\n * non-canonical (overlong) codepoints (this is the default)\n *\n * **``\"ignore\"``** - silently drops any illegal UTF-8 sequence\n * and accepts non-canonical (overlong) codepoints\n *\n * **``\"replace\"``** - replace any illegal UTF-8 sequence with the\n * UTF-8 replacement character (i.e. ``\"\\\\ufffd\"``) and accepts\n * non-canonical (overlong) codepoints\n *\n * @returns: Record<\"error\" | \"ignore\" | \"replace\", Utf8ErrorFunc>\n */\nexport const Utf8ErrorFuncs = Object.freeze({\n error: errorFunc,\n ignore: ignoreFunc,\n replace: replaceFunc\n});\n// http://stackoverflow.com/questions/13356493/decode-utf-8-with-javascript#13691499\nfunction getUtf8CodePoints(_bytes, onError) {\n if (onError == null) {\n onError = Utf8ErrorFuncs.error;\n }\n const bytes = getBytes(_bytes, \"bytes\");\n const result = [];\n let i = 0;\n // Invalid bytes are ignored\n while (i < bytes.length) {\n const c = bytes[i++];\n // 0xxx xxxx\n if (c >> 7 === 0) {\n result.push(c);\n continue;\n }\n // Multibyte; how many bytes left for this character?\n let extraLength = null;\n let overlongMask = null;\n // 110x xxxx 10xx xxxx\n if ((c & 0xe0) === 0xc0) {\n extraLength = 1;\n overlongMask = 0x7f;\n // 1110 xxxx 10xx xxxx 10xx xxxx\n }\n else if ((c & 0xf0) === 0xe0) {\n extraLength = 2;\n overlongMask = 0x7ff;\n // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx\n }\n else if ((c & 0xf8) === 0xf0) {\n extraLength = 3;\n overlongMask = 0xffff;\n }\n else {\n if ((c & 0xc0) === 0x80) {\n i += onError(\"UNEXPECTED_CONTINUE\", i - 1, bytes, result);\n }\n else {\n i += onError(\"BAD_PREFIX\", i - 1, bytes, result);\n }\n continue;\n }\n // Do we have enough bytes in our data?\n if (i - 1 + extraLength >= bytes.length) {\n i += onError(\"OVERRUN\", i - 1, bytes, result);\n continue;\n }\n // Remove the length prefix from the char\n let res = c & ((1 << (8 - extraLength - 1)) - 1);\n for (let j = 0; j < extraLength; j++) {\n let nextChar = bytes[i];\n // Invalid continuation byte\n if ((nextChar & 0xc0) != 0x80) {\n i += onError(\"MISSING_CONTINUE\", i, bytes, result);\n res = null;\n break;\n }\n ;\n res = (res << 6) | (nextChar & 0x3f);\n i++;\n }\n // See above loop for invalid continuation byte\n if (res === null) {\n continue;\n }\n // Maximum code point\n if (res > 0x10ffff) {\n i += onError(\"OUT_OF_RANGE\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n // Reserved for UTF-16 surrogate halves\n if (res >= 0xd800 && res <= 0xdfff) {\n i += onError(\"UTF16_SURROGATE\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n // Check for overlong sequences (more bytes than needed)\n if (res <= overlongMask) {\n i += onError(\"OVERLONG\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n result.push(res);\n }\n return result;\n}\n// http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array\n/**\n * Returns the UTF-8 byte representation of %%str%%.\n *\n * If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8Bytes(str, form) {\n assertArgument(typeof (str) === \"string\", \"invalid string value\", \"str\", str);\n if (form != null) {\n assertNormalize(form);\n str = str.normalize(form);\n }\n let result = [];\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x80) {\n result.push(c);\n }\n else if (c < 0x800) {\n result.push((c >> 6) | 0xc0);\n result.push((c & 0x3f) | 0x80);\n }\n else if ((c & 0xfc00) == 0xd800) {\n i++;\n const c2 = str.charCodeAt(i);\n assertArgument(i < str.length && ((c2 & 0xfc00) === 0xdc00), \"invalid surrogate pair\", \"str\", str);\n // Surrogate Pair\n const pair = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);\n result.push((pair >> 18) | 0xf0);\n result.push(((pair >> 12) & 0x3f) | 0x80);\n result.push(((pair >> 6) & 0x3f) | 0x80);\n result.push((pair & 0x3f) | 0x80);\n }\n else {\n result.push((c >> 12) | 0xe0);\n result.push(((c >> 6) & 0x3f) | 0x80);\n result.push((c & 0x3f) | 0x80);\n }\n }\n return new Uint8Array(result);\n}\n;\n//export \nfunction _toUtf8String(codePoints) {\n return codePoints.map((codePoint) => {\n if (codePoint <= 0xffff) {\n return String.fromCharCode(codePoint);\n }\n codePoint -= 0x10000;\n return String.fromCharCode((((codePoint >> 10) & 0x3ff) + 0xd800), ((codePoint & 0x3ff) + 0xdc00));\n }).join(\"\");\n}\n/**\n * Returns the string represented by the UTF-8 data %%bytes%%.\n *\n * When %%onError%% function is specified, it is called on UTF-8\n * errors allowing recovery using the [[Utf8ErrorFunc]] API.\n * (default: [error](Utf8ErrorFuncs))\n */\nexport function toUtf8String(bytes, onError) {\n return _toUtf8String(getUtf8CodePoints(bytes, onError));\n}\n/**\n * Returns the UTF-8 code-points for %%str%%.\n *\n * If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8CodePoints(str, form) {\n return getUtf8CodePoints(toUtf8Bytes(str, form));\n}\n//# sourceMappingURL=utf8.js.map","import { assert, makeError } from \"./errors.js\";\nexport function createGetUrl(options) {\n async function getUrl(req, _signal) {\n assert(_signal == null || !_signal.cancelled, \"request cancelled before sending\", \"CANCELLED\");\n const protocol = req.url.split(\":\")[0].toLowerCase();\n assert(protocol === \"http\" || protocol === \"https\", `unsupported protocol ${protocol}`, \"UNSUPPORTED_OPERATION\", {\n info: { protocol },\n operation: \"request\"\n });\n assert(protocol === \"https\" || !req.credentials || req.allowInsecureAuthentication, \"insecure authorized connections unsupported\", \"UNSUPPORTED_OPERATION\", {\n operation: \"request\"\n });\n let error = null;\n const controller = new AbortController();\n const timer = setTimeout(() => {\n error = makeError(\"request timeout\", \"TIMEOUT\");\n controller.abort();\n }, req.timeout);\n if (_signal) {\n _signal.addListener(() => {\n error = makeError(\"request cancelled\", \"CANCELLED\");\n controller.abort();\n });\n }\n const init = Object.assign({}, options, {\n method: req.method,\n headers: new Headers(Array.from(req)),\n body: req.body || undefined,\n signal: controller.signal\n });\n let resp;\n try {\n resp = await fetch(req.url, init);\n }\n catch (_error) {\n clearTimeout(timer);\n if (error) {\n throw error;\n }\n throw _error;\n }\n clearTimeout(timer);\n const headers = {};\n resp.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const respBody = await resp.arrayBuffer();\n const body = (respBody == null) ? null : new Uint8Array(respBody);\n return {\n statusCode: resp.status,\n statusMessage: resp.statusText,\n headers, body\n };\n }\n return getUrl;\n}\n// @TODO: remove in v7; provided for backwards compat\nconst defaultGetUrl = createGetUrl({});\nexport async function getUrl(req, _signal) {\n return defaultGetUrl(req, _signal);\n}\n//# sourceMappingURL=geturl-browser.js.map","/**\n * Fetching content from the web is environment-specific, so Ethers\n * provides an abstraction that each environment can implement to provide\n * this service.\n *\n * On [Node.js](link-node), the ``http`` and ``https`` libs are used to\n * create a request object, register event listeners and process data\n * and populate the [[FetchResponse]].\n *\n * In a browser, the [DOM fetch](link-js-fetch) is used, and the resulting\n * ``Promise`` is waited on to retrieve the payload.\n *\n * The [[FetchRequest]] is responsible for handling many common situations,\n * such as redirects, server throttling, authentication, etc.\n *\n * It also handles common gateways, such as IPFS and data URIs.\n *\n * @_section api/utils/fetching:Fetching Web Content [about-fetch]\n */\nimport { decodeBase64, encodeBase64 } from \"./base64.js\";\nimport { hexlify } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nimport { defineProperties } from \"./properties.js\";\nimport { toUtf8Bytes, toUtf8String } from \"./utf8.js\";\nimport { createGetUrl } from \"./geturl.js\";\nconst MAX_ATTEMPTS = 12;\nconst SLOT_INTERVAL = 250;\n// The global FetchGetUrlFunc implementation.\nlet defaultGetUrlFunc = createGetUrl();\nconst reData = new RegExp(\"^data:([^;:]*)?(;base64)?,(.*)$\", \"i\");\nconst reIpfs = new RegExp(\"^ipfs:/\\/(ipfs/)?(.*)$\", \"i\");\n// If locked, new Gateways cannot be added\nlet locked = false;\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs\nasync function dataGatewayFunc(url, signal) {\n try {\n const match = url.match(reData);\n if (!match) {\n throw new Error(\"invalid data\");\n }\n return new FetchResponse(200, \"OK\", {\n \"content-type\": (match[1] || \"text/plain\"),\n }, (match[2] ? decodeBase64(match[3]) : unpercent(match[3])));\n }\n catch (error) {\n return new FetchResponse(599, \"BAD REQUEST (invalid data: URI)\", {}, null, new FetchRequest(url));\n }\n}\n/**\n * Returns a [[FetchGatewayFunc]] for fetching content from a standard\n * IPFS gateway hosted at %%baseUrl%%.\n */\nfunction getIpfsGatewayFunc(baseUrl) {\n async function gatewayIpfs(url, signal) {\n try {\n const match = url.match(reIpfs);\n if (!match) {\n throw new Error(\"invalid link\");\n }\n return new FetchRequest(`${baseUrl}${match[2]}`);\n }\n catch (error) {\n return new FetchResponse(599, \"BAD REQUEST (invalid IPFS URI)\", {}, null, new FetchRequest(url));\n }\n }\n return gatewayIpfs;\n}\nconst Gateways = {\n \"data\": dataGatewayFunc,\n \"ipfs\": getIpfsGatewayFunc(\"https:/\\/gateway.ipfs.io/ipfs/\")\n};\nconst fetchSignals = new WeakMap();\n/**\n * @_ignore\n */\nexport class FetchCancelSignal {\n #listeners;\n #cancelled;\n constructor(request) {\n this.#listeners = [];\n this.#cancelled = false;\n fetchSignals.set(request, () => {\n if (this.#cancelled) {\n return;\n }\n this.#cancelled = true;\n for (const listener of this.#listeners) {\n setTimeout(() => { listener(); }, 0);\n }\n this.#listeners = [];\n });\n }\n addListener(listener) {\n assert(!this.#cancelled, \"singal already cancelled\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fetchCancelSignal.addCancelListener\"\n });\n this.#listeners.push(listener);\n }\n get cancelled() { return this.#cancelled; }\n checkSignal() {\n assert(!this.cancelled, \"cancelled\", \"CANCELLED\", {});\n }\n}\n// Check the signal, throwing if it is cancelled\nfunction checkSignal(signal) {\n if (signal == null) {\n throw new Error(\"missing signal; should not happen\");\n }\n signal.checkSignal();\n return signal;\n}\n/**\n * Represents a request for a resource using a URI.\n *\n * By default, the supported schemes are ``HTTP``, ``HTTPS``, ``data:``,\n * and ``IPFS:``.\n *\n * Additional schemes can be added globally using [[registerGateway]].\n *\n * @example:\n * req = new FetchRequest(\"https://www.ricmoo.com\")\n * resp = await req.send()\n * resp.body.length\n * //_result:\n */\nexport class FetchRequest {\n #allowInsecure;\n #gzip;\n #headers;\n #method;\n #timeout;\n #url;\n #body;\n #bodyType;\n #creds;\n // Hooks\n #preflight;\n #process;\n #retry;\n #signal;\n #throttle;\n #getUrlFunc;\n /**\n * The fetch URL to request.\n */\n get url() { return this.#url; }\n set url(url) {\n this.#url = String(url);\n }\n /**\n * The fetch body, if any, to send as the request body. //(default: null)//\n *\n * When setting a body, the intrinsic ``Content-Type`` is automatically\n * set and will be used if **not overridden** by setting a custom\n * header.\n *\n * If %%body%% is null, the body is cleared (along with the\n * intrinsic ``Content-Type``).\n *\n * If %%body%% is a string, the intrinsic ``Content-Type`` is set to\n * ``text/plain``.\n *\n * If %%body%% is a Uint8Array, the intrinsic ``Content-Type`` is set to\n * ``application/octet-stream``.\n *\n * If %%body%% is any other object, the intrinsic ``Content-Type`` is\n * set to ``application/json``.\n */\n get body() {\n if (this.#body == null) {\n return null;\n }\n return new Uint8Array(this.#body);\n }\n set body(body) {\n if (body == null) {\n this.#body = undefined;\n this.#bodyType = undefined;\n }\n else if (typeof (body) === \"string\") {\n this.#body = toUtf8Bytes(body);\n this.#bodyType = \"text/plain\";\n }\n else if (body instanceof Uint8Array) {\n this.#body = body;\n this.#bodyType = \"application/octet-stream\";\n }\n else if (typeof (body) === \"object\") {\n this.#body = toUtf8Bytes(JSON.stringify(body));\n this.#bodyType = \"application/json\";\n }\n else {\n throw new Error(\"invalid body\");\n }\n }\n /**\n * Returns true if the request has a body.\n */\n hasBody() {\n return (this.#body != null);\n }\n /**\n * The HTTP method to use when requesting the URI. If no method\n * has been explicitly set, then ``GET`` is used if the body is\n * null and ``POST`` otherwise.\n */\n get method() {\n if (this.#method) {\n return this.#method;\n }\n if (this.hasBody()) {\n return \"POST\";\n }\n return \"GET\";\n }\n set method(method) {\n if (method == null) {\n method = \"\";\n }\n this.#method = String(method).toUpperCase();\n }\n /**\n * The headers that will be used when requesting the URI. All\n * keys are lower-case.\n *\n * This object is a copy, so any changes will **NOT** be reflected\n * in the ``FetchRequest``.\n *\n * To set a header entry, use the ``setHeader`` method.\n */\n get headers() {\n const headers = Object.assign({}, this.#headers);\n if (this.#creds) {\n headers[\"authorization\"] = `Basic ${encodeBase64(toUtf8Bytes(this.#creds))}`;\n }\n ;\n if (this.allowGzip) {\n headers[\"accept-encoding\"] = \"gzip\";\n }\n if (headers[\"content-type\"] == null && this.#bodyType) {\n headers[\"content-type\"] = this.#bodyType;\n }\n if (this.body) {\n headers[\"content-length\"] = String(this.body.length);\n }\n return headers;\n }\n /**\n * Get the header for %%key%%, ignoring case.\n */\n getHeader(key) {\n return this.headers[key.toLowerCase()];\n }\n /**\n * Set the header for %%key%% to %%value%%. All values are coerced\n * to a string.\n */\n setHeader(key, value) {\n this.#headers[String(key).toLowerCase()] = String(value);\n }\n /**\n * Clear all headers, resetting all intrinsic headers.\n */\n clearHeaders() {\n this.#headers = {};\n }\n [Symbol.iterator]() {\n const headers = this.headers;\n const keys = Object.keys(headers);\n let index = 0;\n return {\n next: () => {\n if (index < keys.length) {\n const key = keys[index++];\n return {\n value: [key, headers[key]], done: false\n };\n }\n return { value: undefined, done: true };\n }\n };\n }\n /**\n * The value that will be sent for the ``Authorization`` header.\n *\n * To set the credentials, use the ``setCredentials`` method.\n */\n get credentials() {\n return this.#creds || null;\n }\n /**\n * Sets an ``Authorization`` for %%username%% with %%password%%.\n */\n setCredentials(username, password) {\n assertArgument(!username.match(/:/), \"invalid basic authentication username\", \"username\", \"[REDACTED]\");\n this.#creds = `${username}:${password}`;\n }\n /**\n * Enable and request gzip-encoded responses. The response will\n * automatically be decompressed. //(default: true)//\n */\n get allowGzip() {\n return this.#gzip;\n }\n set allowGzip(value) {\n this.#gzip = !!value;\n }\n /**\n * Allow ``Authentication`` credentials to be sent over insecure\n * channels. //(default: false)//\n */\n get allowInsecureAuthentication() {\n return !!this.#allowInsecure;\n }\n set allowInsecureAuthentication(value) {\n this.#allowInsecure = !!value;\n }\n /**\n * The timeout (in milliseconds) to wait for a complete response.\n * //(default: 5 minutes)//\n */\n get timeout() { return this.#timeout; }\n set timeout(timeout) {\n assertArgument(timeout >= 0, \"timeout must be non-zero\", \"timeout\", timeout);\n this.#timeout = timeout;\n }\n /**\n * This function is called prior to each request, for example\n * during a redirection or retry in case of server throttling.\n *\n * This offers an opportunity to populate headers or update\n * content before sending a request.\n */\n get preflightFunc() {\n return this.#preflight || null;\n }\n set preflightFunc(preflight) {\n this.#preflight = preflight;\n }\n /**\n * This function is called after each response, offering an\n * opportunity to provide client-level throttling or updating\n * response data.\n *\n * Any error thrown in this causes the ``send()`` to throw.\n *\n * To schedule a retry attempt (assuming the maximum retry limit\n * has not been reached), use [[response.throwThrottleError]].\n */\n get processFunc() {\n return this.#process || null;\n }\n set processFunc(process) {\n this.#process = process;\n }\n /**\n * This function is called on each retry attempt.\n */\n get retryFunc() {\n return this.#retry || null;\n }\n set retryFunc(retry) {\n this.#retry = retry;\n }\n /**\n * This function is called to fetch content from HTTP and\n * HTTPS URLs and is platform specific (e.g. nodejs vs\n * browsers).\n *\n * This is by default the currently registered global getUrl\n * function, which can be changed using [[registerGetUrl]].\n * If this has been set, setting is to ``null`` will cause\n * this FetchRequest (and any future clones) to revert back to\n * using the currently registered global getUrl function.\n *\n * Setting this is generally not necessary, but may be useful\n * for developers that wish to intercept requests or to\n * configurege a proxy or other agent.\n */\n get getUrlFunc() {\n return this.#getUrlFunc || defaultGetUrlFunc;\n }\n set getUrlFunc(value) {\n this.#getUrlFunc = value;\n }\n /**\n * Create a new FetchRequest instance with default values.\n *\n * Once created, each property may be set before issuing a\n * ``.send()`` to make the request.\n */\n constructor(url) {\n this.#url = String(url);\n this.#allowInsecure = false;\n this.#gzip = true;\n this.#headers = {};\n this.#method = \"\";\n this.#timeout = 300000;\n this.#throttle = {\n slotInterval: SLOT_INTERVAL,\n maxAttempts: MAX_ATTEMPTS\n };\n this.#getUrlFunc = null;\n }\n toString() {\n return ``;\n }\n /**\n * Update the throttle parameters used to determine maximum\n * attempts and exponential-backoff properties.\n */\n setThrottleParams(params) {\n if (params.slotInterval != null) {\n this.#throttle.slotInterval = params.slotInterval;\n }\n if (params.maxAttempts != null) {\n this.#throttle.maxAttempts = params.maxAttempts;\n }\n }\n async #send(attempt, expires, delay, _request, _response) {\n if (attempt >= this.#throttle.maxAttempts) {\n return _response.makeServerError(\"exceeded maximum retry limit\");\n }\n assert(getTime() <= expires, \"timeout\", \"TIMEOUT\", {\n operation: \"request.send\", reason: \"timeout\", request: _request\n });\n if (delay > 0) {\n await wait(delay);\n }\n let req = this.clone();\n const scheme = (req.url.split(\":\")[0] || \"\").toLowerCase();\n // Process any Gateways\n if (scheme in Gateways) {\n const result = await Gateways[scheme](req.url, checkSignal(_request.#signal));\n if (result instanceof FetchResponse) {\n let response = result;\n if (this.processFunc) {\n checkSignal(_request.#signal);\n try {\n response = await this.processFunc(req, response);\n }\n catch (error) {\n // Something went wrong during processing; throw a 5xx server error\n if (error.throttle == null || typeof (error.stall) !== \"number\") {\n response.makeServerError(\"error in post-processing function\", error).assertOk();\n }\n // Ignore throttling\n }\n }\n return response;\n }\n req = result;\n }\n // We have a preflight function; update the request\n if (this.preflightFunc) {\n req = await this.preflightFunc(req);\n }\n const resp = await this.getUrlFunc(req, checkSignal(_request.#signal));\n let response = new FetchResponse(resp.statusCode, resp.statusMessage, resp.headers, resp.body, _request);\n if (response.statusCode === 301 || response.statusCode === 302) {\n // Redirect\n try {\n const location = response.headers.location || \"\";\n return req.redirect(location).#send(attempt + 1, expires, 0, _request, response);\n }\n catch (error) { }\n // Things won't get any better on another attempt; abort\n return response;\n }\n else if (response.statusCode === 429) {\n // Throttle\n if (this.retryFunc == null || (await this.retryFunc(req, response, attempt))) {\n const retryAfter = response.headers[\"retry-after\"];\n let delay = this.#throttle.slotInterval * Math.trunc(Math.random() * Math.pow(2, attempt));\n if (typeof (retryAfter) === \"string\" && retryAfter.match(/^[1-9][0-9]*$/)) {\n delay = parseInt(retryAfter);\n }\n return req.clone().#send(attempt + 1, expires, delay, _request, response);\n }\n }\n if (this.processFunc) {\n checkSignal(_request.#signal);\n try {\n response = await this.processFunc(req, response);\n }\n catch (error) {\n // Something went wrong during processing; throw a 5xx server error\n if (error.throttle == null || typeof (error.stall) !== \"number\") {\n response.makeServerError(\"error in post-processing function\", error).assertOk();\n }\n // Throttle\n let delay = this.#throttle.slotInterval * Math.trunc(Math.random() * Math.pow(2, attempt));\n ;\n if (error.stall >= 0) {\n delay = error.stall;\n }\n return req.clone().#send(attempt + 1, expires, delay, _request, response);\n }\n }\n return response;\n }\n /**\n * Resolves to the response by sending the request.\n */\n send() {\n assert(this.#signal == null, \"request already sent\", \"UNSUPPORTED_OPERATION\", { operation: \"fetchRequest.send\" });\n this.#signal = new FetchCancelSignal(this);\n return this.#send(0, getTime() + this.timeout, 0, this, new FetchResponse(0, \"\", {}, null, this));\n }\n /**\n * Cancels the inflight response, causing a ``CANCELLED``\n * error to be rejected from the [[send]].\n */\n cancel() {\n assert(this.#signal != null, \"request has not been sent\", \"UNSUPPORTED_OPERATION\", { operation: \"fetchRequest.cancel\" });\n const signal = fetchSignals.get(this);\n if (!signal) {\n throw new Error(\"missing signal; should not happen\");\n }\n signal();\n }\n /**\n * Returns a new [[FetchRequest]] that represents the redirection\n * to %%location%%.\n */\n redirect(location) {\n // Redirection; for now we only support absolute locations\n const current = this.url.split(\":\")[0].toLowerCase();\n const target = location.split(\":\")[0].toLowerCase();\n // Don't allow redirecting:\n // - non-GET requests\n // - downgrading the security (e.g. https => http)\n // - to non-HTTP (or non-HTTPS) protocols [this could be relaxed?]\n assert(this.method === \"GET\" && (current !== \"https\" || target !== \"http\") && location.match(/^https?:/), `unsupported redirect`, \"UNSUPPORTED_OPERATION\", {\n operation: `redirect(${this.method} ${JSON.stringify(this.url)} => ${JSON.stringify(location)})`\n });\n // Create a copy of this request, with a new URL\n const req = new FetchRequest(location);\n req.method = \"GET\";\n req.allowGzip = this.allowGzip;\n req.timeout = this.timeout;\n req.#headers = Object.assign({}, this.#headers);\n if (this.#body) {\n req.#body = new Uint8Array(this.#body);\n }\n req.#bodyType = this.#bodyType;\n // Do not forward credentials unless on the same domain; only absolute\n //req.allowInsecure = false;\n // paths are currently supported; may want a way to specify to forward?\n //setStore(req.#props, \"creds\", getStore(this.#pros, \"creds\"));\n return req;\n }\n /**\n * Create a new copy of this request.\n */\n clone() {\n const clone = new FetchRequest(this.url);\n // Preserve \"default method\" (i.e. null)\n clone.#method = this.#method;\n // Preserve \"default body\" with type, copying the Uint8Array is present\n if (this.#body) {\n clone.#body = this.#body;\n }\n clone.#bodyType = this.#bodyType;\n // Preserve \"default headers\"\n clone.#headers = Object.assign({}, this.#headers);\n // Credentials is readonly, so we copy internally\n clone.#creds = this.#creds;\n if (this.allowGzip) {\n clone.allowGzip = true;\n }\n clone.timeout = this.timeout;\n if (this.allowInsecureAuthentication) {\n clone.allowInsecureAuthentication = true;\n }\n clone.#preflight = this.#preflight;\n clone.#process = this.#process;\n clone.#retry = this.#retry;\n clone.#throttle = Object.assign({}, this.#throttle);\n clone.#getUrlFunc = this.#getUrlFunc;\n return clone;\n }\n /**\n * Locks all static configuration for gateways and FetchGetUrlFunc\n * registration.\n */\n static lockConfig() {\n locked = true;\n }\n /**\n * Get the current Gateway function for %%scheme%%.\n */\n static getGateway(scheme) {\n return Gateways[scheme.toLowerCase()] || null;\n }\n /**\n * Use the %%func%% when fetching URIs using %%scheme%%.\n *\n * This method affects all requests globally.\n *\n * If [[lockConfig]] has been called, no change is made and this\n * throws.\n */\n static registerGateway(scheme, func) {\n scheme = scheme.toLowerCase();\n if (scheme === \"http\" || scheme === \"https\") {\n throw new Error(`cannot intercept ${scheme}; use registerGetUrl`);\n }\n if (locked) {\n throw new Error(\"gateways locked\");\n }\n Gateways[scheme] = func;\n }\n /**\n * Use %%getUrl%% when fetching URIs over HTTP and HTTPS requests.\n *\n * This method affects all requests globally.\n *\n * If [[lockConfig]] has been called, no change is made and this\n * throws.\n */\n static registerGetUrl(getUrl) {\n if (locked) {\n throw new Error(\"gateways locked\");\n }\n defaultGetUrlFunc = getUrl;\n }\n /**\n * Creates a getUrl function that fetches content from HTTP and\n * HTTPS URLs.\n *\n * The available %%options%% are dependent on the platform\n * implementation of the default getUrl function.\n *\n * This is not generally something that is needed, but is useful\n * when trying to customize simple behaviour when fetching HTTP\n * content.\n */\n static createGetUrlFunc(options) {\n return createGetUrl(options);\n }\n /**\n * Creates a function that can \"fetch\" data URIs.\n *\n * Note that this is automatically done internally to support\n * data URIs, so it is not necessary to register it.\n *\n * This is not generally something that is needed, but may\n * be useful in a wrapper to perfom custom data URI functionality.\n */\n static createDataGateway() {\n return dataGatewayFunc;\n }\n /**\n * Creates a function that will fetch IPFS (unvalidated) from\n * a custom gateway baseUrl.\n *\n * The default IPFS gateway used internally is\n * ``\"https:/\\/gateway.ipfs.io/ipfs/\"``.\n */\n static createIpfsGatewayFunc(baseUrl) {\n return getIpfsGatewayFunc(baseUrl);\n }\n}\n;\n/**\n * The response for a FetchRequest.\n */\nexport class FetchResponse {\n #statusCode;\n #statusMessage;\n #headers;\n #body;\n #request;\n #error;\n toString() {\n return ``;\n }\n /**\n * The response status code.\n */\n get statusCode() { return this.#statusCode; }\n /**\n * The response status message.\n */\n get statusMessage() { return this.#statusMessage; }\n /**\n * The response headers. All keys are lower-case.\n */\n get headers() { return Object.assign({}, this.#headers); }\n /**\n * The response body, or ``null`` if there was no body.\n */\n get body() {\n return (this.#body == null) ? null : new Uint8Array(this.#body);\n }\n /**\n * The response body as a UTF-8 encoded string, or the empty\n * string (i.e. ``\"\"``) if there was no body.\n *\n * An error is thrown if the body is invalid UTF-8 data.\n */\n get bodyText() {\n try {\n return (this.#body == null) ? \"\" : toUtf8String(this.#body);\n }\n catch (error) {\n assert(false, \"response body is not valid UTF-8 data\", \"UNSUPPORTED_OPERATION\", {\n operation: \"bodyText\", info: { response: this }\n });\n }\n }\n /**\n * The response body, decoded as JSON.\n *\n * An error is thrown if the body is invalid JSON-encoded data\n * or if there was no body.\n */\n get bodyJson() {\n try {\n return JSON.parse(this.bodyText);\n }\n catch (error) {\n assert(false, \"response body is not valid JSON\", \"UNSUPPORTED_OPERATION\", {\n operation: \"bodyJson\", info: { response: this }\n });\n }\n }\n [Symbol.iterator]() {\n const headers = this.headers;\n const keys = Object.keys(headers);\n let index = 0;\n return {\n next: () => {\n if (index < keys.length) {\n const key = keys[index++];\n return {\n value: [key, headers[key]], done: false\n };\n }\n return { value: undefined, done: true };\n }\n };\n }\n constructor(statusCode, statusMessage, headers, body, request) {\n this.#statusCode = statusCode;\n this.#statusMessage = statusMessage;\n this.#headers = Object.keys(headers).reduce((accum, k) => {\n accum[k.toLowerCase()] = String(headers[k]);\n return accum;\n }, {});\n this.#body = ((body == null) ? null : new Uint8Array(body));\n this.#request = (request || null);\n this.#error = { message: \"\" };\n }\n /**\n * Return a Response with matching headers and body, but with\n * an error status code (i.e. 599) and %%message%% with an\n * optional %%error%%.\n */\n makeServerError(message, error) {\n let statusMessage;\n if (!message) {\n message = `${this.statusCode} ${this.statusMessage}`;\n statusMessage = `CLIENT ESCALATED SERVER ERROR (${message})`;\n }\n else {\n statusMessage = `CLIENT ESCALATED SERVER ERROR (${this.statusCode} ${this.statusMessage}; ${message})`;\n }\n const response = new FetchResponse(599, statusMessage, this.headers, this.body, this.#request || undefined);\n response.#error = { message, error };\n return response;\n }\n /**\n * If called within a [request.processFunc](FetchRequest-processFunc)\n * call, causes the request to retry as if throttled for %%stall%%\n * milliseconds.\n */\n throwThrottleError(message, stall) {\n if (stall == null) {\n stall = -1;\n }\n else {\n assertArgument(Number.isInteger(stall) && stall >= 0, \"invalid stall timeout\", \"stall\", stall);\n }\n const error = new Error(message || \"throttling requests\");\n defineProperties(error, { stall, throttle: true });\n throw error;\n }\n /**\n * Get the header value for %%key%%, ignoring case.\n */\n getHeader(key) {\n return this.headers[key.toLowerCase()];\n }\n /**\n * Returns true if the response has a body.\n */\n hasBody() {\n return (this.#body != null);\n }\n /**\n * The request made for this response.\n */\n get request() { return this.#request; }\n /**\n * Returns true if this response was a success statusCode.\n */\n ok() {\n return (this.#error.message === \"\" && this.statusCode >= 200 && this.statusCode < 300);\n }\n /**\n * Throws a ``SERVER_ERROR`` if this response is not ok.\n */\n assertOk() {\n if (this.ok()) {\n return;\n }\n let { message, error } = this.#error;\n if (message === \"\") {\n message = `server response ${this.statusCode} ${this.statusMessage}`;\n }\n let requestUrl = null;\n if (this.request) {\n requestUrl = this.request.url;\n }\n let responseBody = null;\n try {\n if (this.#body) {\n responseBody = toUtf8String(this.#body);\n }\n }\n catch (e) { }\n assert(false, message, \"SERVER_ERROR\", {\n request: (this.request || \"unknown request\"), response: this, error,\n info: {\n requestUrl, responseBody,\n responseStatus: `${this.statusCode} ${this.statusMessage}`\n }\n });\n }\n}\nfunction getTime() { return (new Date()).getTime(); }\nfunction unpercent(value) {\n return toUtf8Bytes(value.replace(/%([0-9a-f][0-9a-f])/gi, (all, code) => {\n return String.fromCharCode(parseInt(code, 16));\n }));\n}\nfunction wait(delay) {\n return new Promise((resolve) => setTimeout(resolve, delay));\n}\n//# sourceMappingURL=fetch.js.map","/**\n * The **FixedNumber** class permits using values with decimal places,\n * using fixed-pont math.\n *\n * Fixed-point math is still based on integers under-the-hood, but uses an\n * internal offset to store fractional components below, and each operation\n * corrects for this after each operation.\n *\n * @_section: api/utils/fixed-point-math:Fixed-Point Maths [about-fixed-point-math]\n */\nimport { getBytes } from \"./data.js\";\nimport { assert, assertArgument, assertPrivate } from \"./errors.js\";\nimport { getBigInt, getNumber, fromTwos, mask, toBigInt } from \"./maths.js\";\nimport { defineProperties } from \"./properties.js\";\nconst BN_N1 = BigInt(-1);\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_5 = BigInt(5);\nconst _guard = {};\n// Constant to pull zeros from for multipliers\nlet Zeros = \"0000\";\nwhile (Zeros.length < 80) {\n Zeros += Zeros;\n}\n// Returns a string \"1\" followed by decimal \"0\"s\nfunction getTens(decimals) {\n let result = Zeros;\n while (result.length < decimals) {\n result += result;\n }\n return BigInt(\"1\" + result.substring(0, decimals));\n}\nfunction checkValue(val, format, safeOp) {\n const width = BigInt(format.width);\n if (format.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n }\n else {\n val = -fromTwos(mask(-val, width), width);\n }\n }\n else {\n const limit = (BN_1 << width);\n assert(safeOp == null || (val >= 0 && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n val = (((val % limit) + limit) % limit) & (limit - BN_1);\n }\n return val;\n}\nfunction getFormat(value) {\n if (typeof (value) === \"number\") {\n value = `fixed128x${value}`;\n }\n let signed = true;\n let width = 128;\n let decimals = 18;\n if (typeof (value) === \"string\") {\n // Parse the format string\n if (value === \"fixed\") {\n // defaults...\n }\n else if (value === \"ufixed\") {\n signed = false;\n }\n else {\n const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n assertArgument(match, \"invalid fixed format\", \"format\", value);\n signed = (match[1] !== \"u\");\n width = parseInt(match[2]);\n decimals = parseInt(match[3]);\n }\n }\n else if (value) {\n // Extract the values from the object\n const v = value;\n const check = (key, type, defaultValue) => {\n if (v[key] == null) {\n return defaultValue;\n }\n assertArgument(typeof (v[key]) === type, \"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, v[key]);\n return v[key];\n };\n signed = check(\"signed\", \"boolean\", signed);\n width = check(\"width\", \"number\", width);\n decimals = check(\"decimals\", \"number\", decimals);\n }\n assertArgument((width % 8) === 0, \"invalid FixedNumber width (not byte aligned)\", \"format.width\", width);\n assertArgument(decimals <= 80, \"invalid FixedNumber decimals (too large)\", \"format.decimals\", decimals);\n const name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n return { signed, width, decimals, name };\n}\nfunction toString(val, decimals) {\n let negative = \"\";\n if (val < BN_0) {\n negative = \"-\";\n val *= BN_N1;\n }\n let str = val.toString();\n // No decimal point for whole values\n if (decimals === 0) {\n return (negative + str);\n }\n // Pad out to the whole component (including a whole digit)\n while (str.length <= decimals) {\n str = Zeros + str;\n }\n // Insert the decimal point\n const index = str.length - decimals;\n str = str.substring(0, index) + \".\" + str.substring(index);\n // Trim the whole component (leaving at least one 0)\n while (str[0] === \"0\" && str[1] !== \".\") {\n str = str.substring(1);\n }\n // Trim the decimal component (leaving at least one 0)\n while (str[str.length - 1] === \"0\" && str[str.length - 2] !== \".\") {\n str = str.substring(0, str.length - 1);\n }\n return (negative + str);\n}\n/**\n * A FixedNumber represents a value over its [[FixedFormat]]\n * arithmetic field.\n *\n * A FixedNumber can be used to perform math, losslessly, on\n * values which have decmial places.\n *\n * A FixedNumber has a fixed bit-width to store values in, and stores all\n * values internally by multiplying the value by 10 raised to the power of\n * %%decimals%%.\n *\n * If operations are performed that cause a value to grow too high (close to\n * positive infinity) or too low (close to negative infinity), the value\n * is said to //overflow//.\n *\n * For example, an 8-bit signed value, with 0 decimals may only be within\n * the range ``-128`` to ``127``; so ``-128 - 1`` will overflow and become\n * ``127``. Likewise, ``127 + 1`` will overflow and become ``-127``.\n *\n * Many operation have a normal and //unsafe// variant. The normal variant\n * will throw a [[NumericFaultError]] on any overflow, while the //unsafe//\n * variant will silently allow overflow, corrupting its value value.\n *\n * If operations are performed that cause a value to become too small\n * (close to zero), the value loses precison and is said to //underflow//.\n *\n * For example, a value with 1 decimal place may store a number as small\n * as ``0.1``, but the value of ``0.1 / 2`` is ``0.05``, which cannot fit\n * into 1 decimal place, so underflow occurs which means precision is lost\n * and the value becomes ``0``.\n *\n * Some operations have a normal and //signalling// variant. The normal\n * variant will silently ignore underflow, while the //signalling// variant\n * will thow a [[NumericFaultError]] on underflow.\n */\nexport class FixedNumber {\n /**\n * The specific fixed-point arithmetic field for this value.\n */\n format;\n #format;\n // The actual value (accounting for decimals)\n #val;\n // A base-10 value to multiple values by to maintain the magnitude\n #tens;\n /**\n * This is a property so console.log shows a human-meaningful value.\n *\n * @private\n */\n _value;\n // Use this when changing this file to get some typing info,\n // but then switch to any to mask the internal type\n //constructor(guard: any, value: bigint, format: _FixedFormat) {\n /**\n * @private\n */\n constructor(guard, value, format) {\n assertPrivate(guard, _guard, \"FixedNumber\");\n this.#val = value;\n this.#format = format;\n const _value = toString(value, format.decimals);\n defineProperties(this, { format: format.name, _value });\n this.#tens = getTens(format.decimals);\n }\n /**\n * If true, negative values are permitted, otherwise only\n * positive values and zero are allowed.\n */\n get signed() { return this.#format.signed; }\n /**\n * The number of bits available to store the value.\n */\n get width() { return this.#format.width; }\n /**\n * The number of decimal places in the fixed-point arithment field.\n */\n get decimals() { return this.#format.decimals; }\n /**\n * The value as an integer, based on the smallest unit the\n * [[decimals]] allow.\n */\n get value() { return this.#val; }\n #checkFormat(other) {\n assertArgument(this.format === other.format, \"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n }\n #checkValue(val, safeOp) {\n /*\n const width = BigInt(this.width);\n if (this.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n \n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n } else {\n val = -fromTwos(mask(-val, width), width);\n }\n \n } else {\n const masked = mask(val, width);\n assert(safeOp == null || (val >= 0 && val === masked), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n val = masked;\n }\n */\n val = checkValue(val, this.#format, safeOp);\n return new FixedNumber(_guard, val, this.#format);\n }\n #add(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val + o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%, ignoring overflow.\n */\n addUnsafe(other) { return this.#add(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n add(other) { return this.#add(other, \"add\"); }\n #sub(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val - o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%, ignoring overflow.\n */\n subUnsafe(other) { return this.#sub(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n sub(other) { return this.#sub(other, \"sub\"); }\n #mul(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue((this.#val * o.#val) / this.#tens, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%, ignoring overflow and underflow (precision loss).\n */\n mulUnsafe(other) { return this.#mul(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n mul(other) { return this.#mul(other, \"mul\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs or if underflow (precision loss) occurs.\n */\n mulSignal(other) {\n this.#checkFormat(other);\n const value = this.#val * other.#val;\n assert((value % this.#tens) === BN_0, \"precision lost during signalling mul\", \"NUMERIC_FAULT\", {\n operation: \"mulSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / this.#tens, \"mulSignal\");\n }\n #div(o, safeOp) {\n assert(o.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(o);\n return this.#checkValue((this.#val * this.#tens) / o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n divUnsafe(other) { return this.#div(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n div(other) { return this.#div(other, \"div\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%. A [[NumericFaultError]] is thrown if underflow\n * (precision loss) occurs.\n */\n divSignal(other) {\n assert(other.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(other);\n const value = (this.#val * this.#tens);\n assert((value % other.#val) === BN_0, \"precision lost during signalling div\", \"NUMERIC_FAULT\", {\n operation: \"divSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / other.#val, \"divSignal\");\n }\n /**\n * Returns a comparison result between %%this%% and %%other%%.\n *\n * This is suitable for use in sorting, where ``-1`` implies %%this%%\n * is smaller, ``1`` implies %%this%% is larger and ``0`` implies\n * both are equal.\n */\n cmp(other) {\n let a = this.value, b = other.value;\n // Coerce a and b to the same magnitude\n const delta = this.decimals - other.decimals;\n if (delta > 0) {\n b *= getTens(delta);\n }\n else if (delta < 0) {\n a *= getTens(-delta);\n }\n // Comnpare\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n }\n /**\n * Returns true if %%other%% is equal to %%this%%.\n */\n eq(other) { return this.cmp(other) === 0; }\n /**\n * Returns true if %%other%% is less than to %%this%%.\n */\n lt(other) { return this.cmp(other) < 0; }\n /**\n * Returns true if %%other%% is less than or equal to %%this%%.\n */\n lte(other) { return this.cmp(other) <= 0; }\n /**\n * Returns true if %%other%% is greater than to %%this%%.\n */\n gt(other) { return this.cmp(other) > 0; }\n /**\n * Returns true if %%other%% is greater than or equal to %%this%%.\n */\n gte(other) { return this.cmp(other) >= 0; }\n /**\n * Returns a new [[FixedNumber]] which is the largest **integer**\n * that is less than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n floor() {\n let val = this.#val;\n if (this.#val < BN_0) {\n val -= this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"floor\");\n }\n /**\n * Returns a new [[FixedNumber]] which is the smallest **integer**\n * that is greater than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n ceiling() {\n let val = this.#val;\n if (this.#val > BN_0) {\n val += this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"ceiling\");\n }\n /**\n * Returns a new [[FixedNumber]] with the decimal component\n * rounded up on ties at %%decimals%% places.\n */\n round(decimals) {\n if (decimals == null) {\n decimals = 0;\n }\n // Not enough precision to not already be rounded\n if (decimals >= this.decimals) {\n return this;\n }\n const delta = this.decimals - decimals;\n const bump = BN_5 * getTens(delta - 1);\n let value = this.value + bump;\n const tens = getTens(delta);\n value = (value / tens) * tens;\n checkValue(value, this.#format, \"round\");\n return new FixedNumber(_guard, value, this.#format);\n }\n /**\n * Returns true if %%this%% is equal to ``0``.\n */\n isZero() { return (this.#val === BN_0); }\n /**\n * Returns true if %%this%% is less than ``0``.\n */\n isNegative() { return (this.#val < BN_0); }\n /**\n * Returns the string representation of %%this%%.\n */\n toString() { return this._value; }\n /**\n * Returns a float approximation.\n *\n * Due to IEEE 754 precission (or lack thereof), this function\n * can only return an approximation and most values will contain\n * rounding errors.\n */\n toUnsafeFloat() { return parseFloat(this.toString()); }\n /**\n * Return a new [[FixedNumber]] with the same value but has had\n * its field set to %%format%%.\n *\n * This will throw if the value cannot fit into %%format%%.\n */\n toFormat(format) {\n return FixedNumber.fromString(this.toString(), format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% divided by\n * %%decimal%% places with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% (once adjusted\n * for %%decimals%%) cannot fit in %%format%%, either due to overflow\n * or underflow (precision loss).\n */\n static fromValue(_value, _decimals, _format) {\n const decimals = (_decimals == null) ? 0 : getNumber(_decimals);\n const format = getFormat(_format);\n let value = getBigInt(_value, \"value\");\n const delta = decimals - format.decimals;\n if (delta > 0) {\n const tens = getTens(delta);\n assert((value % tens) === BN_0, \"value loses precision for format\", \"NUMERIC_FAULT\", {\n operation: \"fromValue\", fault: \"underflow\", value: _value\n });\n value /= tens;\n }\n else if (delta < 0) {\n value *= getTens(-delta);\n }\n checkValue(value, format, \"fromValue\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%%, either due to overflow or underflow (precision loss).\n */\n static fromString(_value, _format) {\n const match = _value.match(/^(-?)([0-9]*)\\.?([0-9]*)$/);\n assertArgument(match && (match[2].length + match[3].length) > 0, \"invalid FixedNumber string value\", \"value\", _value);\n const format = getFormat(_format);\n let whole = (match[2] || \"0\"), decimal = (match[3] || \"\");\n // Pad out the decimals\n while (decimal.length < format.decimals) {\n decimal += Zeros;\n }\n // Check precision is safe\n assert(decimal.substring(format.decimals).match(/^0*$/), \"too many decimals for format\", \"NUMERIC_FAULT\", {\n operation: \"fromString\", fault: \"underflow\", value: _value\n });\n // Remove extra padding\n decimal = decimal.substring(0, format.decimals);\n const value = BigInt(match[1] + whole + decimal);\n checkValue(value, format, \"fromString\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] with the big-endian representation\n * %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%% due to overflow.\n */\n static fromBytes(_value, _format) {\n let value = toBigInt(getBytes(_value, \"value\"));\n const format = getFormat(_format);\n if (format.signed) {\n value = fromTwos(value, format.width);\n }\n checkValue(value, format, \"fromBytes\");\n return new FixedNumber(_guard, value, format);\n }\n}\n//const f1 = FixedNumber.fromString(\"12.56\", \"fixed16x2\");\n//const f2 = FixedNumber.fromString(\"0.3\", \"fixed16x2\");\n//console.log(f1.divSignal(f2));\n//const BUMP = FixedNumber.from(\"0.5\");\n//# sourceMappingURL=fixednumber.js.map","//See: https://github.com/ethereum/wiki/wiki/RLP\nimport { hexlify } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nimport { getBytes } from \"./data.js\";\nfunction hexlifyByte(value) {\n let result = value.toString(16);\n while (result.length < 2) {\n result = \"0\" + result;\n }\n return \"0x\" + result;\n}\nfunction unarrayifyInteger(data, offset, length) {\n let result = 0;\n for (let i = 0; i < length; i++) {\n result = (result * 256) + data[offset + i];\n }\n return result;\n}\nfunction _decodeChildren(data, offset, childOffset, length) {\n const result = [];\n while (childOffset < offset + 1 + length) {\n const decoded = _decode(data, childOffset);\n result.push(decoded.result);\n childOffset += decoded.consumed;\n assert(childOffset <= offset + 1 + length, \"child data too short\", \"BUFFER_OVERRUN\", {\n buffer: data, length, offset\n });\n }\n return { consumed: (1 + length), result: result };\n}\n// returns { consumed: number, result: Object }\nfunction _decode(data, offset) {\n assert(data.length !== 0, \"data too short\", \"BUFFER_OVERRUN\", {\n buffer: data, length: 0, offset: 1\n });\n const checkOffset = (offset) => {\n assert(offset <= data.length, \"data short segment too short\", \"BUFFER_OVERRUN\", {\n buffer: data, length: data.length, offset\n });\n };\n // Array with extra length prefix\n if (data[offset] >= 0xf8) {\n const lengthLength = data[offset] - 0xf7;\n checkOffset(offset + 1 + lengthLength);\n const length = unarrayifyInteger(data, offset + 1, lengthLength);\n checkOffset(offset + 1 + lengthLength + length);\n return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length);\n }\n else if (data[offset] >= 0xc0) {\n const length = data[offset] - 0xc0;\n checkOffset(offset + 1 + length);\n return _decodeChildren(data, offset, offset + 1, length);\n }\n else if (data[offset] >= 0xb8) {\n const lengthLength = data[offset] - 0xb7;\n checkOffset(offset + 1 + lengthLength);\n const length = unarrayifyInteger(data, offset + 1, lengthLength);\n checkOffset(offset + 1 + lengthLength + length);\n const result = hexlify(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length));\n return { consumed: (1 + lengthLength + length), result: result };\n }\n else if (data[offset] >= 0x80) {\n const length = data[offset] - 0x80;\n checkOffset(offset + 1 + length);\n const result = hexlify(data.slice(offset + 1, offset + 1 + length));\n return { consumed: (1 + length), result: result };\n }\n return { consumed: 1, result: hexlifyByte(data[offset]) };\n}\n/**\n * Decodes %%data%% into the structured data it represents.\n */\nexport function decodeRlp(_data) {\n const data = getBytes(_data, \"data\");\n const decoded = _decode(data, 0);\n assertArgument(decoded.consumed === data.length, \"unexpected junk after rlp payload\", \"data\", _data);\n return decoded.result;\n}\n//# sourceMappingURL=rlp-decode.js.map","//See: https://github.com/ethereum/wiki/wiki/RLP\nimport { getBytes } from \"./data.js\";\nfunction arrayifyInteger(value) {\n const result = [];\n while (value) {\n result.unshift(value & 0xff);\n value >>= 8;\n }\n return result;\n}\nfunction _encode(object) {\n if (Array.isArray(object)) {\n let payload = [];\n object.forEach(function (child) {\n payload = payload.concat(_encode(child));\n });\n if (payload.length <= 55) {\n payload.unshift(0xc0 + payload.length);\n return payload;\n }\n const length = arrayifyInteger(payload.length);\n length.unshift(0xf7 + length.length);\n return length.concat(payload);\n }\n const data = Array.prototype.slice.call(getBytes(object, \"object\"));\n if (data.length === 1 && data[0] <= 0x7f) {\n return data;\n }\n else if (data.length <= 55) {\n data.unshift(0x80 + data.length);\n return data;\n }\n const length = arrayifyInteger(data.length);\n length.unshift(0xb7 + length.length);\n return length.concat(data);\n}\nconst nibbles = \"0123456789abcdef\";\n/**\n * Encodes %%object%% as an RLP-encoded [[DataHexString]].\n */\nexport function encodeRlp(object) {\n let result = \"0x\";\n for (const v of _encode(object)) {\n result += nibbles[v >> 4];\n result += nibbles[v & 0xf];\n }\n return result;\n}\n//# sourceMappingURL=rlp-encode.js.map","/**\n * Most interactions with Ethereum requires integer values, which use\n * the smallest magnitude unit.\n *\n * For example, imagine dealing with dollars and cents. Since dollars\n * are divisible, non-integer values are possible, such as ``$10.77``.\n * By using the smallest indivisible unit (i.e. cents), the value can\n * be kept as the integer ``1077``.\n *\n * When receiving decimal input from the user (as a decimal string),\n * the value should be converted to an integer and when showing a user\n * a value, the integer value should be converted to a decimal string.\n *\n * This creates a clear distinction, between values to be used by code\n * (integers) and values used for display logic to users (decimals).\n *\n * The native unit in Ethereum, //ether// is divisible to 18 decimal places,\n * where each individual unit is called a //wei//.\n *\n * @_subsection api/utils:Unit Conversion [about-units]\n */\nimport { assertArgument } from \"./errors.js\";\nimport { FixedNumber } from \"./fixednumber.js\";\nimport { getNumber } from \"./maths.js\";\nconst names = [\n \"wei\",\n \"kwei\",\n \"mwei\",\n \"gwei\",\n \"szabo\",\n \"finney\",\n \"ether\",\n];\n/**\n * Converts %%value%% into a //decimal string//, assuming %%unit%% decimal\n * places. The %%unit%% may be the number of decimal places or the name of\n * a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n *\n */\nexport function formatUnits(value, unit) {\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromValue(value, decimals, { decimals, width: 512 }).toString();\n}\n/**\n * Converts the //decimal string// %%value%% to a BigInt, assuming\n * %%unit%% decimal places. The %%unit%% may the number of decimal places\n * or the name of a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n */\nexport function parseUnits(value, unit) {\n assertArgument(typeof (value) === \"string\", \"value must be a string\", \"value\", value);\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromString(value, { decimals, width: 512 }).value;\n}\n/**\n * Converts %%value%% into a //decimal string// using 18 decimal places.\n */\nexport function formatEther(wei) {\n return formatUnits(wei, 18);\n}\n/**\n * Converts the //decimal string// %%ether%% to a BigInt, using 18\n * decimal places.\n */\nexport function parseEther(ether) {\n return parseUnits(ether, 18);\n}\n//# sourceMappingURL=units.js.map","/**\n * Explain UUID and link to RFC here.\n *\n * @_subsection: api/utils:UUID [about-uuid]\n */\nimport { getBytes, hexlify } from \"./data.js\";\n/**\n * Returns the version 4 [[link-uuid]] for the %%randomBytes%%.\n *\n * @see: https://www.ietf.org/rfc/rfc4122.txt (Section 4.4)\n */\nexport function uuidV4(randomBytes) {\n const bytes = getBytes(randomBytes, \"randomBytes\");\n // Section: 4.1.3:\n // - time_hi_and_version[12:16] = 0b0100\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n // Section 4.4\n // - clock_seq_hi_and_reserved[6] = 0b0\n // - clock_seq_hi_and_reserved[7] = 0b1\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const value = hexlify(bytes);\n return [\n value.substring(2, 10),\n value.substring(10, 14),\n value.substring(14, 18),\n value.substring(18, 22),\n value.substring(22, 34),\n ].join(\"-\");\n}\n//# sourceMappingURL=uuid.js.map","import { defineProperties, concat, getBytesCopy, getNumber, hexlify, toBeArray, toBigInt, toNumber, assert, assertArgument\n/*, isError*/\n } from \"../../utils/index.js\";\n/**\n * @_ignore:\n */\nexport const WordSize = 32;\nconst Padding = new Uint8Array(WordSize);\n// Properties used to immediate pass through to the underlying object\n// - `then` is used to detect if an object is a Promise for await\nconst passProperties = [\"then\"];\nconst _guard = {};\nconst resultNames = new WeakMap();\nfunction getNames(result) {\n return resultNames.get(result);\n}\nfunction setNames(result, names) {\n resultNames.set(result, names);\n}\nfunction throwError(name, error) {\n const wrapped = new Error(`deferred error during ABI decoding triggered accessing ${name}`);\n wrapped.error = error;\n throw wrapped;\n}\nfunction toObject(names, items, deep) {\n if (names.indexOf(null) >= 0) {\n return items.map((item, index) => {\n if (item instanceof Result) {\n return toObject(getNames(item), item, deep);\n }\n return item;\n });\n }\n return names.reduce((accum, name, index) => {\n let item = items.getValue(name);\n if (!(name in accum)) {\n if (deep && item instanceof Result) {\n item = toObject(getNames(item), item, deep);\n }\n accum[name] = item;\n }\n return accum;\n }, {});\n}\n/**\n * A [[Result]] is a sub-class of Array, which allows accessing any\n * of its values either positionally by its index or, if keys are\n * provided by its name.\n *\n * @_docloc: api/abi\n */\nexport class Result extends Array {\n // No longer used; but cannot be removed as it will remove the\n // #private field from the .d.ts which may break backwards\n // compatibility\n #names;\n /**\n * @private\n */\n constructor(...args) {\n // To properly sub-class Array so the other built-in\n // functions work, the constructor has to behave fairly\n // well. So, in the event we are created via fromItems()\n // we build the read-only Result object we want, but on\n // any other input, we use the default constructor\n // constructor(guard: any, items: Array, keys?: Array);\n const guard = args[0];\n let items = args[1];\n let names = (args[2] || []).slice();\n let wrap = true;\n if (guard !== _guard) {\n items = args;\n names = [];\n wrap = false;\n }\n // Can't just pass in ...items since an array of length 1\n // is a special case in the super.\n super(items.length);\n items.forEach((item, index) => { this[index] = item; });\n // Find all unique keys\n const nameCounts = names.reduce((accum, name) => {\n if (typeof (name) === \"string\") {\n accum.set(name, (accum.get(name) || 0) + 1);\n }\n return accum;\n }, (new Map()));\n // Remove any key thats not unique\n setNames(this, Object.freeze(items.map((item, index) => {\n const name = names[index];\n if (name != null && nameCounts.get(name) === 1) {\n return name;\n }\n return null;\n })));\n // Dummy operations to prevent TypeScript from complaining\n this.#names = [];\n if (this.#names == null) {\n void (this.#names);\n }\n if (!wrap) {\n return;\n }\n // A wrapped Result is immutable\n Object.freeze(this);\n // Proxy indices and names so we can trap deferred errors\n const proxy = new Proxy(this, {\n get: (target, prop, receiver) => {\n if (typeof (prop) === \"string\") {\n // Index accessor\n if (prop.match(/^[0-9]+$/)) {\n const index = getNumber(prop, \"%index\");\n if (index < 0 || index >= this.length) {\n throw new RangeError(\"out of result range\");\n }\n const item = target[index];\n if (item instanceof Error) {\n throwError(`index ${index}`, item);\n }\n return item;\n }\n // Pass important checks (like `then` for Promise) through\n if (passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n const value = target[prop];\n if (value instanceof Function) {\n // Make sure functions work with private variables\n // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#no_private_property_forwarding\n return function (...args) {\n return value.apply((this === receiver) ? target : this, args);\n };\n }\n else if (!(prop in target)) {\n // Possible name accessor\n return target.getValue.apply((this === receiver) ? target : this, [prop]);\n }\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n setNames(proxy, getNames(this));\n return proxy;\n }\n /**\n * Returns the Result as a normal Array. If %%deep%%, any children\n * which are Result objects are also converted to a normal Array.\n *\n * This will throw if there are any outstanding deferred\n * errors.\n */\n toArray(deep) {\n const result = [];\n this.forEach((item, index) => {\n if (item instanceof Error) {\n throwError(`index ${index}`, item);\n }\n if (deep && item instanceof Result) {\n item = item.toArray(deep);\n }\n result.push(item);\n });\n return result;\n }\n /**\n * Returns the Result as an Object with each name-value pair. If\n * %%deep%%, any children which are Result objects are also\n * converted to an Object.\n *\n * This will throw if any value is unnamed, or if there are\n * any outstanding deferred errors.\n */\n toObject(deep) {\n const names = getNames(this);\n return names.reduce((accum, name, index) => {\n assert(name != null, `value at index ${index} unnamed`, \"UNSUPPORTED_OPERATION\", {\n operation: \"toObject()\"\n });\n return toObject(names, this, deep);\n }, {});\n }\n /**\n * @_ignore\n */\n slice(start, end) {\n if (start == null) {\n start = 0;\n }\n if (start < 0) {\n start += this.length;\n if (start < 0) {\n start = 0;\n }\n }\n if (end == null) {\n end = this.length;\n }\n if (end < 0) {\n end += this.length;\n if (end < 0) {\n end = 0;\n }\n }\n if (end > this.length) {\n end = this.length;\n }\n const _names = getNames(this);\n const result = [], names = [];\n for (let i = start; i < end; i++) {\n result.push(this[i]);\n names.push(_names[i]);\n }\n return new Result(_guard, result, names);\n }\n /**\n * @_ignore\n */\n filter(callback, thisArg) {\n const _names = getNames(this);\n const result = [], names = [];\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n if (item instanceof Error) {\n throwError(`index ${i}`, item);\n }\n if (callback.call(thisArg, item, i, this)) {\n result.push(item);\n names.push(_names[i]);\n }\n }\n return new Result(_guard, result, names);\n }\n /**\n * @_ignore\n */\n map(callback, thisArg) {\n const result = [];\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n if (item instanceof Error) {\n throwError(`index ${i}`, item);\n }\n result.push(callback.call(thisArg, item, i, this));\n }\n return result;\n }\n /**\n * Returns the value for %%name%%.\n *\n * Since it is possible to have a key whose name conflicts with\n * a method on a [[Result]] or its superclass Array, or any\n * JavaScript keyword, this ensures all named values are still\n * accessible by name.\n */\n getValue(name) {\n const index = getNames(this).indexOf(name);\n if (index === -1) {\n return undefined;\n }\n const value = this[index];\n if (value instanceof Error) {\n throwError(`property ${JSON.stringify(name)}`, value.error);\n }\n return value;\n }\n /**\n * Creates a new [[Result]] for %%items%% with each entry\n * also accessible by its corresponding name in %%keys%%.\n */\n static fromItems(items, keys) {\n return new Result(_guard, items, keys);\n }\n}\n/**\n * Returns all errors found in a [[Result]].\n *\n * Since certain errors encountered when creating a [[Result]] do\n * not impact the ability to continue parsing data, they are\n * deferred until they are actually accessed. Hence a faulty string\n * in an Event that is never used does not impact the program flow.\n *\n * However, sometimes it may be useful to access, identify or\n * validate correctness of a [[Result]].\n *\n * @_docloc api/abi\n */\nexport function checkResultErrors(result) {\n // Find the first error (if any)\n const errors = [];\n const checkErrors = function (path, object) {\n if (!Array.isArray(object)) {\n return;\n }\n for (let key in object) {\n const childPath = path.slice();\n childPath.push(key);\n try {\n checkErrors(childPath, object[key]);\n }\n catch (error) {\n errors.push({ path: childPath, error: error });\n }\n }\n };\n checkErrors([], result);\n return errors;\n}\nfunction getValue(value) {\n let bytes = toBeArray(value);\n assert(bytes.length <= WordSize, \"value out-of-bounds\", \"BUFFER_OVERRUN\", { buffer: bytes, length: WordSize, offset: bytes.length });\n if (bytes.length !== WordSize) {\n bytes = getBytesCopy(concat([Padding.slice(bytes.length % WordSize), bytes]));\n }\n return bytes;\n}\n/**\n * @_ignore\n */\nexport class Coder {\n // The coder name:\n // - address, uint256, tuple, array, etc.\n name;\n // The fully expanded type, including composite types:\n // - address, uint256, tuple(address,bytes), uint256[3][4][], etc.\n type;\n // The localName bound in the signature, in this example it is \"baz\":\n // - tuple(address foo, uint bar) baz\n localName;\n // Whether this type is dynamic:\n // - Dynamic: bytes, string, address[], tuple(boolean[]), etc.\n // - Not Dynamic: address, uint256, boolean[3], tuple(address, uint8)\n dynamic;\n constructor(name, type, localName, dynamic) {\n defineProperties(this, { name, type, localName, dynamic }, {\n name: \"string\", type: \"string\", localName: \"string\", dynamic: \"boolean\"\n });\n }\n _throwError(message, value) {\n assertArgument(false, message, this.localName, value);\n }\n}\n/**\n * @_ignore\n */\nexport class Writer {\n // An array of WordSize lengthed objects to concatenation\n #data;\n #dataLength;\n constructor() {\n this.#data = [];\n this.#dataLength = 0;\n }\n get data() {\n return concat(this.#data);\n }\n get length() { return this.#dataLength; }\n #writeData(data) {\n this.#data.push(data);\n this.#dataLength += data.length;\n return data.length;\n }\n appendWriter(writer) {\n return this.#writeData(getBytesCopy(writer.data));\n }\n // Arrayish item; pad on the right to *nearest* WordSize\n writeBytes(value) {\n let bytes = getBytesCopy(value);\n const paddingOffset = bytes.length % WordSize;\n if (paddingOffset) {\n bytes = getBytesCopy(concat([bytes, Padding.slice(paddingOffset)]));\n }\n return this.#writeData(bytes);\n }\n // Numeric item; pad on the left *to* WordSize\n writeValue(value) {\n return this.#writeData(getValue(value));\n }\n // Inserts a numeric place-holder, returning a callback that can\n // be used to asjust the value later\n writeUpdatableValue() {\n const offset = this.#data.length;\n this.#data.push(Padding);\n this.#dataLength += WordSize;\n return (value) => {\n this.#data[offset] = getValue(value);\n };\n }\n}\n/**\n * @_ignore\n */\nexport class Reader {\n // Allows incomplete unpadded data to be read; otherwise an error\n // is raised if attempting to overrun the buffer. This is required\n // to deal with an old Solidity bug, in which event data for\n // external (not public thoguh) was tightly packed.\n allowLoose;\n #data;\n #offset;\n #bytesRead;\n #parent;\n #maxInflation;\n constructor(data, allowLoose, maxInflation) {\n defineProperties(this, { allowLoose: !!allowLoose });\n this.#data = getBytesCopy(data);\n this.#bytesRead = 0;\n this.#parent = null;\n this.#maxInflation = (maxInflation != null) ? maxInflation : 1024;\n this.#offset = 0;\n }\n get data() { return hexlify(this.#data); }\n get dataLength() { return this.#data.length; }\n get consumed() { return this.#offset; }\n get bytes() { return new Uint8Array(this.#data); }\n #incrementBytesRead(count) {\n if (this.#parent) {\n return this.#parent.#incrementBytesRead(count);\n }\n this.#bytesRead += count;\n // Check for excessive inflation (see: #4537)\n assert(this.#maxInflation < 1 || this.#bytesRead <= this.#maxInflation * this.dataLength, `compressed ABI data exceeds inflation ratio of ${this.#maxInflation} ( see: https:/\\/github.com/ethers-io/ethers.js/issues/4537 )`, \"BUFFER_OVERRUN\", {\n buffer: getBytesCopy(this.#data), offset: this.#offset,\n length: count, info: {\n bytesRead: this.#bytesRead,\n dataLength: this.dataLength\n }\n });\n }\n #peekBytes(offset, length, loose) {\n let alignedLength = Math.ceil(length / WordSize) * WordSize;\n if (this.#offset + alignedLength > this.#data.length) {\n if (this.allowLoose && loose && this.#offset + length <= this.#data.length) {\n alignedLength = length;\n }\n else {\n assert(false, \"data out-of-bounds\", \"BUFFER_OVERRUN\", {\n buffer: getBytesCopy(this.#data),\n length: this.#data.length,\n offset: this.#offset + alignedLength\n });\n }\n }\n return this.#data.slice(this.#offset, this.#offset + alignedLength);\n }\n // Create a sub-reader with the same underlying data, but offset\n subReader(offset) {\n const reader = new Reader(this.#data.slice(this.#offset + offset), this.allowLoose, this.#maxInflation);\n reader.#parent = this;\n return reader;\n }\n // Read bytes\n readBytes(length, loose) {\n let bytes = this.#peekBytes(0, length, !!loose);\n this.#incrementBytesRead(length);\n this.#offset += bytes.length;\n // @TODO: Make sure the length..end bytes are all 0?\n return bytes.slice(0, length);\n }\n // Read a numeric values\n readValue() {\n return toBigInt(this.readBytes(WordSize));\n }\n readIndex() {\n return toNumber(this.readBytes(WordSize));\n }\n}\n//# sourceMappingURL=abstract-coder.js.map","function number(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error(`Wrong positive integer: ${n}`);\n}\nfunction bool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`Expected boolean, not ${b}`);\n}\nfunction bytes(b, ...lengths) {\n if (!(b instanceof Uint8Array))\n throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\nfunction hash(hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\nfunction exists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\nfunction output(out, instance) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\nexport { number, bool, bytes, hash, exists, output };\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n//# sourceMappingURL=_assert.js.map","export const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nconst u8a = (a) => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n// Cast array to view\nexport const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE)\n throw new Error('Non little-endian hardware is not supported');\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => { };\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n if (!u8a(data))\n throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n// For runtime check if class implements interface\nexport class Hash {\n // Safe version that clones internal state\n clone() {\n return this._cloneInto();\n }\n}\nconst toStr = {}.toString;\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\nexport function wrapConstructor(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function wrapConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function wrapXOFConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","import { hash as assertHash, bytes as assertBytes, exists as assertExists } from './_assert.js';\nimport { Hash, toBytes } from './utils.js';\n// HMAC (RFC 2104)\nexport class HMAC extends Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n assertHash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n pad.fill(0);\n }\n update(buf) {\n assertExists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n assertExists(this);\n assertBytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n */\nexport const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","import { hash as assertHash, number as assertNumber } from './_assert.js';\nimport { hmac } from './hmac.js';\nimport { createView, toBytes, checkOpts, asyncLoop } from './utils.js';\n// Common prologue and epilogue for sync/async functions\nfunction pbkdf2Init(hash, _password, _salt, _opts) {\n assertHash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n assertNumber(c);\n assertNumber(dkLen);\n assertNumber(asyncTick);\n if (c < 1)\n throw new Error('PBKDF2: iterations (c) should be >= 1');\n const password = toBytes(_password);\n const salt = toBytes(_salt);\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\nfunction pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW)\n prfW.destroy();\n u.fill(0);\n return DK;\n}\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n */\nexport function pbkdf2(hash, password, salt, opts) {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\nexport async function pbkdf2Async(hash, password, salt, opts) {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n//# sourceMappingURL=pbkdf2.js.map","import { exists, output } from './_assert.js';\nimport { Hash, createView, toBytes } from './utils.js';\n// Polyfill for Safari 14\nfunction setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n// Base SHA2 class (RFC 6234)\nexport class SHA2 extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n exists(this);\n const { view, buffer, blockLen } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n exists(this);\n output(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n this.buffer.subarray(pos).fill(0);\n // we have less than padOffset left in buffer, so we cannot put length in current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.length = length;\n to.pos = pos;\n to.finished = finished;\n to.destroyed = destroyed;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n}\n//# sourceMappingURL=_sha2.js.map","import { SHA2 } from './_sha2.js';\nimport { rotr, wrapConstructor } from './utils.js';\n// SHA2-256 need to try 2^128 hashes to execute birthday attack.\n// BTC network is doing 2^67 hashes/sec as per early 2023.\n// Choice: a ? b : c\nconst Chi = (a, b, c) => (a & b) ^ (~a & c);\n// Majority function, true if any two inpust is true\nconst Maj = (a, b, c) => (a & b) ^ (a & c) ^ (b & c);\n// Round constants:\n// first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n// Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):\n// prettier-ignore\nconst IV = /* @__PURE__ */ new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n]);\n// Temporary buffer, not used to store anything between runs\n// Named this way because it matches specification.\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nclass SHA256 extends SHA2 {\n constructor() {\n super(64, 32, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = IV[0] | 0;\n this.B = IV[1] | 0;\n this.C = IV[2] | 0;\n this.D = IV[3] | 0;\n this.E = IV[4] | 0;\n this.F = IV[5] | 0;\n this.G = IV[6] | 0;\n this.H = IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n SHA256_W.fill(0);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n this.buffer.fill(0);\n }\n}\n// Constants from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\nclass SHA224 extends SHA256 {\n constructor() {\n super();\n this.A = 0xc1059ed8 | 0;\n this.B = 0x367cd507 | 0;\n this.C = 0x3070dd17 | 0;\n this.D = 0xf70e5939 | 0;\n this.E = 0xffc00b31 | 0;\n this.F = 0x68581511 | 0;\n this.G = 0x64f98fa7 | 0;\n this.H = 0xbefa4fa4 | 0;\n this.outputLen = 28;\n }\n}\n/**\n * SHA2-256 hash function\n * @param message - data that would be hashed\n */\nexport const sha256 = /* @__PURE__ */ wrapConstructor(() => new SHA256());\nexport const sha224 = /* @__PURE__ */ wrapConstructor(() => new SHA224());\n//# sourceMappingURL=sha256.js.map","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { fromBig, split, toBig, shrSH, shrSL, rotrSH, rotrSL, rotrBH, rotrBL, rotr32H, rotr32L, rotlSH, rotlSL, rotlBH, rotlBL, add, add3L, add3H, add4L, add4H, add5H, add5L, };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","import { SHA2 } from './_sha2.js';\nimport u64 from './_u64.js';\nimport { wrapConstructor } from './utils.js';\n// Round contants (first 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409):\n// prettier-ignore\nconst [SHA512_Kh, SHA512_Kl] = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\n// Temporary buffer, not used to store anything between runs\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends SHA2 {\n constructor() {\n super(128, 64, 16, false);\n // We cannot use array here since array allows indexing by variable which means optimizer/compiler cannot use registers.\n // Also looks cleaner and easier to verify with spec.\n // Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = 0x6a09e667 | 0;\n this.Al = 0xf3bcc908 | 0;\n this.Bh = 0xbb67ae85 | 0;\n this.Bl = 0x84caa73b | 0;\n this.Ch = 0x3c6ef372 | 0;\n this.Cl = 0xfe94f82b | 0;\n this.Dh = 0xa54ff53a | 0;\n this.Dl = 0x5f1d36f1 | 0;\n this.Eh = 0x510e527f | 0;\n this.El = 0xade682d1 | 0;\n this.Fh = 0x9b05688c | 0;\n this.Fl = 0x2b3e6c1f | 0;\n this.Gh = 0x1f83d9ab | 0;\n this.Gl = 0xfb41bd6b | 0;\n this.Hh = 0x5be0cd19 | 0;\n this.Hl = 0x137e2179 | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n SHA512_W_H.fill(0);\n SHA512_W_L.fill(0);\n }\n destroy() {\n this.buffer.fill(0);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nclass SHA512_224 extends SHA512 {\n constructor() {\n super();\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = 0x8c3d37c8 | 0;\n this.Al = 0x19544da2 | 0;\n this.Bh = 0x73e19966 | 0;\n this.Bl = 0x89dcd4d6 | 0;\n this.Ch = 0x1dfab7ae | 0;\n this.Cl = 0x32ff9c82 | 0;\n this.Dh = 0x679dd514 | 0;\n this.Dl = 0x582f9fcf | 0;\n this.Eh = 0x0f6d2b69 | 0;\n this.El = 0x7bd44da8 | 0;\n this.Fh = 0x77e36f73 | 0;\n this.Fl = 0x04c48942 | 0;\n this.Gh = 0x3f9d85a8 | 0;\n this.Gl = 0x6a1d36c8 | 0;\n this.Hh = 0x1112e6ad | 0;\n this.Hl = 0x91d692a1 | 0;\n this.outputLen = 28;\n }\n}\nclass SHA512_256 extends SHA512 {\n constructor() {\n super();\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = 0x22312194 | 0;\n this.Al = 0xfc2bf72c | 0;\n this.Bh = 0x9f555fa3 | 0;\n this.Bl = 0xc84c64c2 | 0;\n this.Ch = 0x2393b86b | 0;\n this.Cl = 0x6f53b151 | 0;\n this.Dh = 0x96387719 | 0;\n this.Dl = 0x5940eabd | 0;\n this.Eh = 0x96283ee2 | 0;\n this.El = 0xa88effe3 | 0;\n this.Fh = 0xbe5e1e25 | 0;\n this.Fl = 0x53863992 | 0;\n this.Gh = 0x2b0199fc | 0;\n this.Gl = 0x2c85b8aa | 0;\n this.Hh = 0x0eb72ddc | 0;\n this.Hl = 0x81c52ca2 | 0;\n this.outputLen = 32;\n }\n}\nclass SHA384 extends SHA512 {\n constructor() {\n super();\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = 0xcbbb9d5d | 0;\n this.Al = 0xc1059ed8 | 0;\n this.Bh = 0x629a292a | 0;\n this.Bl = 0x367cd507 | 0;\n this.Ch = 0x9159015a | 0;\n this.Cl = 0x3070dd17 | 0;\n this.Dh = 0x152fecd8 | 0;\n this.Dl = 0xf70e5939 | 0;\n this.Eh = 0x67332667 | 0;\n this.El = 0xffc00b31 | 0;\n this.Fh = 0x8eb44a87 | 0;\n this.Fl = 0x68581511 | 0;\n this.Gh = 0xdb0c2e0d | 0;\n this.Gl = 0x64f98fa7 | 0;\n this.Hh = 0x47b5481d | 0;\n this.Hl = 0xbefa4fa4 | 0;\n this.outputLen = 48;\n }\n}\nexport const sha512 = /* @__PURE__ */ wrapConstructor(() => new SHA512());\nexport const sha512_224 = /* @__PURE__ */ wrapConstructor(() => new SHA512_224());\nexport const sha512_256 = /* @__PURE__ */ wrapConstructor(() => new SHA512_256());\nexport const sha384 = /* @__PURE__ */ wrapConstructor(() => new SHA384());\n//# sourceMappingURL=sha512.js.map","/* Browser Crypto Shims */\nimport { hmac } from \"@noble/hashes/hmac\";\nimport { pbkdf2 } from \"@noble/hashes/pbkdf2\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { sha512 } from \"@noble/hashes/sha512\";\nimport { assert, assertArgument } from \"../utils/index.js\";\nfunction getGlobal() {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n}\n;\nconst anyGlobal = getGlobal();\nconst crypto = anyGlobal.crypto || anyGlobal.msCrypto;\nexport function createHash(algo) {\n switch (algo) {\n case \"sha256\": return sha256.create();\n case \"sha512\": return sha512.create();\n }\n assertArgument(false, \"invalid hashing algorithm name\", \"algorithm\", algo);\n}\nexport function createHmac(_algo, key) {\n const algo = ({ sha256, sha512 }[_algo]);\n assertArgument(algo != null, \"invalid hmac algorithm\", \"algorithm\", _algo);\n return hmac.create(algo, key);\n}\nexport function pbkdf2Sync(password, salt, iterations, keylen, _algo) {\n const algo = ({ sha256, sha512 }[_algo]);\n assertArgument(algo != null, \"invalid pbkdf2 algorithm\", \"algorithm\", _algo);\n return pbkdf2(algo, password, salt, { c: iterations, dkLen: keylen });\n}\nexport function randomBytes(length) {\n assert(crypto != null, \"platform does not support secure random numbers\", \"UNSUPPORTED_OPERATION\", {\n operation: \"randomBytes\"\n });\n assertArgument(Number.isInteger(length) && length > 0 && length <= 1024, \"invalid length\", \"length\", length);\n const result = new Uint8Array(length);\n crypto.getRandomValues(result);\n return result;\n}\n//# sourceMappingURL=crypto-browser.js.map","/**\n * An **HMAC** enables verification that a given key was used\n * to authenticate a payload.\n *\n * See: [[link-wiki-hmac]]\n *\n * @_subsection: api/crypto:HMAC [about-hmac]\n */\nimport { createHmac } from \"./crypto.js\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _computeHmac = function (algorithm, key, data) {\n return createHmac(algorithm, key).update(data).digest();\n};\nlet __computeHmac = _computeHmac;\n/**\n * Return the HMAC for %%data%% using the %%key%% key with the underlying\n * %%algo%% used for compression.\n *\n * @example:\n * key = id(\"some-secret\")\n *\n * // Compute the HMAC\n * computeHmac(\"sha256\", key, \"0x1337\")\n * //_result:\n *\n * // To compute the HMAC of UTF-8 data, the data must be\n * // converted to UTF-8 bytes\n * computeHmac(\"sha256\", key, toUtf8Bytes(\"Hello World\"))\n * //_result:\n *\n */\nexport function computeHmac(algorithm, _key, _data) {\n const key = getBytes(_key, \"key\");\n const data = getBytes(_data, \"data\");\n return hexlify(__computeHmac(algorithm, key, data));\n}\ncomputeHmac._ = _computeHmac;\ncomputeHmac.lock = function () { locked = true; };\ncomputeHmac.register = function (func) {\n if (locked) {\n throw new Error(\"computeHmac is locked\");\n }\n __computeHmac = func;\n};\nObject.freeze(computeHmac);\n//# sourceMappingURL=hmac.js.map","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport { Hash, u32, toBytes, wrapConstructor, wrapXOFConstructorWithOpts, } from './utils.js';\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\nexport class Keccak extends Hash {\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n this.pos = 0;\n this.posOut = 0;\n this.finished = false;\n this.destroyed = false;\n // Can be passed from user as dkLen\n number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n keccak() {\n keccakP(this.state32, this.rounds);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n exists(this, false);\n bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n output(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\nconst genShake = (suffix, blockLen, outputLen) => wrapXOFConstructorWithOpts((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n//# sourceMappingURL=sha3.js.map","/**\n * Cryptographic hashing functions\n *\n * @_subsection: api/crypto:Hash Functions [about-crypto-hashing]\n */\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _keccak256 = function (data) {\n return keccak_256(data);\n};\nlet __keccak256 = _keccak256;\n/**\n * Compute the cryptographic KECCAK256 hash of %%data%%.\n *\n * The %%data%% **must** be a data representation, to compute the\n * hash of UTF-8 data use the [[id]] function.\n *\n * @returns DataHexstring\n * @example:\n * keccak256(\"0x\")\n * //_result:\n *\n * keccak256(\"0x1337\")\n * //_result:\n *\n * keccak256(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n * // Strings are assumed to be DataHexString, otherwise it will\n * // throw. To hash UTF-8 data, see the note above.\n * keccak256(\"Hello World\")\n * //_error:\n */\nexport function keccak256(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__keccak256(data));\n}\nkeccak256._ = _keccak256;\nkeccak256.lock = function () { locked = true; };\nkeccak256.register = function (func) {\n if (locked) {\n throw new TypeError(\"keccak256 is locked\");\n }\n __keccak256 = func;\n};\nObject.freeze(keccak256);\n//# sourceMappingURL=keccak.js.map","import { SHA2 } from './_sha2.js';\nimport { wrapConstructor } from './utils.js';\n// https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n// https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\nconst Rho = /* @__PURE__ */ new Uint8Array([7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8]);\nconst Id = /* @__PURE__ */ Uint8Array.from({ length: 16 }, (_, i) => i);\nconst Pi = /* @__PURE__ */ Id.map((i) => (9 * i + 5) % 16);\nlet idxL = [Id];\nlet idxR = [Pi];\nfor (let i = 0; i < 4; i++)\n for (let j of [idxL, idxR])\n j.push(j[i].map((k) => Rho[k]));\nconst shifts = /* @__PURE__ */ [\n [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => new Uint8Array(i));\nconst shiftsL = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts[i][j]));\nconst shiftsR = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts[i][j]));\nconst Kl = /* @__PURE__ */ new Uint32Array([\n 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr = /* @__PURE__ */ new Uint32Array([\n 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// The rotate left (circular left shift) operation for uint32\nconst rotl = (word, shift) => (word << shift) | (word >>> (32 - shift));\n// It's called f() in spec.\nfunction f(group, x, y, z) {\n if (group === 0)\n return x ^ y ^ z;\n else if (group === 1)\n return (x & y) | (~x & z);\n else if (group === 2)\n return (x | ~y) ^ z;\n else if (group === 3)\n return (x & z) | (y & ~z);\n else\n return x ^ (y | ~z);\n}\n// Temporary buffer, not used to store anything between runs\nconst BUF = /* @__PURE__ */ new Uint32Array(16);\nexport class RIPEMD160 extends SHA2 {\n constructor() {\n super(64, 20, 8, true);\n this.h0 = 0x67452301 | 0;\n this.h1 = 0xefcdab89 | 0;\n this.h2 = 0x98badcfe | 0;\n this.h3 = 0x10325476 | 0;\n this.h4 = 0xc3d2e1f0 | 0;\n }\n get() {\n const { h0, h1, h2, h3, h4 } = this;\n return [h0, h1, h2, h3, h4];\n }\n set(h0, h1, h2, h3, h4) {\n this.h0 = h0 | 0;\n this.h1 = h1 | 0;\n this.h2 = h2 | 0;\n this.h3 = h3 | 0;\n this.h4 = h4 | 0;\n }\n process(view, offset) {\n for (let i = 0; i < 16; i++, offset += 4)\n BUF[i] = view.getUint32(offset, true);\n // prettier-ignore\n let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el;\n // Instead of iterating 0 to 80, we split it into 5 groups\n // And use the groups in constants, functions, etc. Much simpler\n for (let group = 0; group < 5; group++) {\n const rGroup = 4 - group;\n const hbl = Kl[group], hbr = Kr[group]; // prettier-ignore\n const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n const sl = shiftsL[group], sr = shiftsR[group]; // prettier-ignore\n for (let i = 0; i < 16; i++) {\n const tl = (rotl(al + f(group, bl, cl, dl) + BUF[rl[i]] + hbl, sl[i]) + el) | 0;\n al = el, el = dl, dl = rotl(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n }\n // 2 loops are 10% faster\n for (let i = 0; i < 16; i++) {\n const tr = (rotl(ar + f(rGroup, br, cr, dr) + BUF[rr[i]] + hbr, sr[i]) + er) | 0;\n ar = er, er = dr, dr = rotl(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n }\n }\n // Add the compressed chunk to the current hash value\n this.set((this.h1 + cl + dr) | 0, (this.h2 + dl + er) | 0, (this.h3 + el + ar) | 0, (this.h4 + al + br) | 0, (this.h0 + bl + cr) | 0);\n }\n roundClean() {\n BUF.fill(0);\n }\n destroy() {\n this.destroyed = true;\n this.buffer.fill(0);\n this.set(0, 0, 0, 0, 0);\n }\n}\n/**\n * RIPEMD-160 - a hash function from 1990s.\n * @param message - msg that would be hashed\n */\nexport const ripemd160 = /* @__PURE__ */ wrapConstructor(() => new RIPEMD160());\n//# sourceMappingURL=ripemd160.js.map","import { ripemd160 as noble_ripemd160 } from \"@noble/hashes/ripemd160\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _ripemd160 = function (data) {\n return noble_ripemd160(data);\n};\nlet __ripemd160 = _ripemd160;\n/**\n * Compute the cryptographic RIPEMD-160 hash of %%data%%.\n *\n * @_docloc: api/crypto:Hash Functions\n * @returns DataHexstring\n *\n * @example:\n * ripemd160(\"0x\")\n * //_result:\n *\n * ripemd160(\"0x1337\")\n * //_result:\n *\n * ripemd160(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n */\nexport function ripemd160(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__ripemd160(data));\n}\nripemd160._ = _ripemd160;\nripemd160.lock = function () { locked = true; };\nripemd160.register = function (func) {\n if (locked) {\n throw new TypeError(\"ripemd160 is locked\");\n }\n __ripemd160 = func;\n};\nObject.freeze(ripemd160);\n//# sourceMappingURL=ripemd160.js.map","/**\n * A **Password-Based Key-Derivation Function** is designed to create\n * a sequence of bytes suitible as a **key** from a human-rememberable\n * password.\n *\n * @_subsection: api/crypto:Passwords [about-pbkdf]\n */\nimport { pbkdf2Sync } from \"./crypto.js\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _pbkdf2 = function (password, salt, iterations, keylen, algo) {\n return pbkdf2Sync(password, salt, iterations, keylen, algo);\n};\nlet __pbkdf2 = _pbkdf2;\n/**\n * Return the [[link-pbkdf2]] for %%keylen%% bytes for %%password%% using\n * the %%salt%% and using %%iterations%% of %%algo%%.\n *\n * This PBKDF is outdated and should not be used in new projects, but is\n * required to decrypt older files.\n *\n * @example:\n * // The password must be converted to bytes, and it is generally\n * // best practices to ensure the string has been normalized. Many\n * // formats explicitly indicate the normalization form to use.\n * password = \"hello\"\n * passwordBytes = toUtf8Bytes(password, \"NFKC\")\n *\n * salt = id(\"some-salt\")\n *\n * // Compute the PBKDF2\n * pbkdf2(passwordBytes, salt, 1024, 16, \"sha256\")\n * //_result:\n */\nexport function pbkdf2(_password, _salt, iterations, keylen, algo) {\n const password = getBytes(_password, \"password\");\n const salt = getBytes(_salt, \"salt\");\n return hexlify(__pbkdf2(password, salt, iterations, keylen, algo));\n}\npbkdf2._ = _pbkdf2;\npbkdf2.lock = function () { locked = true; };\npbkdf2.register = function (func) {\n if (locked) {\n throw new Error(\"pbkdf2 is locked\");\n }\n __pbkdf2 = func;\n};\nObject.freeze(pbkdf2);\n//# sourceMappingURL=pbkdf2.js.map","/**\n * A **Cryptographically Secure Random Value** is one that has been\n * generated with additional care take to prevent side-channels\n * from allowing others to detect it and prevent others from through\n * coincidence generate the same values.\n *\n * @_subsection: api/crypto:Random Values [about-crypto-random]\n */\nimport { randomBytes as crypto_random } from \"./crypto.js\";\nlet locked = false;\nconst _randomBytes = function (length) {\n return new Uint8Array(crypto_random(length));\n};\nlet __randomBytes = _randomBytes;\n/**\n * Return %%length%% bytes of cryptographically secure random data.\n *\n * @example:\n * randomBytes(8)\n * //_result:\n */\nexport function randomBytes(length) {\n return __randomBytes(length);\n}\nrandomBytes._ = _randomBytes;\nrandomBytes.lock = function () { locked = true; };\nrandomBytes.register = function (func) {\n if (locked) {\n throw new Error(\"randomBytes is locked\");\n }\n __randomBytes = func;\n};\nObject.freeze(randomBytes);\n//# sourceMappingURL=random.js.map","import { number as assertNumber } from './_assert.js';\nimport { sha256 } from './sha256.js';\nimport { pbkdf2 } from './pbkdf2.js';\nimport { asyncLoop, checkOpts, u32 } from './utils.js';\n// RFC 7914 Scrypt KDF\n// Left rotate for uint32\nconst rotl = (a, b) => (a << b) | (a >>> (32 - b));\n// The main Scrypt loop: uses Salsa extensively.\n// Six versions of the function were tried, this is the fastest one.\n// prettier-ignore\nfunction XorAndSalsa(prev, pi, input, ii, out, oi) {\n // Based on https://cr.yp.to/salsa20.html\n // Xor blocks\n let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++];\n let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++];\n let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++];\n let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++];\n let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++];\n let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++];\n let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++];\n let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++];\n // Save state to temporary variables (salsa)\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n // Main loop (salsa)\n for (let i = 0; i < 8; i += 2) {\n x04 ^= rotl(x00 + x12 | 0, 7);\n x08 ^= rotl(x04 + x00 | 0, 9);\n x12 ^= rotl(x08 + x04 | 0, 13);\n x00 ^= rotl(x12 + x08 | 0, 18);\n x09 ^= rotl(x05 + x01 | 0, 7);\n x13 ^= rotl(x09 + x05 | 0, 9);\n x01 ^= rotl(x13 + x09 | 0, 13);\n x05 ^= rotl(x01 + x13 | 0, 18);\n x14 ^= rotl(x10 + x06 | 0, 7);\n x02 ^= rotl(x14 + x10 | 0, 9);\n x06 ^= rotl(x02 + x14 | 0, 13);\n x10 ^= rotl(x06 + x02 | 0, 18);\n x03 ^= rotl(x15 + x11 | 0, 7);\n x07 ^= rotl(x03 + x15 | 0, 9);\n x11 ^= rotl(x07 + x03 | 0, 13);\n x15 ^= rotl(x11 + x07 | 0, 18);\n x01 ^= rotl(x00 + x03 | 0, 7);\n x02 ^= rotl(x01 + x00 | 0, 9);\n x03 ^= rotl(x02 + x01 | 0, 13);\n x00 ^= rotl(x03 + x02 | 0, 18);\n x06 ^= rotl(x05 + x04 | 0, 7);\n x07 ^= rotl(x06 + x05 | 0, 9);\n x04 ^= rotl(x07 + x06 | 0, 13);\n x05 ^= rotl(x04 + x07 | 0, 18);\n x11 ^= rotl(x10 + x09 | 0, 7);\n x08 ^= rotl(x11 + x10 | 0, 9);\n x09 ^= rotl(x08 + x11 | 0, 13);\n x10 ^= rotl(x09 + x08 | 0, 18);\n x12 ^= rotl(x15 + x14 | 0, 7);\n x13 ^= rotl(x12 + x15 | 0, 9);\n x14 ^= rotl(x13 + x12 | 0, 13);\n x15 ^= rotl(x14 + x13 | 0, 18);\n }\n // Write output (salsa)\n out[oi++] = (y00 + x00) | 0;\n out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0;\n out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0;\n out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0;\n out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0;\n out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0;\n out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0;\n out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0;\n out[oi++] = (y15 + x15) | 0;\n}\nfunction BlockMix(input, ii, out, oi, r) {\n // The block B is r 128-byte chunks (which is equivalent of 2r 64-byte chunks)\n let head = oi + 0;\n let tail = oi + 16 * r;\n for (let i = 0; i < 16; i++)\n out[tail + i] = input[ii + (2 * r - 1) * 16 + i]; // X ← B[2r−1]\n for (let i = 0; i < r; i++, head += 16, ii += 16) {\n // We write odd & even Yi at same time. Even: 0bXXXXX0 Odd: 0bXXXXX1\n XorAndSalsa(out, tail, input, ii, out, head); // head[i] = Salsa(blockIn[2*i] ^ tail[i-1])\n if (i > 0)\n tail += 16; // First iteration overwrites tmp value in tail\n XorAndSalsa(out, head, input, (ii += 16), out, tail); // tail[i] = Salsa(blockIn[2*i+1] ^ head[i])\n }\n}\n// Common prologue and epilogue for sync/async functions\nfunction scryptInit(password, salt, _opts) {\n // Maxmem - 1GB+1KB by default\n const opts = checkOpts({\n dkLen: 32,\n asyncTick: 10,\n maxmem: 1024 ** 3 + 1024,\n }, _opts);\n const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts;\n assertNumber(N);\n assertNumber(r);\n assertNumber(p);\n assertNumber(dkLen);\n assertNumber(asyncTick);\n assertNumber(maxmem);\n if (onProgress !== undefined && typeof onProgress !== 'function')\n throw new Error('progressCb should be function');\n const blockSize = 128 * r;\n const blockSize32 = blockSize / 4;\n if (N <= 1 || (N & (N - 1)) !== 0 || N >= 2 ** (blockSize / 8) || N > 2 ** 32) {\n // NOTE: we limit N to be less than 2**32 because of 32 bit variant of Integrify function\n // There is no JS engines that allows alocate more than 4GB per single Uint8Array for now, but can change in future.\n throw new Error('Scrypt: N must be larger than 1, a power of 2, less than 2^(128 * r / 8) and less than 2^32');\n }\n if (p < 0 || p > ((2 ** 32 - 1) * 32) / blockSize) {\n throw new Error('Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)');\n }\n if (dkLen < 0 || dkLen > (2 ** 32 - 1) * 32) {\n throw new Error('Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32');\n }\n const memUsed = blockSize * (N + p);\n if (memUsed > maxmem) {\n throw new Error(`Scrypt: parameters too large, ${memUsed} (128 * r * (N + p)) > ${maxmem} (maxmem)`);\n }\n // [B0...Bp−1] ← PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor)\n // Since it has only one iteration there is no reason to use async variant\n const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p });\n const B32 = u32(B);\n // Re-used between parallel iterations. Array(iterations) of B\n const V = u32(new Uint8Array(blockSize * N));\n const tmp = u32(new Uint8Array(blockSize));\n let blockMixCb = () => { };\n if (onProgress) {\n const totalBlockMix = 2 * N * p;\n // Invoke callback if progress changes from 10.01 to 10.02\n // Allows to draw smooth progress bar on up to 8K screen\n const callbackPer = Math.max(Math.floor(totalBlockMix / 10000), 1);\n let blockMixCnt = 0;\n blockMixCb = () => {\n blockMixCnt++;\n if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix))\n onProgress(blockMixCnt / totalBlockMix);\n };\n }\n return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick };\n}\nfunction scryptOutput(password, dkLen, B, V, tmp) {\n const res = pbkdf2(sha256, password, B, { c: 1, dkLen });\n B.fill(0);\n V.fill(0);\n tmp.fill(0);\n return res;\n}\n/**\n * Scrypt KDF from RFC 7914.\n * @param password - pass\n * @param salt - salt\n * @param opts - parameters\n * - `N` is cpu/mem work factor (power of 2 e.g. 2**18)\n * - `r` is block size (8 is common), fine-tunes sequential memory read size and performance\n * - `p` is parallelization factor (1 is common)\n * - `dkLen` is output key length in bytes e.g. 32.\n * - `asyncTick` - (default: 10) max time in ms for which async function can block execution\n * - `maxmem` - (default: `1024 ** 3 + 1024` aka 1GB+1KB). A limit that the app could use for scrypt\n * - `onProgress` - callback function that would be executed for progress report\n * @returns Derived key\n */\nexport function scrypt(password, salt, opts) {\n const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(password, salt, opts);\n for (let pi = 0; pi < p; pi++) {\n const Pi = blockSize32 * pi;\n for (let i = 0; i < blockSize32; i++)\n V[i] = B32[Pi + i]; // V[0] = B[i]\n for (let i = 0, pos = 0; i < N - 1; i++) {\n BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);\n blockMixCb();\n }\n BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element\n blockMixCb();\n for (let i = 0; i < N; i++) {\n // First u32 of the last 64-byte block (u32 is LE)\n const j = B32[Pi + blockSize32 - 16] % N; // j = Integrify(X) % iterations\n for (let k = 0; k < blockSize32; k++)\n tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; // tmp = B ^ V[j]\n BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])\n blockMixCb();\n }\n }\n return scryptOutput(password, dkLen, B, V, tmp);\n}\n/**\n * Scrypt KDF from RFC 7914.\n */\nexport async function scryptAsync(password, salt, opts) {\n const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick } = scryptInit(password, salt, opts);\n for (let pi = 0; pi < p; pi++) {\n const Pi = blockSize32 * pi;\n for (let i = 0; i < blockSize32; i++)\n V[i] = B32[Pi + i]; // V[0] = B[i]\n let pos = 0;\n await asyncLoop(N - 1, asyncTick, () => {\n BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);\n blockMixCb();\n });\n BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element\n blockMixCb();\n await asyncLoop(N, asyncTick, () => {\n // First u32 of the last 64-byte block (u32 is LE)\n const j = B32[Pi + blockSize32 - 16] % N; // j = Integrify(X) % iterations\n for (let k = 0; k < blockSize32; k++)\n tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; // tmp = B ^ V[j]\n BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])\n blockMixCb();\n });\n }\n return scryptOutput(password, dkLen, B, V, tmp);\n}\n//# sourceMappingURL=scrypt.js.map","import { scrypt as _nobleSync, scryptAsync as _nobleAsync } from \"@noble/hashes/scrypt\";\nimport { getBytes, hexlify as H } from \"../utils/index.js\";\nlet lockedSync = false, lockedAsync = false;\nconst _scryptAsync = async function (passwd, salt, N, r, p, dkLen, onProgress) {\n return await _nobleAsync(passwd, salt, { N, r, p, dkLen, onProgress });\n};\nconst _scryptSync = function (passwd, salt, N, r, p, dkLen) {\n return _nobleSync(passwd, salt, { N, r, p, dkLen });\n};\nlet __scryptAsync = _scryptAsync;\nlet __scryptSync = _scryptSync;\n/**\n * The [[link-wiki-scrypt]] uses a memory and cpu hard method of\n * derivation to increase the resource cost to brute-force a password\n * for a given key.\n *\n * This means this algorithm is intentionally slow, and can be tuned to\n * become slower. As computation and memory speed improve over time,\n * increasing the difficulty maintains the cost of an attacker.\n *\n * For example, if a target time of 5 seconds is used, a legitimate user\n * which knows their password requires only 5 seconds to unlock their\n * account. A 6 character password has 68 billion possibilities, which\n * would require an attacker to invest over 10,000 years of CPU time. This\n * is of course a crude example (as password generally aren't random),\n * but demonstrates to value of imposing large costs to decryption.\n *\n * For this reason, if building a UI which involved decrypting or\n * encrypting datsa using scrypt, it is recommended to use a\n * [[ProgressCallback]] (as event short periods can seem lik an eternity\n * if the UI freezes). Including the phrase //\"decrypting\"// in the UI\n * can also help, assuring the user their waiting is for a good reason.\n *\n * @_docloc: api/crypto:Passwords\n *\n * @example:\n * // The password must be converted to bytes, and it is generally\n * // best practices to ensure the string has been normalized. Many\n * // formats explicitly indicate the normalization form to use.\n * password = \"hello\"\n * passwordBytes = toUtf8Bytes(password, \"NFKC\")\n *\n * salt = id(\"some-salt\")\n *\n * // Compute the scrypt\n * scrypt(passwordBytes, salt, 1024, 8, 1, 16)\n * //_result:\n */\nexport async function scrypt(_passwd, _salt, N, r, p, dkLen, progress) {\n const passwd = getBytes(_passwd, \"passwd\");\n const salt = getBytes(_salt, \"salt\");\n return H(await __scryptAsync(passwd, salt, N, r, p, dkLen, progress));\n}\nscrypt._ = _scryptAsync;\nscrypt.lock = function () { lockedAsync = true; };\nscrypt.register = function (func) {\n if (lockedAsync) {\n throw new Error(\"scrypt is locked\");\n }\n __scryptAsync = func;\n};\nObject.freeze(scrypt);\n/**\n * Provides a synchronous variant of [[scrypt]].\n *\n * This will completely lock up and freeze the UI in a browser and will\n * prevent any event loop from progressing. For this reason, it is\n * preferred to use the [async variant](scrypt).\n *\n * @_docloc: api/crypto:Passwords\n *\n * @example:\n * // The password must be converted to bytes, and it is generally\n * // best practices to ensure the string has been normalized. Many\n * // formats explicitly indicate the normalization form to use.\n * password = \"hello\"\n * passwordBytes = toUtf8Bytes(password, \"NFKC\")\n *\n * salt = id(\"some-salt\")\n *\n * // Compute the scrypt\n * scryptSync(passwordBytes, salt, 1024, 8, 1, 16)\n * //_result:\n */\nexport function scryptSync(_passwd, _salt, N, r, p, dkLen) {\n const passwd = getBytes(_passwd, \"passwd\");\n const salt = getBytes(_salt, \"salt\");\n return H(__scryptSync(passwd, salt, N, r, p, dkLen));\n}\nscryptSync._ = _scryptSync;\nscryptSync.lock = function () { lockedSync = true; };\nscryptSync.register = function (func) {\n if (lockedSync) {\n throw new Error(\"scryptSync is locked\");\n }\n __scryptSync = func;\n};\nObject.freeze(scryptSync);\n//# sourceMappingURL=scrypt.js.map","import { createHash } from \"./crypto.js\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nconst _sha256 = function (data) {\n return createHash(\"sha256\").update(data).digest();\n};\nconst _sha512 = function (data) {\n return createHash(\"sha512\").update(data).digest();\n};\nlet __sha256 = _sha256;\nlet __sha512 = _sha512;\nlet locked256 = false, locked512 = false;\n/**\n * Compute the cryptographic SHA2-256 hash of %%data%%.\n *\n * @_docloc: api/crypto:Hash Functions\n * @returns DataHexstring\n *\n * @example:\n * sha256(\"0x\")\n * //_result:\n *\n * sha256(\"0x1337\")\n * //_result:\n *\n * sha256(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n */\nexport function sha256(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__sha256(data));\n}\nsha256._ = _sha256;\nsha256.lock = function () { locked256 = true; };\nsha256.register = function (func) {\n if (locked256) {\n throw new Error(\"sha256 is locked\");\n }\n __sha256 = func;\n};\nObject.freeze(sha256);\n/**\n * Compute the cryptographic SHA2-512 hash of %%data%%.\n *\n * @_docloc: api/crypto:Hash Functions\n * @returns DataHexstring\n *\n * @example:\n * sha512(\"0x\")\n * //_result:\n *\n * sha512(\"0x1337\")\n * //_result:\n *\n * sha512(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n */\nexport function sha512(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__sha512(data));\n}\nsha512._ = _sha512;\nsha512.lock = function () { locked512 = true; };\nsha512.register = function (func) {\n if (locked512) {\n throw new Error(\"sha512 is locked\");\n }\n __sha512 = func;\n};\nObject.freeze(sha256);\n//# sourceMappingURL=sha2.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// 100 lines of code in the file are duplicated from noble-hashes (utils).\n// This is OK: `abstract` directory does not use noble-hashes.\n// User may opt-in into using different hashing library. This way, noble-hashes\n// won't be included into their bundle.\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst u8a = (a) => a instanceof Uint8Array;\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\nexport function numberToHexUnpadded(num) {\n const hex = num.toString(16);\n return hex.length & 1 ? `0${hex}` : hex;\n}\nexport function hexToNumber(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // Big Endian\n return BigInt(hex === '' ? '0' : `0x${hex}`);\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes) {\n return hexToNumber(bytesToHex(bytes));\n}\nexport function bytesToNumberLE(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\nexport function numberToBytesBE(n, len) {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n, len) {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n) {\n return hexToBytes(numberToHexUnpadded(n));\n}\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'private key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title, hex, expectedLength) {\n let res;\n if (typeof hex === 'string') {\n try {\n res = hexToBytes(hex);\n }\n catch (e) {\n throw new Error(`${title} must be valid hex string, got \"${hex}\". Cause: ${e}`);\n }\n }\n else if (u8a(hex)) {\n // Uint8Array.from() instead of hash.slice() because node.js Buffer\n // is instance of Uint8Array, and its slice() creates **mutable** copy\n res = Uint8Array.from(hex);\n }\n else {\n throw new Error(`${title} must be hex string or Uint8Array`);\n }\n const len = res.length;\n if (typeof expectedLength === 'number' && len !== expectedLength)\n throw new Error(`${title} expected ${expectedLength} bytes, got ${len}`);\n return res;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\nexport function equalBytes(b1, b2) {\n // We don't care about timing attacks here\n if (b1.length !== b2.length)\n return false;\n for (let i = 0; i < b1.length; i++)\n if (b1[i] !== b2[i])\n return false;\n return true;\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n// Bit operations\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n */\nexport function bitLen(n) {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1)\n ;\n return len;\n}\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n, pos) {\n return (n >> BigInt(pos)) & _1n;\n}\n/**\n * Sets single bit at position.\n */\nexport const bitSet = (n, pos, value) => {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n};\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n) => (_2n << BigInt(n - 1)) - _1n;\n// DRBG\nconst u8n = (data) => new Uint8Array(data); // creates Uint8Array\nconst u8fr = (arr) => Uint8Array.from(arr); // another shortcut\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg(hashLen, qByteLen, hmacFn) {\n if (typeof hashLen !== 'number' || hashLen < 2)\n throw new Error('hashLen must be a number');\n if (typeof qByteLen !== 'number' || qByteLen < 2)\n throw new Error('qByteLen must be a number');\n if (typeof hmacFn !== 'function')\n throw new Error('hmacFn must be a function');\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...b) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n const reseed = (seed = u8n()) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(u8fr([0x00]), seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0)\n return;\n k = h(u8fr([0x01]), seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= 1000)\n throw new Error('drbg: tried 1000 values');\n let len = 0;\n const out = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes(...out);\n };\n const genUntil = (seed, pred) => {\n reset();\n reseed(seed); // Steps D-G\n let res = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen())))\n reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n// Validating curves and fields\nconst validatorFns = {\n bigint: (val) => typeof val === 'bigint',\n function: (val) => typeof val === 'function',\n boolean: (val) => typeof val === 'boolean',\n string: (val) => typeof val === 'string',\n stringOrUint8Array: (val) => typeof val === 'string' || val instanceof Uint8Array,\n isSafeInteger: (val) => Number.isSafeInteger(val),\n array: (val) => Array.isArray(val),\n field: (val, object) => object.Fp.isValid(val),\n hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n};\n// type Record = { [P in K]: T; }\nexport function validateObject(object, validators, optValidators = {}) {\n const checkField = (fieldName, type, isOptional) => {\n const checkVal = validatorFns[type];\n if (typeof checkVal !== 'function')\n throw new Error(`Invalid validator \"${type}\", expected function`);\n const val = object[fieldName];\n if (isOptional && val === undefined)\n return;\n if (!checkVal(val, object)) {\n throw new Error(`Invalid param ${String(fieldName)}=${val} (${typeof val}), expected ${type}`);\n }\n };\n for (const [fieldName, type] of Object.entries(validators))\n checkField(fieldName, type, false);\n for (const [fieldName, type] of Object.entries(optValidators))\n checkField(fieldName, type, true);\n return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n//# sourceMappingURL=utils.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// Utilities for modular arithmetics and finite fields\nimport { bitMask, numberToBytesBE, numberToBytesLE, bytesToNumberBE, bytesToNumberLE, ensureBytes, validateObject, } from './utils.js';\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3);\n// prettier-ignore\nconst _4n = BigInt(4), _5n = BigInt(5), _8n = BigInt(8);\n// prettier-ignore\nconst _9n = BigInt(9), _16n = BigInt(16);\n// Calculates a modulo b\nexport function mod(a, b) {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\n// TODO: use field version && remove\nexport function pow(num, power, modulo) {\n if (modulo <= _0n || power < _0n)\n throw new Error('Expected power/modulo > 0');\n if (modulo === _1n)\n return _0n;\n let res = _1n;\n while (power > _0n) {\n if (power & _1n)\n res = (res * num) % modulo;\n num = (num * num) % modulo;\n power >>= _1n;\n }\n return res;\n}\n// Does x ^ (2 ^ power) mod p. pow2(30, 4) == 30 ^ (2 ^ 4)\nexport function pow2(x, power, modulo) {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n// Inverses number over modulo\nexport function invert(number, modulo) {\n if (number === _0n || modulo <= _0n) {\n throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`);\n }\n // Euclidean GCD https://brilliant.org/wiki/extended-euclidean-algorithm/\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n)\n throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * Will start an infinite loop if field order P is not prime.\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P) {\n // Legendre constant: used to calculate Legendre symbol (a | p),\n // which denotes the value of a^((p-1)/2) (mod p).\n // (a | p) ≡ 1 if a is a square (mod p)\n // (a | p) ≡ -1 if a is not a square (mod p)\n // (a | p) ≡ 0 if a ≡ 0 (mod p)\n const legendreC = (P - _1n) / _2n;\n let Q, S, Z;\n // Step 1: By factoring out powers of 2 from p - 1,\n // find q and s such that p - 1 = q*(2^s) with q odd\n for (Q = P - _1n, S = 0; Q % _2n === _0n; Q /= _2n, S++)\n ;\n // Step 2: Select a non-square z such that (z | p) ≡ -1 and set c ≡ zq\n for (Z = _2n; Z < P && pow(Z, legendreC, P) !== P - _1n; Z++)\n ;\n // Fast-path\n if (S === 1) {\n const p1div4 = (P + _1n) / _4n;\n return function tonelliFast(Fp, n) {\n const root = Fp.pow(n, p1div4);\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n return root;\n };\n }\n // Slow-path\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow(Fp, n) {\n // Step 0: Check that n is indeed a square: (n | p) should not be ≡ -1\n if (Fp.pow(n, legendreC) === Fp.neg(Fp.ONE))\n throw new Error('Cannot find square root');\n let r = S;\n // TODO: will fail at Fp2/etc\n let g = Fp.pow(Fp.mul(Fp.ONE, Z), Q); // will update both x and b\n let x = Fp.pow(n, Q1div2); // first guess at the square root\n let b = Fp.pow(n, Q); // first guess at the fudge factor\n while (!Fp.eql(b, Fp.ONE)) {\n if (Fp.eql(b, Fp.ZERO))\n return Fp.ZERO; // https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm (4. If t = 0, return r = 0)\n // Find m such b^(2^m)==1\n let m = 1;\n for (let t2 = Fp.sqr(b); m < r; m++) {\n if (Fp.eql(t2, Fp.ONE))\n break;\n t2 = Fp.sqr(t2); // t2 *= t2\n }\n // NOTE: r-m-1 can be bigger than 32, need to convert to bigint before shift, otherwise there will be overflow\n const ge = Fp.pow(g, _1n << BigInt(r - m - 1)); // ge = 2^(r-m-1)\n g = Fp.sqr(ge); // g = ge * ge\n x = Fp.mul(x, ge); // x *= ge\n b = Fp.mul(b, g); // b *= g\n r = m;\n }\n return x;\n };\n}\nexport function FpSqrt(P) {\n // NOTE: different algorithms can give different roots, it is up to user to decide which one they want.\n // For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n // P ≡ 3 (mod 4)\n // √n = n^((P+1)/4)\n if (P % _4n === _3n) {\n // Not all roots possible!\n // const ORDER =\n // 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn;\n // const NUM = 72057594037927816n;\n const p1div4 = (P + _1n) / _4n;\n return function sqrt3mod4(Fp, n) {\n const root = Fp.pow(n, p1div4);\n // Throw if root**2 != n\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n return root;\n };\n }\n // Atkin algorithm for q ≡ 5 (mod 8), https://eprint.iacr.org/2012/685.pdf (page 10)\n if (P % _8n === _5n) {\n const c1 = (P - _5n) / _8n;\n return function sqrt5mod8(Fp, n) {\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, c1);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n if (!Fp.eql(Fp.sqr(root), n))\n throw new Error('Cannot find square root');\n return root;\n };\n }\n // P ≡ 9 (mod 16)\n if (P % _16n === _9n) {\n // NOTE: tonelli is too slow for bls-Fp2 calculations even on start\n // Means we cannot use sqrt for constants at all!\n //\n // const c1 = Fp.sqrt(Fp.negate(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n // const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n // const c3 = Fp.sqrt(Fp.negate(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n // const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n // sqrt = (x) => {\n // let tv1 = Fp.pow(x, c4); // 1. tv1 = x^c4\n // let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1\n // const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1\n // let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1\n // const e1 = Fp.equals(Fp.square(tv2), x); // 5. e1 = (tv2^2) == x\n // const e2 = Fp.equals(Fp.square(tv3), x); // 6. e2 = (tv3^2) == x\n // tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n // tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n // const e3 = Fp.equals(Fp.square(tv2), x); // 9. e3 = (tv2^2) == x\n // return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2\n // }\n }\n // Other cases: Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n];\nexport function validateField(field) {\n const initial = {\n ORDER: 'bigint',\n MASK: 'bigint',\n BYTES: 'isSafeInteger',\n BITS: 'isSafeInteger',\n };\n const opts = FIELD_FIELDS.reduce((map, val) => {\n map[val] = 'function';\n return map;\n }, initial);\n return validateObject(field, opts);\n}\n// Generic field functions\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow(f, num, power) {\n // Should have same speed as pow for bigints\n // TODO: benchmark!\n if (power < _0n)\n throw new Error('Expected power > 0');\n if (power === _0n)\n return f.ONE;\n if (power === _1n)\n return num;\n let p = f.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n)\n p = f.mul(p, d);\n d = f.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n/**\n * Efficiently invert an array of Field elements.\n * `inv(0)` will return `undefined` here: make sure to throw an error.\n */\nexport function FpInvertBatch(f, nums) {\n const tmp = new Array(nums.length);\n // Walk from first to last, multiply them by each other MOD p\n const lastMultiplied = nums.reduce((acc, num, i) => {\n if (f.is0(num))\n return acc;\n tmp[i] = acc;\n return f.mul(acc, num);\n }, f.ONE);\n // Invert last element\n const inverted = f.inv(lastMultiplied);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (f.is0(num))\n return acc;\n tmp[i] = f.mul(acc, tmp[i]);\n return f.mul(acc, num);\n }, inverted);\n return tmp;\n}\nexport function FpDiv(f, lhs, rhs) {\n return f.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, f.ORDER) : f.inv(rhs));\n}\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare(f) {\n const legendreConst = (f.ORDER - _1n) / _2n; // Integer arithmetic\n return (x) => {\n const p = f.pow(x, legendreConst);\n return f.eql(p, f.ZERO) || f.eql(p, f.ONE);\n };\n}\n// CURVE.n lengths\nexport function nLength(n, nBitLength) {\n // Bit size, byte size of CURVE.n\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n/**\n * Initializes a finite field over prime. **Non-primes are not supported.**\n * Do not init in loop: slow. Very fragile: always run a benchmark on a change.\n * Major performance optimizations:\n * * a) denormalized operations like mulN instead of mul\n * * b) same object shape: never add or remove keys\n * * c) Object.freeze\n * @param ORDER prime positive bigint\n * @param bitLen how many bits the field consumes\n * @param isLE (def: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER, bitLen, isLE = false, redef = {}) {\n if (ORDER <= _0n)\n throw new Error(`Expected Field ORDER > 0, got ${ORDER}`);\n const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);\n if (BYTES > 2048)\n throw new Error('Field lengths over 2048 bytes are not supported');\n const sqrtP = FpSqrt(ORDER);\n const f = Object.freeze({\n ORDER,\n BITS,\n BYTES,\n MASK: bitMask(BITS),\n ZERO: _0n,\n ONE: _1n,\n create: (num) => mod(num, ORDER),\n isValid: (num) => {\n if (typeof num !== 'bigint')\n throw new Error(`Invalid field element: expected bigint, got ${typeof num}`);\n return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n },\n is0: (num) => num === _0n,\n isOdd: (num) => (num & _1n) === _1n,\n neg: (num) => mod(-num, ORDER),\n eql: (lhs, rhs) => lhs === rhs,\n sqr: (num) => mod(num * num, ORDER),\n add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n pow: (num, power) => FpPow(f, num, power),\n div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n // Same as above, but doesn't normalize\n sqrN: (num) => num * num,\n addN: (lhs, rhs) => lhs + rhs,\n subN: (lhs, rhs) => lhs - rhs,\n mulN: (lhs, rhs) => lhs * rhs,\n inv: (num) => invert(num, ORDER),\n sqrt: redef.sqrt || ((n) => sqrtP(f, n)),\n invertBatch: (lst) => FpInvertBatch(f, lst),\n // TODO: do we really need constant cmov?\n // We don't have const-time bigints anyway, so probably will be not very useful\n cmov: (a, b, c) => (c ? b : a),\n toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n fromBytes: (bytes) => {\n if (bytes.length !== BYTES)\n throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`);\n return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n },\n });\n return Object.freeze(f);\n}\nexport function FpSqrtOdd(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(`Field doesn't have isOdd`);\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\nexport function FpSqrtEven(Fp, elm) {\n if (!Fp.isOdd)\n throw new Error(`Field doesn't have isOdd`);\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use mapKeyToField instead\n */\nexport function hashToPrivateScalar(hash, groupOrder, isLE = false) {\n hash = ensureBytes('privateHash', hash);\n const hashLen = hash.length;\n const minLen = nLength(groupOrder).nByteLength + 8;\n if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n throw new Error(`hashToPrivateScalar: expected ${minLen}-1024 bytes of input, got ${hashLen}`);\n const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n return mod(num, groupOrder - _1n) + _1n;\n}\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder) {\n if (typeof fieldOrder !== 'bigint')\n throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder) {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key, fieldOrder, isLE = false) {\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error(`expected ${minLen}-1024 bytes of input, got ${len}`);\n const num = isLE ? bytesToNumberBE(key) : bytesToNumberLE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n//# sourceMappingURL=modular.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// Abelian group utilities\nimport { validateField, nLength } from './modular.js';\nimport { validateObject } from './utils.js';\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n// Elliptic curve multiplication of Point by scalar. Fragile.\n// Scalars should always be less than curve order: this should be checked inside of a curve itself.\n// Creates precomputation tables for fast multiplication:\n// - private scalar is split by fixed size windows of W bits\n// - every window point is collected from window's table & added to accumulator\n// - since windows are different, same point inside tables won't be accessed more than once per calc\n// - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n// - +1 window is neccessary for wNAF\n// - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n// TODO: Research returning 2d JS array of windows, instead of a single window. This would allow\n// windows to be in different memory locations\nexport function wNAF(c, bits) {\n const constTimeNegate = (condition, item) => {\n const neg = item.negate();\n return condition ? neg : item;\n };\n const opts = (W) => {\n const windows = Math.ceil(bits / W) + 1; // +1, because\n const windowSize = 2 ** (W - 1); // -1 because we skip zero\n return { windows, windowSize };\n };\n return {\n constTimeNegate,\n // non-const time multiplication ladder\n unsafeLadder(elm, n) {\n let p = c.ZERO;\n let d = elm;\n while (n > _0n) {\n if (n & _1n)\n p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n },\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @returns precomputed point tables flattened to a single array\n */\n precomputeWindow(elm, W) {\n const { windows, windowSize } = opts(W);\n const points = [];\n let p = elm;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // =1, because we skip zero\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n },\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * @param W window size\n * @param precomputes precomputed tables\n * @param n scalar (we don't check here, but should be less than curve order)\n * @returns real and fake (for const-time) points\n */\n wNAF(W, precomputes, n) {\n // TODO: maybe check that scalar is less than group order? wNAF behavious is undefined otherwise\n // But need to carefully remove other checks before wNAF. ORDER == bits here\n const { windows, windowSize } = opts(W);\n let p = c.ZERO;\n let f = c.BASE;\n const mask = BigInt(2 ** W - 1); // Create mask with W ones: 0b1111 for W=4 etc.\n const maxNumber = 2 ** W;\n const shiftBy = BigInt(W);\n for (let window = 0; window < windows; window++) {\n const offset = window * windowSize;\n // Extract W bits.\n let wbits = Number(n & mask);\n // Shift number by W bits.\n n >>= shiftBy;\n // If the bits are bigger than max size, we'll split those.\n // +224 => 256 - 32\n if (wbits > windowSize) {\n wbits -= maxNumber;\n n += _1n;\n }\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n // Check if we're onto Zero point.\n // Add random point inside current window to f.\n const offset1 = offset;\n const offset2 = offset + Math.abs(wbits) - 1; // -1 because we skip zero\n const cond1 = window % 2 !== 0;\n const cond2 = wbits < 0;\n if (wbits === 0) {\n // The most important part for const-time getPublicKey\n f = f.add(constTimeNegate(cond1, precomputes[offset1]));\n }\n else {\n p = p.add(constTimeNegate(cond2, precomputes[offset2]));\n }\n }\n // JIT-compiler should not eliminate f here, since it will later be used in normalizeZ()\n // Even if the variable is still unused, there are some checks which will\n // throw an exception, so compiler needs to prove they won't happen, which is hard.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n },\n wNAFCached(P, precomputesMap, n, transform) {\n // @ts-ignore\n const W = P._WINDOW_SIZE || 1;\n // Calculate precomputes on a first run, reuse them after\n let comp = precomputesMap.get(P);\n if (!comp) {\n comp = this.precomputeWindow(P, W);\n if (W !== 1) {\n precomputesMap.set(P, transform(comp));\n }\n }\n return this.wNAF(W, comp, n);\n },\n };\n}\nexport function validateBasic(curve) {\n validateField(curve.Fp);\n validateObject(curve, {\n n: 'bigint',\n h: 'bigint',\n Gx: 'field',\n Gy: 'field',\n }, {\n nBitLength: 'isSafeInteger',\n nByteLength: 'isSafeInteger',\n });\n // Set defaults\n return Object.freeze({\n ...nLength(curve.n, curve.nBitLength),\n ...curve,\n ...{ p: curve.Fp.ORDER },\n });\n}\n//# sourceMappingURL=curve.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// Short Weierstrass curve. The formula is: y² = x³ + ax + b\nimport * as mod from './modular.js';\nimport * as ut from './utils.js';\nimport { ensureBytes } from './utils.js';\nimport { wNAF, validateBasic } from './curve.js';\nfunction validatePointOpts(curve) {\n const opts = validateBasic(curve);\n ut.validateObject(opts, {\n a: 'field',\n b: 'field',\n }, {\n allowedPrivateKeyLengths: 'array',\n wrapPrivateKey: 'boolean',\n isTorsionFree: 'function',\n clearCofactor: 'function',\n allowInfinityPoint: 'boolean',\n fromBytes: 'function',\n toBytes: 'function',\n });\n const { endo, Fp, a } = opts;\n if (endo) {\n if (!Fp.eql(a, Fp.ZERO)) {\n throw new Error('Endomorphism can only be defined for Koblitz curves that have a=0');\n }\n if (typeof endo !== 'object' ||\n typeof endo.beta !== 'bigint' ||\n typeof endo.splitScalar !== 'function') {\n throw new Error('Expected endomorphism with beta: bigint and splitScalar: function');\n }\n }\n return Object.freeze({ ...opts });\n}\n// ASN.1 DER encoding utilities\nconst { bytesToNumberBE: b2n, hexToBytes: h2b } = ut;\nexport const DER = {\n // asn.1 DER encoding utils\n Err: class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n },\n _parseInt(data) {\n const { Err: E } = DER;\n if (data.length < 2 || data[0] !== 0x02)\n throw new E('Invalid signature integer tag');\n const len = data[1];\n const res = data.subarray(2, len + 2);\n if (!len || res.length !== len)\n throw new E('Invalid signature integer: wrong length');\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n if (res[0] & 0b10000000)\n throw new E('Invalid signature integer: negative');\n if (res[0] === 0x00 && !(res[1] & 0b10000000))\n throw new E('Invalid signature integer: unnecessary leading zero');\n return { d: b2n(res), l: data.subarray(len + 2) }; // d is data, l is left\n },\n toSig(hex) {\n // parse DER signature\n const { Err: E } = DER;\n const data = typeof hex === 'string' ? h2b(hex) : hex;\n if (!(data instanceof Uint8Array))\n throw new Error('ui8a expected');\n let l = data.length;\n if (l < 2 || data[0] != 0x30)\n throw new E('Invalid signature tag');\n if (data[1] !== l - 2)\n throw new E('Invalid signature: incorrect length');\n const { d: r, l: sBytes } = DER._parseInt(data.subarray(2));\n const { d: s, l: rBytesLeft } = DER._parseInt(sBytes);\n if (rBytesLeft.length)\n throw new E('Invalid signature: left bytes after parsing');\n return { r, s };\n },\n hexFromSig(sig) {\n // Add leading zero if first byte has negative bit enabled. More details in '_parseInt'\n const slice = (s) => (Number.parseInt(s[0], 16) & 0b1000 ? '00' + s : s);\n const h = (num) => {\n const hex = num.toString(16);\n return hex.length & 1 ? `0${hex}` : hex;\n };\n const s = slice(h(sig.s));\n const r = slice(h(sig.r));\n const shl = s.length / 2;\n const rhl = r.length / 2;\n const sl = h(shl);\n const rl = h(rhl);\n return `30${h(rhl + shl + 4)}02${rl}${r}02${sl}${s}`;\n },\n};\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\nexport function weierstrassPoints(opts) {\n const CURVE = validatePointOpts(opts);\n const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ\n const toBytes = CURVE.toBytes ||\n ((_c, point, _isCompressed) => {\n const a = point.toAffine();\n return ut.concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));\n });\n const fromBytes = CURVE.fromBytes ||\n ((bytes) => {\n // const head = bytes[0];\n const tail = bytes.subarray(1);\n // if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n });\n /**\n * y² = x³ + ax + b: Short weierstrass curve formula\n * @returns y²\n */\n function weierstrassEquation(x) {\n const { a, b } = CURVE;\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x2 * x\n return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x3 + a * x + b\n }\n // Validate whether the passed curve params are valid.\n // We check if curve equation works for generator point.\n // `assertValidity()` won't work: `isTorsionFree()` is not available at this point in bls12-381.\n // ProjectivePoint class has not been initialized yet.\n if (!Fp.eql(Fp.sqr(CURVE.Gy), weierstrassEquation(CURVE.Gx)))\n throw new Error('bad generator point: equation left != right');\n // Valid group elements reside in range 1..n-1\n function isWithinCurveOrder(num) {\n return typeof num === 'bigint' && _0n < num && num < CURVE.n;\n }\n function assertGE(num) {\n if (!isWithinCurveOrder(num))\n throw new Error('Expected valid bigint: 0 < bigint < curve.n');\n }\n // Validates if priv key is valid and converts it to bigint.\n // Supports options allowedPrivateKeyLengths and wrapPrivateKey.\n function normPrivateKeyToScalar(key) {\n const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n } = CURVE;\n if (lengths && typeof key !== 'bigint') {\n if (key instanceof Uint8Array)\n key = ut.bytesToHex(key);\n // Normalize to hex string, pad. E.g. P521 would norm 130-132 char hex to 132-char bytes\n if (typeof key !== 'string' || !lengths.includes(key.length))\n throw new Error('Invalid key');\n key = key.padStart(nByteLength * 2, '0');\n }\n let num;\n try {\n num =\n typeof key === 'bigint'\n ? key\n : ut.bytesToNumberBE(ensureBytes('private key', key, nByteLength));\n }\n catch (error) {\n throw new Error(`private key must be ${nByteLength} bytes, hex or bigint, not ${typeof key}`);\n }\n if (wrapPrivateKey)\n num = mod.mod(num, n); // disabled by default, enabled for BLS\n assertGE(num); // num in range [1..N-1]\n return num;\n }\n const pointPrecomputes = new Map();\n function assertPrjPoint(other) {\n if (!(other instanceof Point))\n throw new Error('ProjectivePoint expected');\n }\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates: (x, y, z) ∋ (x=x/z, y=y/z)\n * Default Point works in 2d / affine coordinates: (x, y)\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point {\n constructor(px, py, pz) {\n this.px = px;\n this.py = py;\n this.pz = pz;\n if (px == null || !Fp.isValid(px))\n throw new Error('x required');\n if (py == null || !Fp.isValid(py))\n throw new Error('y required');\n if (pz == null || !Fp.isValid(pz))\n throw new Error('z required');\n }\n // Does not validate if the point is on-curve.\n // Use fromHex instead, or call assertValidity() later.\n static fromAffine(p) {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('invalid affine point');\n if (p instanceof Point)\n throw new Error('projective point not allowed');\n const is0 = (i) => Fp.eql(i, Fp.ZERO);\n // fromAffine(x:0, y:0) would produce (x:0, y:0, z:1), but we need (x:0, y:1, z:0)\n if (is0(x) && is0(y))\n return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\n static normalizeZ(points) {\n const toInv = Fp.invertBatch(points.map((p) => p.pz));\n return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n }\n /**\n * Converts hash string or Uint8Array to Point.\n * @param hex short/long ECDSA hex\n */\n static fromHex(hex) {\n const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));\n P.assertValidity();\n return P;\n }\n // Multiplies generator point by privateKey.\n static fromPrivateKey(privateKey) {\n return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));\n }\n // \"Private method\", don't use it directly\n _setWindowSize(windowSize) {\n this._WINDOW_SIZE = windowSize;\n pointPrecomputes.delete(this);\n }\n // A point on curve is valid if it conforms to equation.\n assertValidity() {\n if (this.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is wrong representation of ZERO and is always invalid.\n if (CURVE.allowInfinityPoint && !Fp.is0(this.py))\n return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = this.toAffine();\n // Check if x, y are valid field elements\n if (!Fp.isValid(x) || !Fp.isValid(y))\n throw new Error('bad point: x or y not FE');\n const left = Fp.sqr(y); // y²\n const right = weierstrassEquation(x); // x³ + ax + b\n if (!Fp.eql(left, right))\n throw new Error('bad point: equation left != right');\n if (!this.isTorsionFree())\n throw new Error('bad point: not in prime-order subgroup');\n }\n hasEvenY() {\n const { y } = this.toAffine();\n if (Fp.isOdd)\n return !Fp.isOdd(y);\n throw new Error(\"Field doesn't support isOdd\");\n }\n /**\n * Compare one point to another.\n */\n equals(other) {\n assertPrjPoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n /**\n * Flips point to one corresponding to (x, -y) in Affine coordinates.\n */\n negate() {\n return new Point(this.px, Fp.neg(this.py), this.pz);\n }\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { px: X1, py: Y1, pz: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other) {\n assertPrjPoint(other);\n const { px: X1, py: Y1, pz: Z1 } = this;\n const { px: X2, py: Y2, pz: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n subtract(other) {\n return this.add(other.negate());\n }\n is0() {\n return this.equals(Point.ZERO);\n }\n wNAF(n) {\n return wnaf.wNAFCached(this, pointPrecomputes, n, (comp) => {\n const toInv = Fp.invertBatch(comp.map((p) => p.pz));\n return comp.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);\n });\n }\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed private key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(n) {\n const I = Point.ZERO;\n if (n === _0n)\n return I;\n assertGE(n); // Will throw on 0\n if (n === _1n)\n return this;\n const { endo } = CURVE;\n if (!endo)\n return wnaf.unsafeLadder(this, n);\n // Apply endomorphism\n let { k1neg, k1, k2neg, k2 } = endo.splitScalar(n);\n let k1p = I;\n let k2p = I;\n let d = this;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n)\n k1p = k1p.add(d);\n if (k2 & _1n)\n k2p = k2p.add(d);\n d = d.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n if (k1neg)\n k1p = k1p.negate();\n if (k2neg)\n k2p = k2p.negate();\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n return k1p.add(k2p);\n }\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar) {\n assertGE(scalar);\n let n = scalar;\n let point, fake; // Fake point is used to const-time mult\n const { endo } = CURVE;\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = endo.splitScalar(n);\n let { p: k1p, f: f1p } = this.wNAF(k1);\n let { p: k2p, f: f2p } = this.wNAF(k2);\n k1p = wnaf.constTimeNegate(k1neg, k1p);\n k2p = wnaf.constTimeNegate(k2neg, k2p);\n k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);\n point = k1p.add(k2p);\n fake = f1p.add(f2p);\n }\n else {\n const { p, f } = this.wNAF(n);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return Point.normalizeZ([point, fake])[0];\n }\n /**\n * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly.\n * Not using Strauss-Shamir trick: precomputation tables are faster.\n * The trick could be useful if both P and Q are not G (not in our case).\n * @returns non-zero affine point\n */\n multiplyAndAddUnsafe(Q, a, b) {\n const G = Point.BASE; // No Strauss-Shamir trick: we have 10% faster G precomputes\n const mul = (P, a // Select faster multiply() method\n ) => (a === _0n || a === _1n || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));\n const sum = mul(this, a).add(mul(Q, b));\n return sum.is0() ? undefined : sum;\n }\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (x, y, z) ∋ (x=x/z, y=y/z)\n toAffine(iz) {\n const { px: x, py: y, pz: z } = this;\n const is0 = this.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null)\n iz = is0 ? Fp.ONE : Fp.inv(z);\n const ax = Fp.mul(x, iz);\n const ay = Fp.mul(y, iz);\n const zz = Fp.mul(z, iz);\n if (is0)\n return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE))\n throw new Error('invZ was invalid');\n return { x: ax, y: ay };\n }\n isTorsionFree() {\n const { h: cofactor, isTorsionFree } = CURVE;\n if (cofactor === _1n)\n return true; // No subgroups, always torsion-free\n if (isTorsionFree)\n return isTorsionFree(Point, this);\n throw new Error('isTorsionFree() has not been declared for the elliptic curve');\n }\n clearCofactor() {\n const { h: cofactor, clearCofactor } = CURVE;\n if (cofactor === _1n)\n return this; // Fast-path\n if (clearCofactor)\n return clearCofactor(Point, this);\n return this.multiplyUnsafe(CURVE.h);\n }\n toRawBytes(isCompressed = true) {\n this.assertValidity();\n return toBytes(Point, this, isCompressed);\n }\n toHex(isCompressed = true) {\n return ut.bytesToHex(this.toRawBytes(isCompressed));\n }\n }\n Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO);\n const _bits = CURVE.nBitLength;\n const wnaf = wNAF(Point, CURVE.endo ? Math.ceil(_bits / 2) : _bits);\n // Validate if generator point is on curve\n return {\n CURVE,\n ProjectivePoint: Point,\n normPrivateKeyToScalar,\n weierstrassEquation,\n isWithinCurveOrder,\n };\n}\nfunction validateOpts(curve) {\n const opts = validateBasic(curve);\n ut.validateObject(opts, {\n hash: 'hash',\n hmac: 'function',\n randomBytes: 'function',\n }, {\n bits2int: 'function',\n bits2int_modN: 'function',\n lowS: 'boolean',\n });\n return Object.freeze({ lowS: true, ...opts });\n}\nexport function weierstrass(curveDef) {\n const CURVE = validateOpts(curveDef);\n const { Fp, n: CURVE_ORDER } = CURVE;\n const compressedLen = Fp.BYTES + 1; // e.g. 33 for 32\n const uncompressedLen = 2 * Fp.BYTES + 1; // e.g. 65 for 32\n function isValidFieldElement(num) {\n return _0n < num && num < Fp.ORDER; // 0 is banned since it's not invertible FE\n }\n function modN(a) {\n return mod.mod(a, CURVE_ORDER);\n }\n function invN(a) {\n return mod.invert(a, CURVE_ORDER);\n }\n const { ProjectivePoint: Point, normPrivateKeyToScalar, weierstrassEquation, isWithinCurveOrder, } = weierstrassPoints({\n ...CURVE,\n toBytes(_c, point, isCompressed) {\n const a = point.toAffine();\n const x = Fp.toBytes(a.x);\n const cat = ut.concatBytes;\n if (isCompressed) {\n return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);\n }\n else {\n return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));\n }\n },\n fromBytes(bytes) {\n const len = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // this.assertValidity() is done inside of fromHex\n if (len === compressedLen && (head === 0x02 || head === 0x03)) {\n const x = ut.bytesToNumberBE(tail);\n if (!isValidFieldElement(x))\n throw new Error('Point is not on curve');\n const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n let y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n const isYOdd = (y & _1n) === _1n;\n // ECDSA\n const isHeadOdd = (head & 1) === 1;\n if (isHeadOdd !== isYOdd)\n y = Fp.neg(y);\n return { x, y };\n }\n else if (len === uncompressedLen && head === 0x04) {\n const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));\n const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));\n return { x, y };\n }\n else {\n throw new Error(`Point of length ${len} was invalid. Expected ${compressedLen} compressed bytes or ${uncompressedLen} uncompressed bytes`);\n }\n },\n });\n const numToNByteStr = (num) => ut.bytesToHex(ut.numberToBytesBE(num, CURVE.nByteLength));\n function isBiggerThanHalfOrder(number) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function normalizeS(s) {\n return isBiggerThanHalfOrder(s) ? modN(-s) : s;\n }\n // slice bytes num\n const slcNum = (b, from, to) => ut.bytesToNumberBE(b.slice(from, to));\n /**\n * ECDSA signature with its (r, s) properties. Supports DER & compact representations.\n */\n class Signature {\n constructor(r, s, recovery) {\n this.r = r;\n this.s = s;\n this.recovery = recovery;\n this.assertValidity();\n }\n // pair (bytes of r, bytes of s)\n static fromCompact(hex) {\n const l = CURVE.nByteLength;\n hex = ensureBytes('compactSignature', hex, l * 2);\n return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));\n }\n // DER encoded ECDSA signature\n // https://bitcoin.stackexchange.com/questions/57644/what-are-the-parts-of-a-bitcoin-transaction-input-script\n static fromDER(hex) {\n const { r, s } = DER.toSig(ensureBytes('DER', hex));\n return new Signature(r, s);\n }\n assertValidity() {\n // can use assertGE here\n if (!isWithinCurveOrder(this.r))\n throw new Error('r must be 0 < r < CURVE.n');\n if (!isWithinCurveOrder(this.s))\n throw new Error('s must be 0 < s < CURVE.n');\n }\n addRecoveryBit(recovery) {\n return new Signature(this.r, this.s, recovery);\n }\n recoverPublicKey(msgHash) {\n const { r, s, recovery: rec } = this;\n const h = bits2int_modN(ensureBytes('msgHash', msgHash)); // Truncate hash\n if (rec == null || ![0, 1, 2, 3].includes(rec))\n throw new Error('recovery id invalid');\n const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;\n if (radj >= Fp.ORDER)\n throw new Error('recovery id 2 or 3 invalid');\n const prefix = (rec & 1) === 0 ? '02' : '03';\n const R = Point.fromHex(prefix + numToNByteStr(radj));\n const ir = invN(radj); // r^-1\n const u1 = modN(-h * ir); // -hr^-1\n const u2 = modN(s * ir); // sr^-1\n const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1)\n if (!Q)\n throw new Error('point at infinify'); // unsafe is fine: no priv data leaked\n Q.assertValidity();\n return Q;\n }\n // Signatures should be low-s, to prevent malleability.\n hasHighS() {\n return isBiggerThanHalfOrder(this.s);\n }\n normalizeS() {\n return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;\n }\n // DER-encoded\n toDERRawBytes() {\n return ut.hexToBytes(this.toDERHex());\n }\n toDERHex() {\n return DER.hexFromSig({ r: this.r, s: this.s });\n }\n // padded bytes of r, then padded bytes of s\n toCompactRawBytes() {\n return ut.hexToBytes(this.toCompactHex());\n }\n toCompactHex() {\n return numToNByteStr(this.r) + numToNByteStr(this.s);\n }\n }\n const utils = {\n isValidPrivateKey(privateKey) {\n try {\n normPrivateKeyToScalar(privateKey);\n return true;\n }\n catch (error) {\n return false;\n }\n },\n normPrivateKeyToScalar: normPrivateKeyToScalar,\n /**\n * Produces cryptographically secure private key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n randomPrivateKey: () => {\n const length = mod.getMinHashLength(CURVE.n);\n return mod.mapHashToField(CURVE.randomBytes(length), CURVE.n);\n },\n /**\n * Creates precompute table for an arbitrary EC point. Makes point \"cached\".\n * Allows to massively speed-up `point.multiply(scalar)`.\n * @returns cached point\n * @example\n * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey));\n * fast.multiply(privKey); // much faster ECDH now\n */\n precompute(windowSize = 8, point = Point.BASE) {\n point._setWindowSize(windowSize);\n point.multiply(BigInt(3)); // 3 is arbitrary, just need any number here\n return point;\n },\n };\n /**\n * Computes public key for a private key. Checks for validity of the private key.\n * @param privateKey private key\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(privateKey, isCompressed = true) {\n return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);\n }\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item) {\n const arr = item instanceof Uint8Array;\n const str = typeof item === 'string';\n const len = (arr || str) && item.length;\n if (arr)\n return len === compressedLen || len === uncompressedLen;\n if (str)\n return len === 2 * compressedLen || len === 2 * uncompressedLen;\n if (item instanceof Point)\n return true;\n return false;\n }\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from private key and public key.\n * Checks: 1) private key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param privateA private key\n * @param publicB different public key\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(privateA, publicB, isCompressed = true) {\n if (isProbPub(privateA))\n throw new Error('first arg must be private key');\n if (!isProbPub(publicB))\n throw new Error('second arg must be public key');\n const b = Point.fromHex(publicB); // check for being on-curve\n return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);\n }\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int = CURVE.bits2int ||\n function (bytes) {\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = ut.bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - CURVE.nBitLength; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN = CURVE.bits2int_modN ||\n function (bytes) {\n return modN(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // NOTE: pads output with zero as per spec\n const ORDER_MASK = ut.bitMask(CURVE.nBitLength);\n /**\n * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`.\n */\n function int2octets(num) {\n if (typeof num !== 'bigint')\n throw new Error('bigint expected');\n if (!(_0n <= num && num < ORDER_MASK))\n throw new Error(`bigint expected < 2^${CURVE.nBitLength}`);\n // works with order, can have different size than numToField!\n return ut.numberToBytesBE(num, CURVE.nByteLength);\n }\n // Steps A, D of RFC6979 3.2\n // Creates RFC6979 seed; converts msg/privKey to numbers.\n // Used only in sign, not in verify.\n // NOTE: we cannot assume here that msgHash has same amount of bytes as curve order, this will be wrong at least for P521.\n // Also it can be bigger for P224 + SHA256\n function prepSig(msgHash, privateKey, opts = defaultSigOpts) {\n if (['recovered', 'canonical'].some((k) => k in opts))\n throw new Error('sign() legacy options not supported');\n const { hash, randomBytes } = CURVE;\n let { lowS, prehash, extraEntropy: ent } = opts; // generates low-s sigs by default\n if (lowS == null)\n lowS = true; // RFC6979 3.2: we skip step A, because we already provide hash\n msgHash = ensureBytes('msgHash', msgHash);\n if (prehash)\n msgHash = ensureBytes('prehashed msgHash', hash(msgHash));\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with nBitLength % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(msgHash);\n const d = normPrivateKeyToScalar(privateKey); // validate private key, convert to bigint\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (ent != null) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n const e = ent === true ? randomBytes(Fp.BYTES) : ent; // generate random bytes OR pass as-is\n seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n }\n const seed = ut.concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n function k2sig(kBytes) {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!isWithinCurveOrder(k))\n return; // Important: all mod() calls here must be done over N\n const ik = invN(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = Gk\n const r = modN(q.x); // r = q.x mod n\n if (r === _0n)\n return;\n // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n const s = modN(ik * modN(m + r * d)); // Not using blinding here\n if (s === _0n)\n return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = normalizeS(s); // if lowS was passed, ensure s is always\n recovery ^= 1; // // in the bottom half of N\n }\n return new Signature(r, normS, recovery); // use normS, not s\n }\n return { seed, k2sig };\n }\n const defaultSigOpts = { lowS: CURVE.lowS, prehash: false };\n const defaultVerOpts = { lowS: CURVE.lowS, prehash: false };\n /**\n * Signs message hash with a private key.\n * ```\n * sign(m, d, k) where\n * (x, y) = G × k\n * r = x mod n\n * s = (m + dr)/k mod n\n * ```\n * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.\n * @param privKey private key\n * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.\n * @returns signature with recovery param\n */\n function sign(msgHash, privKey, opts = defaultSigOpts) {\n const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.\n const C = CURVE;\n const drbg = ut.createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);\n return drbg(seed, k2sig); // Steps B, C, D, E, F, G\n }\n // Enable precomputes. Slows down first publicKey computation by 20ms.\n Point.BASE._setWindowSize(8);\n // utils.precompute(8, ProjectivePoint.BASE)\n /**\n * Verifies a signature against message hash and public key.\n * Rejects lowS signatures by default: to override,\n * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * U1 = hs^-1 mod n\n * U2 = rs^-1 mod n\n * R = U1⋅G - U2⋅P\n * mod(R.x, n) == r\n * ```\n */\n function verify(signature, msgHash, publicKey, opts = defaultVerOpts) {\n const sg = signature;\n msgHash = ensureBytes('msgHash', msgHash);\n publicKey = ensureBytes('publicKey', publicKey);\n if ('strict' in opts)\n throw new Error('options.strict was renamed to lowS');\n const { lowS, prehash } = opts;\n let _sig = undefined;\n let P;\n try {\n if (typeof sg === 'string' || sg instanceof Uint8Array) {\n // Signature can be represented in 2 ways: compact (2*nByteLength) & DER (variable-length).\n // Since DER can also be 2*nByteLength bytes, we check for it first.\n try {\n _sig = Signature.fromDER(sg);\n }\n catch (derError) {\n if (!(derError instanceof DER.Err))\n throw derError;\n _sig = Signature.fromCompact(sg);\n }\n }\n else if (typeof sg === 'object' && typeof sg.r === 'bigint' && typeof sg.s === 'bigint') {\n const { r, s } = sg;\n _sig = new Signature(r, s);\n }\n else {\n throw new Error('PARSE');\n }\n P = Point.fromHex(publicKey);\n }\n catch (error) {\n if (error.message === 'PARSE')\n throw new Error(`signature must be Signature instance, Uint8Array or hex string`);\n return false;\n }\n if (lowS && _sig.hasHighS())\n return false;\n if (prehash)\n msgHash = CURVE.hash(msgHash);\n const { r, s } = _sig;\n const h = bits2int_modN(msgHash); // Cannot use fields methods, since it is group element\n const is = invN(s); // s^-1\n const u1 = modN(h * is); // u1 = hs^-1 mod n\n const u2 = modN(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); // R = u1⋅G + u2⋅P\n if (!R)\n return false;\n const v = modN(R.x);\n return v === r;\n }\n return {\n CURVE,\n getPublicKey,\n getSharedSecret,\n sign,\n verify,\n ProjectivePoint: Point,\n Signature,\n utils,\n };\n}\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio(Fp, Z) {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n)\n l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u, v) => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u, v) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU(Fp, opts) {\n mod.validateField(Fp);\n if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);\n if (!Fp.isOdd)\n throw new Error('Fp.isOdd is not implemented!');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u) => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, opts.Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, opts.B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, opts.A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, opts.A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, opts.B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd(u) === Fp.isOdd(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n x = Fp.div(x, tv4); // 25. x = x / tv4\n return { x, y };\n };\n}\n//# sourceMappingURL=weierstrass.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac } from '@noble/hashes/hmac';\nimport { concatBytes, randomBytes } from '@noble/hashes/utils';\nimport { weierstrass } from './abstract/weierstrass.js';\n// connects noble-curves to noble-hashes\nexport function getHash(hash) {\n return {\n hash,\n hmac: (key, ...msgs) => hmac(hash, key, concatBytes(...msgs)),\n randomBytes,\n };\n}\nexport function createCurve(curveDef, defHash) {\n const create = (hash) => weierstrass({ ...curveDef, ...getHash(hash) });\n return Object.freeze({ ...create(defHash), create });\n}\n//# sourceMappingURL=_shortw_utils.js.map","/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha256';\nimport { randomBytes } from '@noble/hashes/utils';\nimport { Field, mod, pow2 } from './abstract/modular.js';\nimport { mapToCurveSimpleSWU } from './abstract/weierstrass.js';\nimport { bytesToNumberBE, concatBytes, ensureBytes, numberToBytesBE } from './abstract/utils.js';\nimport { createHasher, isogenyMap } from './abstract/hash-to-curve.js';\nimport { createCurve } from './_shortw_utils.js';\nconst secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');\nconst secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst divNearest = (a, b) => (a + b / _2n) / b;\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y) {\n const P = secp256k1P;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fp.eql(Fp.sqr(root), y))\n throw new Error('Cannot find square root');\n return root;\n}\nconst Fp = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });\nexport const secp256k1 = createCurve({\n a: BigInt(0),\n b: BigInt(7),\n Fp,\n n: secp256k1N,\n // Base point (x, y) aka generator point\n Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),\n Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),\n h: BigInt(1),\n lowS: true,\n /**\n * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n * Explanation: https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066\n */\n endo: {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n splitScalar: (k) => {\n const n = secp256k1N;\n const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');\n const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');\n const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');\n const b2 = a1;\n const POW_2_128 = BigInt('0x100000000000000000000000000000000'); // (2n**128n).toString(16)\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n let k1 = mod(k - c1 * a1 - c2 * a2, n);\n let k2 = mod(-c1 * b1 - c2 * b2, n);\n const k1neg = k1 > POW_2_128;\n const k2neg = k2 > POW_2_128;\n if (k1neg)\n k1 = n - k1;\n if (k2neg)\n k2 = n - k2;\n if (k1 > POW_2_128 || k2 > POW_2_128) {\n throw new Error('splitScalar: Endomorphism failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n },\n },\n}, sha256);\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\nconst _0n = BigInt(0);\nconst fe = (x) => typeof x === 'bigint' && _0n < x && x < secp256k1P;\nconst ge = (x) => typeof x === 'bigint' && _0n < x && x < secp256k1N;\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES = {};\nfunction taggedHash(tag, ...messages) {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point) => point.toRawBytes(true).slice(1);\nconst numTo32b = (n) => numberToBytesBE(n, 32);\nconst modP = (x) => mod(x, secp256k1P);\nconst modN = (x) => mod(x, secp256k1N);\nconst Point = secp256k1.ProjectivePoint;\nconst GmulAdd = (Q, a, b) => Point.BASE.multiplyAndAddUnsafe(Q, a, b);\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv) {\n let d_ = secp256k1.utils.normPrivateKeyToScalar(priv); // same method executed in fromPrivateKey\n let p = Point.fromPrivateKey(d_); // P = d'⋅G; 0 < d' < n check is done inside\n const scalar = p.hasEvenY() ? d_ : modN(-d_);\n return { scalar: scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x) {\n if (!fe(x))\n throw new Error('bad x: need 0 < x < p'); // Fail if x ≥ p.\n const xx = modP(x * x);\n const c = modP(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n let y = sqrtMod(c); // Let y = c^(p+1)/4 mod p.\n if (y % _2n !== _0n)\n y = modP(-y); // Return the unique point P such that x(P) = x and\n const p = new Point(x, y, _1n); // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n p.assertValidity();\n return p;\n}\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args) {\n return modN(bytesToNumberBE(taggedHash('BIP0340/challenge', ...args)));\n}\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(privateKey) {\n return schnorrGetExtPubKey(privateKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message, privateKey, auxRand = randomBytes(32)) {\n const m = ensureBytes('message', message);\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey); // checks for isWithinCurveOrder\n const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n const t = numTo32b(d ^ bytesToNumberBE(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n const k_ = modN(bytesToNumberBE(rand)); // Let k' = int(rand) mod n\n if (k_ === _0n)\n throw new Error('sign failed: k is zero'); // Fail if k' = 0.\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_); // Let R = k'⋅G.\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(numTo32b(modN(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px))\n throw new Error('sign: Invalid signature produced');\n return sig;\n}\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature, message, publicKey) {\n const sig = ensureBytes('signature', signature, 64);\n const m = ensureBytes('message', message);\n const pub = ensureBytes('publicKey', publicKey, 32);\n try {\n const P = lift_x(bytesToNumberBE(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = bytesToNumberBE(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n if (!fe(r))\n return false;\n const s = bytesToNumberBE(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n if (!ge(s))\n return false;\n const e = challenge(numTo32b(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n const R = GmulAdd(P, s, modN(-e)); // R = s⋅G - e⋅P\n if (!R || !R.hasEvenY() || R.toAffine().x !== r)\n return false; // -eP == (n-e)P\n return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n }\n catch (error) {\n return false;\n }\n}\nexport const schnorr = /* @__PURE__ */ (() => ({\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n utils: {\n randomPrivateKey: secp256k1.utils.randomPrivateKey,\n lift_x,\n pointToBytes,\n numberToBytesBE,\n bytesToNumberBE,\n taggedHash,\n mod,\n },\n}))();\nconst isoMap = /* @__PURE__ */ (() => isogenyMap(Fp, [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n].map((i) => i.map((j) => BigInt(j)))))();\nconst mapSWU = /* @__PURE__ */ (() => mapToCurveSimpleSWU(Fp, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fp.create(BigInt('-11')),\n}))();\nconst htf = /* @__PURE__ */ (() => createHasher(secp256k1.ProjectivePoint, (scalars) => {\n const { x, y } = mapSWU(Fp.create(scalars[0]));\n return isoMap(x, y);\n}, {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fp.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n}))();\nexport const hashToCurve = /* @__PURE__ */ (() => htf.hashToCurve)();\nexport const encodeToCurve = /* @__PURE__ */ (() => htf.encodeToCurve)();\n//# sourceMappingURL=secp256k1.js.map","/**\n * A constant for the zero address.\n *\n * (**i.e.** ``\"0x0000000000000000000000000000000000000000\"``)\n */\nexport const ZeroAddress = \"0x0000000000000000000000000000000000000000\";\n//# sourceMappingURL=addresses.js.map","/**\n * A constant for the zero hash.\n *\n * (**i.e.** ``\"0x0000000000000000000000000000000000000000000000000000000000000000\"``)\n */\nexport const ZeroHash = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n//# sourceMappingURL=hashes.js.map","/**\n * A constant for the order N for the secp256k1 curve.\n *\n * (**i.e.** ``0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n``)\n */\nexport const N = BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n/**\n * A constant for the number of wei in a single ether.\n *\n * (**i.e.** ``1000000000000000000n``)\n */\nexport const WeiPerEther = BigInt(\"1000000000000000000\");\n/**\n * A constant for the maximum value for a ``uint256``.\n *\n * (**i.e.** ``0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn``)\n */\nexport const MaxUint256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n/**\n * A constant for the minimum value for an ``int256``.\n *\n * (**i.e.** ``-8000000000000000000000000000000000000000000000000000000000000000n``)\n */\nexport const MinInt256 = BigInt(\"0x8000000000000000000000000000000000000000000000000000000000000000\") * BigInt(-1);\n/**\n * A constant for the maximum value for an ``int256``.\n *\n * (**i.e.** ``0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn``)\n */\nexport const MaxInt256 = BigInt(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n//# sourceMappingURL=numbers.js.map","// NFKC (composed) // (decomposed)\n/**\n * A constant for the ether symbol (normalized using NFKC).\n *\n * (**i.e.** ``\"\\\\u039e\"``)\n */\nexport const EtherSymbol = \"\\u039e\"; // \"\\uD835\\uDF63\";\n/**\n * A constant for the [[link-eip-191]] personal message prefix.\n *\n * (**i.e.** ``\"\\\\x19Ethereum Signed Message:\\\\n\"``)\n */\nexport const MessagePrefix = \"\\x19Ethereum Signed Message:\\n\";\n//# sourceMappingURL=strings.js.map","import { ZeroHash } from \"../constants/index.js\";\nimport { concat, dataLength, getBigInt, getBytes, getNumber, hexlify, toBeArray, isHexString, zeroPadValue, assertArgument, assertPrivate } from \"../utils/index.js\";\n// Constants\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_2 = BigInt(2);\nconst BN_27 = BigInt(27);\nconst BN_28 = BigInt(28);\nconst BN_35 = BigInt(35);\nconst _guard = {};\nfunction toUint256(value) {\n return zeroPadValue(toBeArray(value), 32);\n}\n/**\n * A Signature @TODO\n *\n *\n * @_docloc: api/crypto:Signing\n */\nexport class Signature {\n #r;\n #s;\n #v;\n #networkV;\n /**\n * The ``r`` value for a signature.\n *\n * This represents the ``x`` coordinate of a \"reference\" or\n * challenge point, from which the ``y`` can be computed.\n */\n get r() { return this.#r; }\n set r(value) {\n assertArgument(dataLength(value) === 32, \"invalid r\", \"value\", value);\n this.#r = hexlify(value);\n }\n /**\n * The ``s`` value for a signature.\n */\n get s() {\n assertArgument(parseInt(this.#s.substring(0, 3)) < 8, \"non-canonical s; use ._s\", \"s\", this.#s);\n return this.#s;\n }\n set s(_value) {\n assertArgument(dataLength(_value) === 32, \"invalid s\", \"value\", _value);\n this.#s = hexlify(_value);\n }\n /**\n * Return the s value, unchecked for EIP-2 compliance.\n *\n * This should generally not be used and is for situations where\n * a non-canonical S value might be relevant, such as Frontier blocks\n * that were mined prior to EIP-2 or invalid Authorization List\n * signatures.\n */\n get _s() { return this.#s; }\n /**\n * Returns true if the Signature is valid for [[link-eip-2]] signatures.\n */\n isValid() {\n return (parseInt(this.#s.substring(0, 3)) < 8);\n }\n /**\n * The ``v`` value for a signature.\n *\n * Since a given ``x`` value for ``r`` has two possible values for\n * its correspondin ``y``, the ``v`` indicates which of the two ``y``\n * values to use.\n *\n * It is normalized to the values ``27`` or ``28`` for legacy\n * purposes.\n */\n get v() { return this.#v; }\n set v(value) {\n const v = getNumber(value, \"value\");\n assertArgument(v === 27 || v === 28, \"invalid v\", \"v\", value);\n this.#v = v;\n }\n /**\n * The EIP-155 ``v`` for legacy transactions. For non-legacy\n * transactions, this value is ``null``.\n */\n get networkV() { return this.#networkV; }\n /**\n * The chain ID for EIP-155 legacy transactions. For non-legacy\n * transactions, this value is ``null``.\n */\n get legacyChainId() {\n const v = this.networkV;\n if (v == null) {\n return null;\n }\n return Signature.getChainId(v);\n }\n /**\n * The ``yParity`` for the signature.\n *\n * See ``v`` for more details on how this value is used.\n */\n get yParity() {\n return (this.v === 27) ? 0 : 1;\n }\n /**\n * The [[link-eip-2098]] compact representation of the ``yParity``\n * and ``s`` compacted into a single ``bytes32``.\n */\n get yParityAndS() {\n // The EIP-2098 compact representation\n const yParityAndS = getBytes(this.s);\n if (this.yParity) {\n yParityAndS[0] |= 0x80;\n }\n return hexlify(yParityAndS);\n }\n /**\n * The [[link-eip-2098]] compact representation.\n */\n get compactSerialized() {\n return concat([this.r, this.yParityAndS]);\n }\n /**\n * The serialized representation.\n */\n get serialized() {\n return concat([this.r, this.s, (this.yParity ? \"0x1c\" : \"0x1b\")]);\n }\n /**\n * @private\n */\n constructor(guard, r, s, v) {\n assertPrivate(guard, _guard, \"Signature\");\n this.#r = r;\n this.#s = s;\n this.#v = v;\n this.#networkV = null;\n }\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return `Signature { r: \"${this.r}\", s: \"${this._s}\"${this.isValid() ? \"\" : ', valid: \"false\"'}, yParity: ${this.yParity}, networkV: ${this.networkV} }`;\n }\n /**\n * Returns a new identical [[Signature]].\n */\n clone() {\n const clone = new Signature(_guard, this.r, this._s, this.v);\n if (this.networkV) {\n clone.#networkV = this.networkV;\n }\n return clone;\n }\n /**\n * Returns a representation that is compatible with ``JSON.stringify``.\n */\n toJSON() {\n const networkV = this.networkV;\n return {\n _type: \"signature\",\n networkV: ((networkV != null) ? networkV.toString() : null),\n r: this.r, s: this._s, v: this.v,\n };\n }\n /**\n * Compute the chain ID from the ``v`` in a legacy EIP-155 transactions.\n *\n * @example:\n * Signature.getChainId(45)\n * //_result:\n *\n * Signature.getChainId(46)\n * //_result:\n */\n static getChainId(v) {\n const bv = getBigInt(v, \"v\");\n // The v is not an EIP-155 v, so it is the unspecified chain ID\n if ((bv == BN_27) || (bv == BN_28)) {\n return BN_0;\n }\n // Bad value for an EIP-155 v\n assertArgument(bv >= BN_35, \"invalid EIP-155 v\", \"v\", v);\n return (bv - BN_35) / BN_2;\n }\n /**\n * Compute the ``v`` for a chain ID for a legacy EIP-155 transactions.\n *\n * Legacy transactions which use [[link-eip-155]] hijack the ``v``\n * property to include the chain ID.\n *\n * @example:\n * Signature.getChainIdV(5, 27)\n * //_result:\n *\n * Signature.getChainIdV(5, 28)\n * //_result:\n *\n */\n static getChainIdV(chainId, v) {\n return (getBigInt(chainId) * BN_2) + BigInt(35 + v - 27);\n }\n /**\n * Compute the normalized legacy transaction ``v`` from a ``yParirty``,\n * a legacy transaction ``v`` or a legacy [[link-eip-155]] transaction.\n *\n * @example:\n * // The values 0 and 1 imply v is actually yParity\n * Signature.getNormalizedV(0)\n * //_result:\n *\n * // Legacy non-EIP-1559 transaction (i.e. 27 or 28)\n * Signature.getNormalizedV(27)\n * //_result:\n *\n * // Legacy EIP-155 transaction (i.e. >= 35)\n * Signature.getNormalizedV(46)\n * //_result:\n *\n * // Invalid values throw\n * Signature.getNormalizedV(5)\n * //_error:\n */\n static getNormalizedV(v) {\n const bv = getBigInt(v);\n if (bv === BN_0 || bv === BN_27) {\n return 27;\n }\n if (bv === BN_1 || bv === BN_28) {\n return 28;\n }\n assertArgument(bv >= BN_35, \"invalid v\", \"v\", v);\n // Otherwise, EIP-155 v means odd is 27 and even is 28\n return (bv & BN_1) ? 27 : 28;\n }\n /**\n * Creates a new [[Signature]].\n *\n * If no %%sig%% is provided, a new [[Signature]] is created\n * with default values.\n *\n * If %%sig%% is a string, it is parsed.\n */\n static from(sig) {\n function assertError(check, message) {\n assertArgument(check, message, \"signature\", sig);\n }\n ;\n if (sig == null) {\n return new Signature(_guard, ZeroHash, ZeroHash, 27);\n }\n if (typeof (sig) === \"string\") {\n const bytes = getBytes(sig, \"signature\");\n if (bytes.length === 64) {\n const r = hexlify(bytes.slice(0, 32));\n const s = bytes.slice(32, 64);\n const v = (s[0] & 0x80) ? 28 : 27;\n s[0] &= 0x7f;\n return new Signature(_guard, r, hexlify(s), v);\n }\n if (bytes.length === 65) {\n const r = hexlify(bytes.slice(0, 32));\n const s = hexlify(bytes.slice(32, 64));\n const v = Signature.getNormalizedV(bytes[64]);\n return new Signature(_guard, r, s, v);\n }\n assertError(false, \"invalid raw signature length\");\n }\n if (sig instanceof Signature) {\n return sig.clone();\n }\n // Get r\n const _r = sig.r;\n assertError(_r != null, \"missing r\");\n const r = toUint256(_r);\n // Get s; by any means necessary (we check consistency below)\n const s = (function (s, yParityAndS) {\n if (s != null) {\n return toUint256(s);\n }\n if (yParityAndS != null) {\n assertError(isHexString(yParityAndS, 32), \"invalid yParityAndS\");\n const bytes = getBytes(yParityAndS);\n bytes[0] &= 0x7f;\n return hexlify(bytes);\n }\n assertError(false, \"missing s\");\n })(sig.s, sig.yParityAndS);\n // Get v; by any means necessary (we check consistency below)\n const { networkV, v } = (function (_v, yParityAndS, yParity) {\n if (_v != null) {\n const v = getBigInt(_v);\n return {\n networkV: ((v >= BN_35) ? v : undefined),\n v: Signature.getNormalizedV(v)\n };\n }\n if (yParityAndS != null) {\n assertError(isHexString(yParityAndS, 32), \"invalid yParityAndS\");\n return { v: ((getBytes(yParityAndS)[0] & 0x80) ? 28 : 27) };\n }\n if (yParity != null) {\n switch (getNumber(yParity, \"sig.yParity\")) {\n case 0: return { v: 27 };\n case 1: return { v: 28 };\n }\n assertError(false, \"invalid yParity\");\n }\n assertError(false, \"missing v\");\n })(sig.v, sig.yParityAndS, sig.yParity);\n const result = new Signature(_guard, r, s, v);\n if (networkV) {\n result.#networkV = networkV;\n }\n // If multiple of v, yParity, yParityAndS we given, check they match\n assertError(sig.yParity == null || getNumber(sig.yParity, \"sig.yParity\") === result.yParity, \"yParity mismatch\");\n assertError(sig.yParityAndS == null || sig.yParityAndS === result.yParityAndS, \"yParityAndS mismatch\");\n return result;\n }\n}\n//# sourceMappingURL=signature.js.map","/**\n * Add details about signing here.\n *\n * @_subsection: api/crypto:Signing [about-signing]\n */\nimport { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { concat, dataLength, getBytes, getBytesCopy, hexlify, toBeHex, assertArgument } from \"../utils/index.js\";\nimport { Signature } from \"./signature.js\";\n/**\n * A **SigningKey** provides high-level access to the elliptic curve\n * cryptography (ECC) operations and key management.\n */\nexport class SigningKey {\n #privateKey;\n /**\n * Creates a new **SigningKey** for %%privateKey%%.\n */\n constructor(privateKey) {\n assertArgument(dataLength(privateKey) === 32, \"invalid private key\", \"privateKey\", \"[REDACTED]\");\n this.#privateKey = hexlify(privateKey);\n }\n /**\n * The private key.\n */\n get privateKey() { return this.#privateKey; }\n /**\n * The uncompressed public key.\n *\n * This will always begin with the prefix ``0x04`` and be 132\n * characters long (the ``0x`` prefix and 130 hexadecimal nibbles).\n */\n get publicKey() { return SigningKey.computePublicKey(this.#privateKey); }\n /**\n * The compressed public key.\n *\n * This will always begin with either the prefix ``0x02`` or ``0x03``\n * and be 68 characters long (the ``0x`` prefix and 33 hexadecimal\n * nibbles)\n */\n get compressedPublicKey() { return SigningKey.computePublicKey(this.#privateKey, true); }\n /**\n * Return the signature of the signed %%digest%%.\n */\n sign(digest) {\n assertArgument(dataLength(digest) === 32, \"invalid digest length\", \"digest\", digest);\n const sig = secp256k1.sign(getBytesCopy(digest), getBytesCopy(this.#privateKey), {\n lowS: true\n });\n return Signature.from({\n r: toBeHex(sig.r, 32),\n s: toBeHex(sig.s, 32),\n v: (sig.recovery ? 0x1c : 0x1b)\n });\n }\n /**\n * Returns the [[link-wiki-ecdh]] shared secret between this\n * private key and the %%other%% key.\n *\n * The %%other%% key may be any type of key, a raw public key,\n * a compressed/uncompressed pubic key or aprivate key.\n *\n * Best practice is usually to use a cryptographic hash on the\n * returned value before using it as a symetric secret.\n *\n * @example:\n * sign1 = new SigningKey(id(\"some-secret-1\"))\n * sign2 = new SigningKey(id(\"some-secret-2\"))\n *\n * // Notice that privA.computeSharedSecret(pubB)...\n * sign1.computeSharedSecret(sign2.publicKey)\n * //_result:\n *\n * // ...is equal to privB.computeSharedSecret(pubA).\n * sign2.computeSharedSecret(sign1.publicKey)\n * //_result:\n */\n computeSharedSecret(other) {\n const pubKey = SigningKey.computePublicKey(other);\n return hexlify(secp256k1.getSharedSecret(getBytesCopy(this.#privateKey), getBytes(pubKey), false));\n }\n /**\n * Compute the public key for %%key%%, optionally %%compressed%%.\n *\n * The %%key%% may be any type of key, a raw public key, a\n * compressed/uncompressed public key or private key.\n *\n * @example:\n * sign = new SigningKey(id(\"some-secret\"));\n *\n * // Compute the uncompressed public key for a private key\n * SigningKey.computePublicKey(sign.privateKey)\n * //_result:\n *\n * // Compute the compressed public key for a private key\n * SigningKey.computePublicKey(sign.privateKey, true)\n * //_result:\n *\n * // Compute the uncompressed public key\n * SigningKey.computePublicKey(sign.publicKey, false);\n * //_result:\n *\n * // Compute the Compressed a public key\n * SigningKey.computePublicKey(sign.publicKey, true);\n * //_result:\n */\n static computePublicKey(key, compressed) {\n let bytes = getBytes(key, \"key\");\n // private key\n if (bytes.length === 32) {\n const pubKey = secp256k1.getPublicKey(bytes, !!compressed);\n return hexlify(pubKey);\n }\n // raw public key; use uncompressed key with 0x04 prefix\n if (bytes.length === 64) {\n const pub = new Uint8Array(65);\n pub[0] = 0x04;\n pub.set(bytes, 1);\n bytes = pub;\n }\n const point = secp256k1.ProjectivePoint.fromHex(bytes);\n return hexlify(point.toRawBytes(compressed));\n }\n /**\n * Returns the public key for the private key which produced the\n * %%signature%% for the given %%digest%%.\n *\n * @example:\n * key = new SigningKey(id(\"some-secret\"))\n * digest = id(\"hello world\")\n * sig = key.sign(digest)\n *\n * // Notice the signer public key...\n * key.publicKey\n * //_result:\n *\n * // ...is equal to the recovered public key\n * SigningKey.recoverPublicKey(digest, sig)\n * //_result:\n *\n */\n static recoverPublicKey(digest, signature) {\n assertArgument(dataLength(digest) === 32, \"invalid digest length\", \"digest\", digest);\n const sig = Signature.from(signature);\n let secpSig = secp256k1.Signature.fromCompact(getBytesCopy(concat([sig.r, sig.s])));\n secpSig = secpSig.addRecoveryBit(sig.yParity);\n const pubKey = secpSig.recoverPublicKey(getBytesCopy(digest));\n assertArgument(pubKey != null, \"invalid signature for digest\", \"signature\", signature);\n return \"0x\" + pubKey.toHex(false);\n }\n /**\n * Returns the point resulting from adding the ellipic curve points\n * %%p0%% and %%p1%%.\n *\n * This is not a common function most developers should require, but\n * can be useful for certain privacy-specific techniques.\n *\n * For example, it is used by [[HDNodeWallet]] to compute child\n * addresses from parent public keys and chain codes.\n */\n static addPoints(p0, p1, compressed) {\n const pub0 = secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p0).substring(2));\n const pub1 = secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p1).substring(2));\n return \"0x\" + pub0.add(pub1).toHex(!!compressed);\n }\n}\n//# sourceMappingURL=signing-key.js.map","/**\n * A fundamental building block of Ethereum is the underlying\n * cryptographic primitives.\n *\n * @_section: api/crypto:Cryptographic Functions [about-crypto]\n */\nnull;\n// We import all these so we can export lock()\nimport { computeHmac } from \"./hmac.js\";\nimport { keccak256 } from \"./keccak.js\";\nimport { ripemd160 } from \"./ripemd160.js\";\nimport { pbkdf2 } from \"./pbkdf2.js\";\nimport { randomBytes } from \"./random.js\";\nimport { scrypt, scryptSync } from \"./scrypt.js\";\nimport { sha256, sha512 } from \"./sha2.js\";\nexport { computeHmac, randomBytes, keccak256, ripemd160, sha256, sha512, pbkdf2, scrypt, scryptSync };\nexport { SigningKey } from \"./signing-key.js\";\nexport { Signature } from \"./signature.js\";\n/**\n * Once called, prevents any future change to the underlying cryptographic\n * primitives using the ``.register`` feature for hooks.\n */\nfunction lock() {\n computeHmac.lock();\n keccak256.lock();\n pbkdf2.lock();\n randomBytes.lock();\n ripemd160.lock();\n scrypt.lock();\n scryptSync.lock();\n sha256.lock();\n sha512.lock();\n randomBytes.lock();\n}\nexport { lock };\n//# sourceMappingURL=index.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\nconst BN_0 = BigInt(0);\nconst BN_36 = BigInt(36);\nfunction getChecksumAddress(address) {\n // if (!isHexString(address, 20)) {\n // logger.throwArgumentError(\"invalid address\", \"address\", address);\n // }\n address = address.toLowerCase();\n const chars = address.substring(2).split(\"\");\n const expanded = new Uint8Array(40);\n for (let i = 0; i < 40; i++) {\n expanded[i] = chars[i].charCodeAt(0);\n }\n const hashed = getBytes(keccak256(expanded));\n for (let i = 0; i < 40; i += 2) {\n if ((hashed[i >> 1] >> 4) >= 8) {\n chars[i] = chars[i].toUpperCase();\n }\n if ((hashed[i >> 1] & 0x0f) >= 8) {\n chars[i + 1] = chars[i + 1].toUpperCase();\n }\n }\n return \"0x\" + chars.join(\"\");\n}\n// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n// Create lookup table\nconst ibanLookup = {};\nfor (let i = 0; i < 10; i++) {\n ibanLookup[String(i)] = String(i);\n}\nfor (let i = 0; i < 26; i++) {\n ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n}\n// How many decimal digits can we process? (for 64-bit float, this is 15)\n// i.e. Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));\nconst safeDigits = 15;\nfunction ibanChecksum(address) {\n address = address.toUpperCase();\n address = address.substring(4) + address.substring(0, 2) + \"00\";\n let expanded = address.split(\"\").map((c) => { return ibanLookup[c]; }).join(\"\");\n // Javascript can handle integers safely up to 15 (decimal) digits\n while (expanded.length >= safeDigits) {\n let block = expanded.substring(0, safeDigits);\n expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n }\n let checksum = String(98 - (parseInt(expanded, 10) % 97));\n while (checksum.length < 2) {\n checksum = \"0\" + checksum;\n }\n return checksum;\n}\n;\nconst Base36 = (function () {\n ;\n const result = {};\n for (let i = 0; i < 36; i++) {\n const key = \"0123456789abcdefghijklmnopqrstuvwxyz\"[i];\n result[key] = BigInt(i);\n }\n return result;\n})();\nfunction fromBase36(value) {\n value = value.toLowerCase();\n let result = BN_0;\n for (let i = 0; i < value.length; i++) {\n result = result * BN_36 + Base36[value[i]];\n }\n return result;\n}\n/**\n * Returns a normalized and checksumed address for %%address%%.\n * This accepts non-checksum addresses, checksum addresses and\n * [[getIcapAddress]] formats.\n *\n * The checksum in Ethereum uses the capitalization (upper-case\n * vs lower-case) of the characters within an address to encode\n * its checksum, which offers, on average, a checksum of 15-bits.\n *\n * If %%address%% contains both upper-case and lower-case, it is\n * assumed to already be a checksum address and its checksum is\n * validated, and if the address fails its expected checksum an\n * error is thrown.\n *\n * If you wish the checksum of %%address%% to be ignore, it should\n * be converted to lower-case (i.e. ``.toLowercase()``) before\n * being passed in. This should be a very rare situation though,\n * that you wish to bypass the safegaurds in place to protect\n * against an address that has been incorrectly copied from another\n * source.\n *\n * @example:\n * // Adds the checksum (via upper-casing specific letters)\n * getAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\")\n * //_result:\n *\n * // Converts ICAP address and adds checksum\n * getAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if an address contains mixed case,\n * // but the checksum fails\n * getAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_error:\n */\nexport function getAddress(address) {\n assertArgument(typeof (address) === \"string\", \"invalid address\", \"address\", address);\n if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n // Missing the 0x prefix\n if (!address.startsWith(\"0x\")) {\n address = \"0x\" + address;\n }\n const result = getChecksumAddress(address);\n // It is a checksummed address with a bad checksum\n assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address, \"bad address checksum\", \"address\", address);\n return result;\n }\n // Maybe ICAP? (we only support direct mode)\n if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n // It is an ICAP address with a bad checksum\n assertArgument(address.substring(2, 4) === ibanChecksum(address), \"bad icap checksum\", \"address\", address);\n let result = fromBase36(address.substring(4)).toString(16);\n while (result.length < 40) {\n result = \"0\" + result;\n }\n return getChecksumAddress(\"0x\" + result);\n }\n assertArgument(false, \"invalid address\", \"address\", address);\n}\n/**\n * The [ICAP Address format](link-icap) format is an early checksum\n * format which attempts to be compatible with the banking\n * industry [IBAN format](link-wiki-iban) for bank accounts.\n *\n * It is no longer common or a recommended format.\n *\n * @example:\n * getIcapAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\");\n * //_result:\n *\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if the ICAP checksum is wrong\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37\");\n * //_error:\n */\nexport function getIcapAddress(address) {\n //let base36 = _base16To36(getAddress(address).substring(2)).toUpperCase();\n let base36 = BigInt(getAddress(address)).toString(36).toUpperCase();\n while (base36.length < 30) {\n base36 = \"0\" + base36;\n }\n return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n}\n//# sourceMappingURL=address.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { concat, dataSlice, getBigInt, getBytes, encodeRlp, assertArgument } from \"../utils/index.js\";\nimport { getAddress } from \"./address.js\";\n// http://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed\n/**\n * Returns the address that would result from a ``CREATE`` for %%tx%%.\n *\n * This can be used to compute the address a contract will be\n * deployed to by an EOA when sending a deployment transaction (i.e.\n * when the ``to`` address is ``null``).\n *\n * This can also be used to compute the address a contract will be\n * deployed to by a contract, by using the contract's address as the\n * ``to`` and the contract's nonce.\n *\n * @example\n * from = \"0x8ba1f109551bD432803012645Ac136ddd64DBA72\";\n * nonce = 5;\n *\n * getCreateAddress({ from, nonce });\n * //_result:\n */\nexport function getCreateAddress(tx) {\n const from = getAddress(tx.from);\n const nonce = getBigInt(tx.nonce, \"tx.nonce\");\n let nonceHex = nonce.toString(16);\n if (nonceHex === \"0\") {\n nonceHex = \"0x\";\n }\n else if (nonceHex.length % 2) {\n nonceHex = \"0x0\" + nonceHex;\n }\n else {\n nonceHex = \"0x\" + nonceHex;\n }\n return getAddress(dataSlice(keccak256(encodeRlp([from, nonceHex])), 12));\n}\n/**\n * Returns the address that would result from a ``CREATE2`` operation\n * with the given %%from%%, %%salt%% and %%initCodeHash%%.\n *\n * To compute the %%initCodeHash%% from a contract's init code, use\n * the [[keccak256]] function.\n *\n * For a quick overview and example of ``CREATE2``, see [[link-ricmoo-wisps]].\n *\n * @example\n * // The address of the contract\n * from = \"0x8ba1f109551bD432803012645Ac136ddd64DBA72\"\n *\n * // The salt\n * salt = id(\"HelloWorld\")\n *\n * // The hash of the initCode\n * initCode = \"0x6394198df16000526103ff60206004601c335afa6040516060f3\";\n * initCodeHash = keccak256(initCode)\n *\n * getCreate2Address(from, salt, initCodeHash)\n * //_result:\n */\nexport function getCreate2Address(_from, _salt, _initCodeHash) {\n const from = getAddress(_from);\n const salt = getBytes(_salt, \"salt\");\n const initCodeHash = getBytes(_initCodeHash, \"initCodeHash\");\n assertArgument(salt.length === 32, \"salt must be 32 bytes\", \"salt\", _salt);\n assertArgument(initCodeHash.length === 32, \"initCodeHash must be 32 bytes\", \"initCodeHash\", _initCodeHash);\n return getAddress(dataSlice(keccak256(concat([\"0xff\", from, salt, initCodeHash])), 12));\n}\n//# sourceMappingURL=contract-address.js.map","import { assert, assertArgument } from \"../utils/index.js\";\nimport { getAddress } from \"./address.js\";\n/**\n * Returns true if %%value%% is an object which implements the\n * [[Addressable]] interface.\n *\n * @example:\n * // Wallets and AbstractSigner sub-classes\n * isAddressable(Wallet.createRandom())\n * //_result:\n *\n * // Contracts\n * contract = new Contract(\"dai.tokens.ethers.eth\", [ ], provider)\n * isAddressable(contract)\n * //_result:\n */\nexport function isAddressable(value) {\n return (value && typeof (value.getAddress) === \"function\");\n}\n/**\n * Returns true if %%value%% is a valid address.\n *\n * @example:\n * // Valid address\n * isAddress(\"0x8ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_result:\n *\n * // Valid ICAP address\n * isAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\")\n * //_result:\n *\n * // Invalid checksum\n * isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBa72\")\n * //_result:\n *\n * // Invalid ICAP checksum\n * isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_result:\n *\n * // Not an address (an ENS name requires a provided and an\n * // asynchronous API to access)\n * isAddress(\"ricmoo.eth\")\n * //_result:\n */\nexport function isAddress(value) {\n try {\n getAddress(value);\n return true;\n }\n catch (error) { }\n return false;\n}\nasync function checkAddress(target, promise) {\n const result = await promise;\n if (result == null || result === \"0x0000000000000000000000000000000000000000\") {\n assert(typeof (target) !== \"string\", \"unconfigured name\", \"UNCONFIGURED_NAME\", { value: target });\n assertArgument(false, \"invalid AddressLike value; did not resolve to a value address\", \"target\", target);\n }\n return getAddress(result);\n}\n/**\n * Resolves to an address for the %%target%%, which may be any\n * supported address type, an [[Addressable]] or a Promise which\n * resolves to an address.\n *\n * If an ENS name is provided, but that name has not been correctly\n * configured a [[UnconfiguredNameError]] is thrown.\n *\n * @example:\n * addr = \"0x6B175474E89094C44Da98b954EedeAC495271d0F\"\n *\n * // Addresses are return synchronously\n * resolveAddress(addr, provider)\n * //_result:\n *\n * // Address promises are resolved asynchronously\n * resolveAddress(Promise.resolve(addr))\n * //_result:\n *\n * // ENS names are resolved asynchronously\n * resolveAddress(\"dai.tokens.ethers.eth\", provider)\n * //_result:\n *\n * // Addressable objects are resolved asynchronously\n * contract = new Contract(addr, [ ])\n * resolveAddress(contract, provider)\n * //_result:\n *\n * // Unconfigured ENS names reject\n * resolveAddress(\"nothing-here.ricmoo.eth\", provider)\n * //_error:\n *\n * // ENS names require a NameResolver object passed in\n * // (notice the provider was omitted)\n * resolveAddress(\"nothing-here.ricmoo.eth\")\n * //_error:\n */\nexport function resolveAddress(target, resolver) {\n if (typeof (target) === \"string\") {\n if (target.match(/^0x[0-9a-f]{40}$/i)) {\n return getAddress(target);\n }\n assert(resolver != null, \"ENS resolution requires a provider\", \"UNSUPPORTED_OPERATION\", { operation: \"resolveName\" });\n return checkAddress(target, resolver.resolveName(target));\n }\n else if (isAddressable(target)) {\n return checkAddress(target, target.getAddress());\n }\n else if (target && typeof (target.then) === \"function\") {\n return checkAddress(target, target);\n }\n assertArgument(false, \"unsupported addressable value\", \"target\", target);\n}\n//# sourceMappingURL=checks.js.map","/**\n * A Typed object allows a value to have its type explicitly\n * specified.\n *\n * For example, in Solidity, the value ``45`` could represent a\n * ``uint8`` or a ``uint256``. The value ``0x1234`` could represent\n * a ``bytes2`` or ``bytes``.\n *\n * Since JavaScript has no meaningful way to explicitly inform any\n * APIs which what the type is, this allows transparent interoperation\n * with Soldity.\n *\n * @_subsection: api/abi:Typed Values\n */\nimport { assertPrivate, defineProperties } from \"../utils/index.js\";\nconst _gaurd = {};\nfunction n(value, width) {\n let signed = false;\n if (width < 0) {\n signed = true;\n width *= -1;\n }\n // @TODO: Check range is valid for value\n return new Typed(_gaurd, `${signed ? \"\" : \"u\"}int${width}`, value, { signed, width });\n}\nfunction b(value, size) {\n // @TODO: Check range is valid for value\n return new Typed(_gaurd, `bytes${(size) ? size : \"\"}`, value, { size });\n}\nconst _typedSymbol = Symbol.for(\"_ethers_typed\");\n/**\n * The **Typed** class to wrap values providing explicit type information.\n */\nexport class Typed {\n /**\n * The type, as a Solidity-compatible type.\n */\n type;\n /**\n * The actual value.\n */\n value;\n #options;\n /**\n * @_ignore:\n */\n _typedSymbol;\n /**\n * @_ignore:\n */\n constructor(gaurd, type, value, options) {\n if (options == null) {\n options = null;\n }\n assertPrivate(_gaurd, gaurd, \"Typed\");\n defineProperties(this, { _typedSymbol, type, value });\n this.#options = options;\n // Check the value is valid\n this.format();\n }\n /**\n * Format the type as a Human-Readable type.\n */\n format() {\n if (this.type === \"array\") {\n throw new Error(\"\");\n }\n else if (this.type === \"dynamicArray\") {\n throw new Error(\"\");\n }\n else if (this.type === \"tuple\") {\n return `tuple(${this.value.map((v) => v.format()).join(\",\")})`;\n }\n return this.type;\n }\n /**\n * The default value returned by this type.\n */\n defaultValue() {\n return 0;\n }\n /**\n * The minimum value for numeric types.\n */\n minValue() {\n return 0;\n }\n /**\n * The maximum value for numeric types.\n */\n maxValue() {\n return 0;\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedBigInt]].\n */\n isBigInt() {\n return !!(this.type.match(/^u?int[0-9]+$/));\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedData]].\n */\n isData() {\n return this.type.startsWith(\"bytes\");\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedString]].\n */\n isString() {\n return (this.type === \"string\");\n }\n /**\n * Returns the tuple name, if this is a tuple. Throws otherwise.\n */\n get tupleName() {\n if (this.type !== \"tuple\") {\n throw TypeError(\"not a tuple\");\n }\n return this.#options;\n }\n // Returns the length of this type as an array\n // - `null` indicates the length is unforced, it could be dynamic\n // - `-1` indicates the length is dynamic\n // - any other value indicates it is a static array and is its length\n /**\n * Returns the length of the array type or ``-1`` if it is dynamic.\n *\n * Throws if the type is not an array.\n */\n get arrayLength() {\n if (this.type !== \"array\") {\n throw TypeError(\"not an array\");\n }\n if (this.#options === true) {\n return -1;\n }\n if (this.#options === false) {\n return (this.value).length;\n }\n return null;\n }\n /**\n * Returns a new **Typed** of %%type%% with the %%value%%.\n */\n static from(type, value) {\n return new Typed(_gaurd, type, value);\n }\n /**\n * Return a new ``uint8`` type for %%v%%.\n */\n static uint8(v) { return n(v, 8); }\n /**\n * Return a new ``uint16`` type for %%v%%.\n */\n static uint16(v) { return n(v, 16); }\n /**\n * Return a new ``uint24`` type for %%v%%.\n */\n static uint24(v) { return n(v, 24); }\n /**\n * Return a new ``uint32`` type for %%v%%.\n */\n static uint32(v) { return n(v, 32); }\n /**\n * Return a new ``uint40`` type for %%v%%.\n */\n static uint40(v) { return n(v, 40); }\n /**\n * Return a new ``uint48`` type for %%v%%.\n */\n static uint48(v) { return n(v, 48); }\n /**\n * Return a new ``uint56`` type for %%v%%.\n */\n static uint56(v) { return n(v, 56); }\n /**\n * Return a new ``uint64`` type for %%v%%.\n */\n static uint64(v) { return n(v, 64); }\n /**\n * Return a new ``uint72`` type for %%v%%.\n */\n static uint72(v) { return n(v, 72); }\n /**\n * Return a new ``uint80`` type for %%v%%.\n */\n static uint80(v) { return n(v, 80); }\n /**\n * Return a new ``uint88`` type for %%v%%.\n */\n static uint88(v) { return n(v, 88); }\n /**\n * Return a new ``uint96`` type for %%v%%.\n */\n static uint96(v) { return n(v, 96); }\n /**\n * Return a new ``uint104`` type for %%v%%.\n */\n static uint104(v) { return n(v, 104); }\n /**\n * Return a new ``uint112`` type for %%v%%.\n */\n static uint112(v) { return n(v, 112); }\n /**\n * Return a new ``uint120`` type for %%v%%.\n */\n static uint120(v) { return n(v, 120); }\n /**\n * Return a new ``uint128`` type for %%v%%.\n */\n static uint128(v) { return n(v, 128); }\n /**\n * Return a new ``uint136`` type for %%v%%.\n */\n static uint136(v) { return n(v, 136); }\n /**\n * Return a new ``uint144`` type for %%v%%.\n */\n static uint144(v) { return n(v, 144); }\n /**\n * Return a new ``uint152`` type for %%v%%.\n */\n static uint152(v) { return n(v, 152); }\n /**\n * Return a new ``uint160`` type for %%v%%.\n */\n static uint160(v) { return n(v, 160); }\n /**\n * Return a new ``uint168`` type for %%v%%.\n */\n static uint168(v) { return n(v, 168); }\n /**\n * Return a new ``uint176`` type for %%v%%.\n */\n static uint176(v) { return n(v, 176); }\n /**\n * Return a new ``uint184`` type for %%v%%.\n */\n static uint184(v) { return n(v, 184); }\n /**\n * Return a new ``uint192`` type for %%v%%.\n */\n static uint192(v) { return n(v, 192); }\n /**\n * Return a new ``uint200`` type for %%v%%.\n */\n static uint200(v) { return n(v, 200); }\n /**\n * Return a new ``uint208`` type for %%v%%.\n */\n static uint208(v) { return n(v, 208); }\n /**\n * Return a new ``uint216`` type for %%v%%.\n */\n static uint216(v) { return n(v, 216); }\n /**\n * Return a new ``uint224`` type for %%v%%.\n */\n static uint224(v) { return n(v, 224); }\n /**\n * Return a new ``uint232`` type for %%v%%.\n */\n static uint232(v) { return n(v, 232); }\n /**\n * Return a new ``uint240`` type for %%v%%.\n */\n static uint240(v) { return n(v, 240); }\n /**\n * Return a new ``uint248`` type for %%v%%.\n */\n static uint248(v) { return n(v, 248); }\n /**\n * Return a new ``uint256`` type for %%v%%.\n */\n static uint256(v) { return n(v, 256); }\n /**\n * Return a new ``uint256`` type for %%v%%.\n */\n static uint(v) { return n(v, 256); }\n /**\n * Return a new ``int8`` type for %%v%%.\n */\n static int8(v) { return n(v, -8); }\n /**\n * Return a new ``int16`` type for %%v%%.\n */\n static int16(v) { return n(v, -16); }\n /**\n * Return a new ``int24`` type for %%v%%.\n */\n static int24(v) { return n(v, -24); }\n /**\n * Return a new ``int32`` type for %%v%%.\n */\n static int32(v) { return n(v, -32); }\n /**\n * Return a new ``int40`` type for %%v%%.\n */\n static int40(v) { return n(v, -40); }\n /**\n * Return a new ``int48`` type for %%v%%.\n */\n static int48(v) { return n(v, -48); }\n /**\n * Return a new ``int56`` type for %%v%%.\n */\n static int56(v) { return n(v, -56); }\n /**\n * Return a new ``int64`` type for %%v%%.\n */\n static int64(v) { return n(v, -64); }\n /**\n * Return a new ``int72`` type for %%v%%.\n */\n static int72(v) { return n(v, -72); }\n /**\n * Return a new ``int80`` type for %%v%%.\n */\n static int80(v) { return n(v, -80); }\n /**\n * Return a new ``int88`` type for %%v%%.\n */\n static int88(v) { return n(v, -88); }\n /**\n * Return a new ``int96`` type for %%v%%.\n */\n static int96(v) { return n(v, -96); }\n /**\n * Return a new ``int104`` type for %%v%%.\n */\n static int104(v) { return n(v, -104); }\n /**\n * Return a new ``int112`` type for %%v%%.\n */\n static int112(v) { return n(v, -112); }\n /**\n * Return a new ``int120`` type for %%v%%.\n */\n static int120(v) { return n(v, -120); }\n /**\n * Return a new ``int128`` type for %%v%%.\n */\n static int128(v) { return n(v, -128); }\n /**\n * Return a new ``int136`` type for %%v%%.\n */\n static int136(v) { return n(v, -136); }\n /**\n * Return a new ``int144`` type for %%v%%.\n */\n static int144(v) { return n(v, -144); }\n /**\n * Return a new ``int52`` type for %%v%%.\n */\n static int152(v) { return n(v, -152); }\n /**\n * Return a new ``int160`` type for %%v%%.\n */\n static int160(v) { return n(v, -160); }\n /**\n * Return a new ``int168`` type for %%v%%.\n */\n static int168(v) { return n(v, -168); }\n /**\n * Return a new ``int176`` type for %%v%%.\n */\n static int176(v) { return n(v, -176); }\n /**\n * Return a new ``int184`` type for %%v%%.\n */\n static int184(v) { return n(v, -184); }\n /**\n * Return a new ``int92`` type for %%v%%.\n */\n static int192(v) { return n(v, -192); }\n /**\n * Return a new ``int200`` type for %%v%%.\n */\n static int200(v) { return n(v, -200); }\n /**\n * Return a new ``int208`` type for %%v%%.\n */\n static int208(v) { return n(v, -208); }\n /**\n * Return a new ``int216`` type for %%v%%.\n */\n static int216(v) { return n(v, -216); }\n /**\n * Return a new ``int224`` type for %%v%%.\n */\n static int224(v) { return n(v, -224); }\n /**\n * Return a new ``int232`` type for %%v%%.\n */\n static int232(v) { return n(v, -232); }\n /**\n * Return a new ``int240`` type for %%v%%.\n */\n static int240(v) { return n(v, -240); }\n /**\n * Return a new ``int248`` type for %%v%%.\n */\n static int248(v) { return n(v, -248); }\n /**\n * Return a new ``int256`` type for %%v%%.\n */\n static int256(v) { return n(v, -256); }\n /**\n * Return a new ``int256`` type for %%v%%.\n */\n static int(v) { return n(v, -256); }\n /**\n * Return a new ``bytes1`` type for %%v%%.\n */\n static bytes1(v) { return b(v, 1); }\n /**\n * Return a new ``bytes2`` type for %%v%%.\n */\n static bytes2(v) { return b(v, 2); }\n /**\n * Return a new ``bytes3`` type for %%v%%.\n */\n static bytes3(v) { return b(v, 3); }\n /**\n * Return a new ``bytes4`` type for %%v%%.\n */\n static bytes4(v) { return b(v, 4); }\n /**\n * Return a new ``bytes5`` type for %%v%%.\n */\n static bytes5(v) { return b(v, 5); }\n /**\n * Return a new ``bytes6`` type for %%v%%.\n */\n static bytes6(v) { return b(v, 6); }\n /**\n * Return a new ``bytes7`` type for %%v%%.\n */\n static bytes7(v) { return b(v, 7); }\n /**\n * Return a new ``bytes8`` type for %%v%%.\n */\n static bytes8(v) { return b(v, 8); }\n /**\n * Return a new ``bytes9`` type for %%v%%.\n */\n static bytes9(v) { return b(v, 9); }\n /**\n * Return a new ``bytes10`` type for %%v%%.\n */\n static bytes10(v) { return b(v, 10); }\n /**\n * Return a new ``bytes11`` type for %%v%%.\n */\n static bytes11(v) { return b(v, 11); }\n /**\n * Return a new ``bytes12`` type for %%v%%.\n */\n static bytes12(v) { return b(v, 12); }\n /**\n * Return a new ``bytes13`` type for %%v%%.\n */\n static bytes13(v) { return b(v, 13); }\n /**\n * Return a new ``bytes14`` type for %%v%%.\n */\n static bytes14(v) { return b(v, 14); }\n /**\n * Return a new ``bytes15`` type for %%v%%.\n */\n static bytes15(v) { return b(v, 15); }\n /**\n * Return a new ``bytes16`` type for %%v%%.\n */\n static bytes16(v) { return b(v, 16); }\n /**\n * Return a new ``bytes17`` type for %%v%%.\n */\n static bytes17(v) { return b(v, 17); }\n /**\n * Return a new ``bytes18`` type for %%v%%.\n */\n static bytes18(v) { return b(v, 18); }\n /**\n * Return a new ``bytes19`` type for %%v%%.\n */\n static bytes19(v) { return b(v, 19); }\n /**\n * Return a new ``bytes20`` type for %%v%%.\n */\n static bytes20(v) { return b(v, 20); }\n /**\n * Return a new ``bytes21`` type for %%v%%.\n */\n static bytes21(v) { return b(v, 21); }\n /**\n * Return a new ``bytes22`` type for %%v%%.\n */\n static bytes22(v) { return b(v, 22); }\n /**\n * Return a new ``bytes23`` type for %%v%%.\n */\n static bytes23(v) { return b(v, 23); }\n /**\n * Return a new ``bytes24`` type for %%v%%.\n */\n static bytes24(v) { return b(v, 24); }\n /**\n * Return a new ``bytes25`` type for %%v%%.\n */\n static bytes25(v) { return b(v, 25); }\n /**\n * Return a new ``bytes26`` type for %%v%%.\n */\n static bytes26(v) { return b(v, 26); }\n /**\n * Return a new ``bytes27`` type for %%v%%.\n */\n static bytes27(v) { return b(v, 27); }\n /**\n * Return a new ``bytes28`` type for %%v%%.\n */\n static bytes28(v) { return b(v, 28); }\n /**\n * Return a new ``bytes29`` type for %%v%%.\n */\n static bytes29(v) { return b(v, 29); }\n /**\n * Return a new ``bytes30`` type for %%v%%.\n */\n static bytes30(v) { return b(v, 30); }\n /**\n * Return a new ``bytes31`` type for %%v%%.\n */\n static bytes31(v) { return b(v, 31); }\n /**\n * Return a new ``bytes32`` type for %%v%%.\n */\n static bytes32(v) { return b(v, 32); }\n /**\n * Return a new ``address`` type for %%v%%.\n */\n static address(v) { return new Typed(_gaurd, \"address\", v); }\n /**\n * Return a new ``bool`` type for %%v%%.\n */\n static bool(v) { return new Typed(_gaurd, \"bool\", !!v); }\n /**\n * Return a new ``bytes`` type for %%v%%.\n */\n static bytes(v) { return new Typed(_gaurd, \"bytes\", v); }\n /**\n * Return a new ``string`` type for %%v%%.\n */\n static string(v) { return new Typed(_gaurd, \"string\", v); }\n /**\n * Return a new ``array`` type for %%v%%, allowing %%dynamic%% length.\n */\n static array(v, dynamic) {\n throw new Error(\"not implemented yet\");\n return new Typed(_gaurd, \"array\", v, dynamic);\n }\n /**\n * Return a new ``tuple`` type for %%v%%, with the optional %%name%%.\n */\n static tuple(v, name) {\n throw new Error(\"not implemented yet\");\n return new Typed(_gaurd, \"tuple\", v, name);\n }\n /**\n * Return a new ``uint8`` type for %%v%%.\n */\n static overrides(v) {\n return new Typed(_gaurd, \"overrides\", Object.assign({}, v));\n }\n /**\n * Returns true only if %%value%% is a [[Typed]] instance.\n */\n static isTyped(value) {\n return (value\n && typeof (value) === \"object\"\n && \"_typedSymbol\" in value\n && value._typedSymbol === _typedSymbol);\n }\n /**\n * If the value is a [[Typed]] instance, validates the underlying value\n * and returns it, otherwise returns value directly.\n *\n * This is useful for functions that with to accept either a [[Typed]]\n * object or values.\n */\n static dereference(value, type) {\n if (Typed.isTyped(value)) {\n if (value.type !== type) {\n throw new Error(`invalid type: expecetd ${type}, got ${value.type}`);\n }\n return value.value;\n }\n return value;\n }\n}\n//# sourceMappingURL=typed.js.map","import { getAddress } from \"../../address/index.js\";\nimport { toBeHex } from \"../../utils/maths.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class AddressCoder extends Coder {\n constructor(localName) {\n super(\"address\", \"address\", localName, false);\n }\n defaultValue() {\n return \"0x0000000000000000000000000000000000000000\";\n }\n encode(writer, _value) {\n let value = Typed.dereference(_value, \"string\");\n try {\n value = getAddress(value);\n }\n catch (error) {\n return this._throwError(error.message, _value);\n }\n return writer.writeValue(value);\n }\n decode(reader) {\n return getAddress(toBeHex(reader.readValue(), 20));\n }\n}\n//# sourceMappingURL=address.js.map","import { Coder } from \"./abstract-coder.js\";\n/**\n * Clones the functionality of an existing Coder, but without a localName\n *\n * @_ignore\n */\nexport class AnonymousCoder extends Coder {\n coder;\n constructor(coder) {\n super(coder.name, coder.type, \"_\", coder.dynamic);\n this.coder = coder;\n }\n defaultValue() {\n return this.coder.defaultValue();\n }\n encode(writer, value) {\n return this.coder.encode(writer, value);\n }\n decode(reader) {\n return this.coder.decode(reader);\n }\n}\n//# sourceMappingURL=anonymous.js.map","import { defineProperties, isError, assert, assertArgument, assertArgumentCount } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder, Result, WordSize, Writer } from \"./abstract-coder.js\";\nimport { AnonymousCoder } from \"./anonymous.js\";\n/**\n * @_ignore\n */\nexport function pack(writer, coders, values) {\n let arrayValues = [];\n if (Array.isArray(values)) {\n arrayValues = values;\n }\n else if (values && typeof (values) === \"object\") {\n let unique = {};\n arrayValues = coders.map((coder) => {\n const name = coder.localName;\n assert(name, \"cannot encode object for signature with missing names\", \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n assert(!unique[name], \"cannot encode object for signature with duplicate names\", \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n unique[name] = true;\n return values[name];\n });\n }\n else {\n assertArgument(false, \"invalid tuple value\", \"tuple\", values);\n }\n assertArgument(coders.length === arrayValues.length, \"types/value length mismatch\", \"tuple\", values);\n let staticWriter = new Writer();\n let dynamicWriter = new Writer();\n let updateFuncs = [];\n coders.forEach((coder, index) => {\n let value = arrayValues[index];\n if (coder.dynamic) {\n // Get current dynamic offset (for the future pointer)\n let dynamicOffset = dynamicWriter.length;\n // Encode the dynamic value into the dynamicWriter\n coder.encode(dynamicWriter, value);\n // Prepare to populate the correct offset once we are done\n let updateFunc = staticWriter.writeUpdatableValue();\n updateFuncs.push((baseOffset) => {\n updateFunc(baseOffset + dynamicOffset);\n });\n }\n else {\n coder.encode(staticWriter, value);\n }\n });\n // Backfill all the dynamic offsets, now that we know the static length\n updateFuncs.forEach((func) => { func(staticWriter.length); });\n let length = writer.appendWriter(staticWriter);\n length += writer.appendWriter(dynamicWriter);\n return length;\n}\n/**\n * @_ignore\n */\nexport function unpack(reader, coders) {\n let values = [];\n let keys = [];\n // A reader anchored to this base\n let baseReader = reader.subReader(0);\n coders.forEach((coder) => {\n let value = null;\n if (coder.dynamic) {\n let offset = reader.readIndex();\n let offsetReader = baseReader.subReader(offset);\n try {\n value = coder.decode(offsetReader);\n }\n catch (error) {\n // Cannot recover from this\n if (isError(error, \"BUFFER_OVERRUN\")) {\n throw error;\n }\n value = error;\n value.baseType = coder.name;\n value.name = coder.localName;\n value.type = coder.type;\n }\n }\n else {\n try {\n value = coder.decode(reader);\n }\n catch (error) {\n // Cannot recover from this\n if (isError(error, \"BUFFER_OVERRUN\")) {\n throw error;\n }\n value = error;\n value.baseType = coder.name;\n value.name = coder.localName;\n value.type = coder.type;\n }\n }\n if (value == undefined) {\n throw new Error(\"investigate\");\n }\n values.push(value);\n keys.push(coder.localName || null);\n });\n return Result.fromItems(values, keys);\n}\n/**\n * @_ignore\n */\nexport class ArrayCoder extends Coder {\n coder;\n length;\n constructor(coder, length, localName) {\n const type = (coder.type + \"[\" + (length >= 0 ? length : \"\") + \"]\");\n const dynamic = (length === -1 || coder.dynamic);\n super(\"array\", type, localName, dynamic);\n defineProperties(this, { coder, length });\n }\n defaultValue() {\n // Verifies the child coder is valid (even if the array is dynamic or 0-length)\n const defaultChild = this.coder.defaultValue();\n const result = [];\n for (let i = 0; i < this.length; i++) {\n result.push(defaultChild);\n }\n return result;\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"array\");\n if (!Array.isArray(value)) {\n this._throwError(\"expected array value\", value);\n }\n let count = this.length;\n if (count === -1) {\n count = value.length;\n writer.writeValue(value.length);\n }\n assertArgumentCount(value.length, count, \"coder array\" + (this.localName ? (\" \" + this.localName) : \"\"));\n let coders = [];\n for (let i = 0; i < value.length; i++) {\n coders.push(this.coder);\n }\n return pack(writer, coders, value);\n }\n decode(reader) {\n let count = this.length;\n if (count === -1) {\n count = reader.readIndex();\n // Check that there is *roughly* enough data to ensure\n // stray random data is not being read as a length. Each\n // slot requires at least 32 bytes for their value (or 32\n // bytes as a link to the data). This could use a much\n // tighter bound, but we are erroring on the side of safety.\n assert(count * WordSize <= reader.dataLength, \"insufficient data length\", \"BUFFER_OVERRUN\", { buffer: reader.bytes, offset: count * WordSize, length: reader.dataLength });\n }\n let coders = [];\n for (let i = 0; i < count; i++) {\n coders.push(new AnonymousCoder(this.coder));\n }\n return unpack(reader, coders);\n }\n}\n//# sourceMappingURL=array.js.map","import { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class BooleanCoder extends Coder {\n constructor(localName) {\n super(\"bool\", \"bool\", localName, false);\n }\n defaultValue() {\n return false;\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"bool\");\n return writer.writeValue(value ? 1 : 0);\n }\n decode(reader) {\n return !!reader.readValue();\n }\n}\n//# sourceMappingURL=boolean.js.map","import { getBytesCopy, hexlify } from \"../../utils/index.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class DynamicBytesCoder extends Coder {\n constructor(type, localName) {\n super(type, type, localName, true);\n }\n defaultValue() {\n return \"0x\";\n }\n encode(writer, value) {\n value = getBytesCopy(value);\n let length = writer.writeValue(value.length);\n length += writer.writeBytes(value);\n return length;\n }\n decode(reader) {\n return reader.readBytes(reader.readIndex(), true);\n }\n}\n/**\n * @_ignore\n */\nexport class BytesCoder extends DynamicBytesCoder {\n constructor(localName) {\n super(\"bytes\", localName);\n }\n decode(reader) {\n return hexlify(super.decode(reader));\n }\n}\n//# sourceMappingURL=bytes.js.map","import { defineProperties, getBytesCopy, hexlify } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class FixedBytesCoder extends Coder {\n size;\n constructor(size, localName) {\n let name = \"bytes\" + String(size);\n super(name, name, localName, false);\n defineProperties(this, { size }, { size: \"number\" });\n }\n defaultValue() {\n return (\"0x0000000000000000000000000000000000000000000000000000000000000000\").substring(0, 2 + this.size * 2);\n }\n encode(writer, _value) {\n let data = getBytesCopy(Typed.dereference(_value, this.type));\n if (data.length !== this.size) {\n this._throwError(\"incorrect data length\", _value);\n }\n return writer.writeBytes(data);\n }\n decode(reader) {\n return hexlify(reader.readBytes(this.size));\n }\n}\n//# sourceMappingURL=fixed-bytes.js.map","import { Coder } from \"./abstract-coder.js\";\nconst Empty = new Uint8Array([]);\n/**\n * @_ignore\n */\nexport class NullCoder extends Coder {\n constructor(localName) {\n super(\"null\", \"\", localName, false);\n }\n defaultValue() {\n return null;\n }\n encode(writer, value) {\n if (value != null) {\n this._throwError(\"not null\", value);\n }\n return writer.writeBytes(Empty);\n }\n decode(reader) {\n reader.readBytes(0);\n return null;\n }\n}\n//# sourceMappingURL=null.js.map","import { defineProperties, fromTwos, getBigInt, mask, toTwos } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder, WordSize } from \"./abstract-coder.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n/**\n * @_ignore\n */\nexport class NumberCoder extends Coder {\n size;\n signed;\n constructor(size, signed, localName) {\n const name = ((signed ? \"int\" : \"uint\") + (size * 8));\n super(name, name, localName, false);\n defineProperties(this, { size, signed }, { size: \"number\", signed: \"boolean\" });\n }\n defaultValue() {\n return 0;\n }\n encode(writer, _value) {\n let value = getBigInt(Typed.dereference(_value, this.type));\n // Check bounds are safe for encoding\n let maxUintValue = mask(BN_MAX_UINT256, WordSize * 8);\n if (this.signed) {\n let bounds = mask(maxUintValue, (this.size * 8) - 1);\n if (value > bounds || value < -(bounds + BN_1)) {\n this._throwError(\"value out-of-bounds\", _value);\n }\n value = toTwos(value, 8 * WordSize);\n }\n else if (value < BN_0 || value > mask(maxUintValue, this.size * 8)) {\n this._throwError(\"value out-of-bounds\", _value);\n }\n return writer.writeValue(value);\n }\n decode(reader) {\n let value = mask(reader.readValue(), this.size * 8);\n if (this.signed) {\n value = fromTwos(value, this.size * 8);\n }\n return value;\n }\n}\n//# sourceMappingURL=number.js.map","import { toUtf8Bytes, toUtf8String } from \"../../utils/utf8.js\";\nimport { Typed } from \"../typed.js\";\nimport { DynamicBytesCoder } from \"./bytes.js\";\n/**\n * @_ignore\n */\nexport class StringCoder extends DynamicBytesCoder {\n constructor(localName) {\n super(\"string\", localName);\n }\n defaultValue() {\n return \"\";\n }\n encode(writer, _value) {\n return super.encode(writer, toUtf8Bytes(Typed.dereference(_value, \"string\")));\n }\n decode(reader) {\n return toUtf8String(super.decode(reader));\n }\n}\n//# sourceMappingURL=string.js.map","import { defineProperties } from \"../../utils/properties.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\nimport { pack, unpack } from \"./array.js\";\n/**\n * @_ignore\n */\nexport class TupleCoder extends Coder {\n coders;\n constructor(coders, localName) {\n let dynamic = false;\n const types = [];\n coders.forEach((coder) => {\n if (coder.dynamic) {\n dynamic = true;\n }\n types.push(coder.type);\n });\n const type = (\"tuple(\" + types.join(\",\") + \")\");\n super(\"tuple\", type, localName, dynamic);\n defineProperties(this, { coders: Object.freeze(coders.slice()) });\n }\n defaultValue() {\n const values = [];\n this.coders.forEach((coder) => {\n values.push(coder.defaultValue());\n });\n // We only output named properties for uniquely named coders\n const uniqueNames = this.coders.reduce((accum, coder) => {\n const name = coder.localName;\n if (name) {\n if (!accum[name]) {\n accum[name] = 0;\n }\n accum[name]++;\n }\n return accum;\n }, {});\n // Add named values\n this.coders.forEach((coder, index) => {\n let name = coder.localName;\n if (!name || uniqueNames[name] !== 1) {\n return;\n }\n if (name === \"length\") {\n name = \"_length\";\n }\n if (values[name] != null) {\n return;\n }\n values[name] = values[index];\n });\n return Object.freeze(values);\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"tuple\");\n return pack(writer, this.coders, value);\n }\n decode(reader) {\n return unpack(reader, this.coders);\n }\n}\n//# sourceMappingURL=tuple.js.map","import { getAddress } from \"../address/index.js\";\nimport { assertArgument, isHexString } from \"../utils/index.js\";\nfunction accessSetify(addr, storageKeys) {\n return {\n address: getAddress(addr),\n storageKeys: storageKeys.map((storageKey, index) => {\n assertArgument(isHexString(storageKey, 32), \"invalid slot\", `storageKeys[${index}]`, storageKey);\n return storageKey.toLowerCase();\n })\n };\n}\n/**\n * Returns a [[AccessList]] from any ethers-supported access-list structure.\n */\nexport function accessListify(value) {\n if (Array.isArray(value)) {\n return value.map((set, index) => {\n if (Array.isArray(set)) {\n assertArgument(set.length === 2, \"invalid slot set\", `value[${index}]`, set);\n return accessSetify(set[0], set[1]);\n }\n assertArgument(set != null && typeof (set) === \"object\", \"invalid address-slot set\", \"value\", value);\n return accessSetify(set.address, set.storageKeys);\n });\n }\n assertArgument(value != null && typeof (value) === \"object\", \"invalid access list\", \"value\", value);\n const result = Object.keys(value).map((addr) => {\n const storageKeys = value[addr].reduce((accum, storageKey) => {\n accum[storageKey] = true;\n return accum;\n }, {});\n return accessSetify(addr, Object.keys(storageKeys).sort());\n });\n result.sort((a, b) => (a.address.localeCompare(b.address)));\n return result;\n}\n//# sourceMappingURL=accesslist.js.map","import { getAddress } from \"../address/index.js\";\nimport { Signature } from \"../crypto/index.js\";\nimport { getBigInt } from \"../utils/index.js\";\nexport function authorizationify(auth) {\n return {\n address: getAddress(auth.address),\n nonce: getBigInt((auth.nonce != null) ? auth.nonce : 0),\n chainId: getBigInt((auth.chainId != null) ? auth.chainId : 0),\n signature: Signature.from(auth.signature)\n };\n}\n//# sourceMappingURL=authorization.js.map","import { getAddress } from \"../address/index.js\";\nimport { keccak256, SigningKey } from \"../crypto/index.js\";\n/**\n * Returns the address for the %%key%%.\n *\n * The key may be any standard form of public key or a private key.\n */\nexport function computeAddress(key) {\n let pubkey;\n if (typeof (key) === \"string\") {\n pubkey = SigningKey.computePublicKey(key, false);\n }\n else {\n pubkey = key.publicKey;\n }\n return getAddress(keccak256(\"0x\" + pubkey.substring(4)).substring(26));\n}\n/**\n * Returns the recovered address for the private key that was\n * used to sign %%digest%% that resulted in %%signature%%.\n */\nexport function recoverAddress(digest, signature) {\n return computeAddress(SigningKey.recoverPublicKey(digest, signature));\n}\n//# sourceMappingURL=address.js.map","import { getAddress } from \"../address/index.js\";\nimport { ZeroAddress } from \"../constants/addresses.js\";\nimport { keccak256, sha256, Signature, SigningKey } from \"../crypto/index.js\";\nimport { concat, decodeRlp, encodeRlp, getBytes, getBigInt, getNumber, hexlify, assert, assertArgument, isBytesLike, isHexString, toBeArray, zeroPadValue } from \"../utils/index.js\";\nimport { accessListify } from \"./accesslist.js\";\nimport { authorizationify } from \"./authorization.js\";\nimport { recoverAddress } from \"./address.js\";\nconst BN_0 = BigInt(0);\nconst BN_2 = BigInt(2);\nconst BN_27 = BigInt(27);\nconst BN_28 = BigInt(28);\nconst BN_35 = BigInt(35);\nconst BN_MAX_UINT = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\nconst BLOB_SIZE = 4096 * 32;\nfunction getKzgLibrary(kzg) {\n const blobToKzgCommitment = (blob) => {\n if (\"computeBlobProof\" in kzg) {\n // micro-ecc-signer; check for computeBlobProof since this API\n // expects a string while the kzg-wasm below expects a Unit8Array\n if (\"blobToKzgCommitment\" in kzg && typeof (kzg.blobToKzgCommitment) === \"function\") {\n return getBytes(kzg.blobToKzgCommitment(hexlify(blob)));\n }\n }\n else if (\"blobToKzgCommitment\" in kzg && typeof (kzg.blobToKzgCommitment) === \"function\") {\n // kzg-wasm <0.5.0; blobToKzgCommitment(Uint8Array) => Uint8Array\n return getBytes(kzg.blobToKzgCommitment(blob));\n }\n // kzg-wasm >= 0.5.0; blobToKZGCommitment(string) => string\n if (\"blobToKZGCommitment\" in kzg && typeof (kzg.blobToKZGCommitment) === \"function\") {\n return getBytes(kzg.blobToKZGCommitment(hexlify(blob)));\n }\n assertArgument(false, \"unsupported KZG library\", \"kzg\", kzg);\n };\n const computeBlobKzgProof = (blob, commitment) => {\n // micro-ecc-signer\n if (\"computeBlobProof\" in kzg && typeof (kzg.computeBlobProof) === \"function\") {\n return getBytes(kzg.computeBlobProof(hexlify(blob), hexlify(commitment)));\n }\n // kzg-wasm <0.5.0; computeBlobKzgProof(Uint8Array, Uint8Array) => Uint8Array\n if (\"computeBlobKzgProof\" in kzg && typeof (kzg.computeBlobKzgProof) === \"function\") {\n return kzg.computeBlobKzgProof(blob, commitment);\n }\n // kzg-wasm >= 0.5.0; computeBlobKZGProof(string, string) => string\n if (\"computeBlobKZGProof\" in kzg && typeof (kzg.computeBlobKZGProof) === \"function\") {\n return getBytes(kzg.computeBlobKZGProof(hexlify(blob), hexlify(commitment)));\n }\n assertArgument(false, \"unsupported KZG library\", \"kzg\", kzg);\n };\n return { blobToKzgCommitment, computeBlobKzgProof };\n}\nfunction getVersionedHash(version, hash) {\n let versioned = version.toString(16);\n while (versioned.length < 2) {\n versioned = \"0\" + versioned;\n }\n versioned += sha256(hash).substring(4);\n return \"0x\" + versioned;\n}\nfunction handleAddress(value) {\n if (value === \"0x\") {\n return null;\n }\n return getAddress(value);\n}\nfunction handleAccessList(value, param) {\n try {\n return accessListify(value);\n }\n catch (error) {\n assertArgument(false, error.message, param, value);\n }\n}\nfunction handleAuthorizationList(value, param) {\n try {\n if (!Array.isArray(value)) {\n throw new Error(\"authorizationList: invalid array\");\n }\n const result = [];\n for (let i = 0; i < value.length; i++) {\n const auth = value[i];\n if (!Array.isArray(auth)) {\n throw new Error(`authorization[${i}]: invalid array`);\n }\n if (auth.length !== 6) {\n throw new Error(`authorization[${i}]: wrong length`);\n }\n if (!auth[1]) {\n throw new Error(`authorization[${i}]: null address`);\n }\n result.push({\n address: handleAddress(auth[1]),\n nonce: handleUint(auth[2], \"nonce\"),\n chainId: handleUint(auth[0], \"chainId\"),\n signature: Signature.from({\n yParity: handleNumber(auth[3], \"yParity\"),\n r: zeroPadValue(auth[4], 32),\n s: zeroPadValue(auth[5], 32)\n })\n });\n }\n return result;\n }\n catch (error) {\n assertArgument(false, error.message, param, value);\n }\n}\nfunction handleNumber(_value, param) {\n if (_value === \"0x\") {\n return 0;\n }\n return getNumber(_value, param);\n}\nfunction handleUint(_value, param) {\n if (_value === \"0x\") {\n return BN_0;\n }\n const value = getBigInt(_value, param);\n assertArgument(value <= BN_MAX_UINT, \"value exceeds uint size\", param, value);\n return value;\n}\nfunction formatNumber(_value, name) {\n const value = getBigInt(_value, \"value\");\n const result = toBeArray(value);\n assertArgument(result.length <= 32, `value too large`, `tx.${name}`, value);\n return result;\n}\nfunction formatAccessList(value) {\n return accessListify(value).map((set) => [set.address, set.storageKeys]);\n}\nfunction formatAuthorizationList(value) {\n return value.map((a) => {\n return [\n formatNumber(a.chainId, \"chainId\"),\n a.address,\n formatNumber(a.nonce, \"nonce\"),\n formatNumber(a.signature.yParity, \"yParity\"),\n toBeArray(a.signature.r),\n toBeArray(a.signature.s)\n ];\n });\n}\nfunction formatHashes(value, param) {\n assertArgument(Array.isArray(value), `invalid ${param}`, \"value\", value);\n for (let i = 0; i < value.length; i++) {\n assertArgument(isHexString(value[i], 32), \"invalid ${ param } hash\", `value[${i}]`, value[i]);\n }\n return value;\n}\nfunction _parseLegacy(data) {\n const fields = decodeRlp(data);\n assertArgument(Array.isArray(fields) && (fields.length === 9 || fields.length === 6), \"invalid field count for legacy transaction\", \"data\", data);\n const tx = {\n type: 0,\n nonce: handleNumber(fields[0], \"nonce\"),\n gasPrice: handleUint(fields[1], \"gasPrice\"),\n gasLimit: handleUint(fields[2], \"gasLimit\"),\n to: handleAddress(fields[3]),\n value: handleUint(fields[4], \"value\"),\n data: hexlify(fields[5]),\n chainId: BN_0\n };\n // Legacy unsigned transaction\n if (fields.length === 6) {\n return tx;\n }\n const v = handleUint(fields[6], \"v\");\n const r = handleUint(fields[7], \"r\");\n const s = handleUint(fields[8], \"s\");\n if (r === BN_0 && s === BN_0) {\n // EIP-155 unsigned transaction\n tx.chainId = v;\n }\n else {\n // Compute the EIP-155 chain ID (or 0 for legacy)\n let chainId = (v - BN_35) / BN_2;\n if (chainId < BN_0) {\n chainId = BN_0;\n }\n tx.chainId = chainId;\n // Signed Legacy Transaction\n assertArgument(chainId !== BN_0 || (v === BN_27 || v === BN_28), \"non-canonical legacy v\", \"v\", fields[6]);\n tx.signature = Signature.from({\n r: zeroPadValue(fields[7], 32),\n s: zeroPadValue(fields[8], 32),\n v\n });\n //tx.hash = keccak256(data);\n }\n return tx;\n}\nfunction _serializeLegacy(tx, sig) {\n const fields = [\n formatNumber(tx.nonce, \"nonce\"),\n formatNumber(tx.gasPrice || 0, \"gasPrice\"),\n formatNumber(tx.gasLimit, \"gasLimit\"),\n (tx.to || \"0x\"),\n formatNumber(tx.value, \"value\"),\n tx.data,\n ];\n let chainId = BN_0;\n if (tx.chainId != BN_0) {\n // A chainId was provided; if non-zero we'll use EIP-155\n chainId = getBigInt(tx.chainId, \"tx.chainId\");\n // We have a chainId in the tx and an EIP-155 v in the signature,\n // make sure they agree with each other\n assertArgument(!sig || sig.networkV == null || sig.legacyChainId === chainId, \"tx.chainId/sig.v mismatch\", \"sig\", sig);\n }\n else if (tx.signature) {\n // No explicit chainId, but EIP-155 have a derived implicit chainId\n const legacy = tx.signature.legacyChainId;\n if (legacy != null) {\n chainId = legacy;\n }\n }\n // Requesting an unsigned transaction\n if (!sig) {\n // We have an EIP-155 transaction (chainId was specified and non-zero)\n if (chainId !== BN_0) {\n fields.push(toBeArray(chainId));\n fields.push(\"0x\");\n fields.push(\"0x\");\n }\n return encodeRlp(fields);\n }\n // @TODO: We should probably check that tx.signature, chainId, and sig\n // match but that logic could break existing code, so schedule\n // this for the next major bump.\n // Compute the EIP-155 v\n let v = BigInt(27 + sig.yParity);\n if (chainId !== BN_0) {\n v = Signature.getChainIdV(chainId, sig.v);\n }\n else if (BigInt(sig.v) !== v) {\n assertArgument(false, \"tx.chainId/sig.v mismatch\", \"sig\", sig);\n }\n // Add the signature\n fields.push(toBeArray(v));\n fields.push(toBeArray(sig.r));\n fields.push(toBeArray(sig.s));\n return encodeRlp(fields);\n}\nfunction _parseEipSignature(tx, fields) {\n let yParity;\n try {\n yParity = handleNumber(fields[0], \"yParity\");\n if (yParity !== 0 && yParity !== 1) {\n throw new Error(\"bad yParity\");\n }\n }\n catch (error) {\n assertArgument(false, \"invalid yParity\", \"yParity\", fields[0]);\n }\n const r = zeroPadValue(fields[1], 32);\n const s = zeroPadValue(fields[2], 32);\n const signature = Signature.from({ r, s, yParity });\n tx.signature = signature;\n}\nfunction _parseEip1559(data) {\n const fields = decodeRlp(getBytes(data).slice(1));\n assertArgument(Array.isArray(fields) && (fields.length === 9 || fields.length === 12), \"invalid field count for transaction type: 2\", \"data\", hexlify(data));\n const tx = {\n type: 2,\n chainId: handleUint(fields[0], \"chainId\"),\n nonce: handleNumber(fields[1], \"nonce\"),\n maxPriorityFeePerGas: handleUint(fields[2], \"maxPriorityFeePerGas\"),\n maxFeePerGas: handleUint(fields[3], \"maxFeePerGas\"),\n gasPrice: null,\n gasLimit: handleUint(fields[4], \"gasLimit\"),\n to: handleAddress(fields[5]),\n value: handleUint(fields[6], \"value\"),\n data: hexlify(fields[7]),\n accessList: handleAccessList(fields[8], \"accessList\"),\n };\n // Unsigned EIP-1559 Transaction\n if (fields.length === 9) {\n return tx;\n }\n //tx.hash = keccak256(data);\n _parseEipSignature(tx, fields.slice(9));\n return tx;\n}\nfunction _serializeEip1559(tx, sig) {\n const fields = [\n formatNumber(tx.chainId, \"chainId\"),\n formatNumber(tx.nonce, \"nonce\"),\n formatNumber(tx.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n formatNumber(tx.maxFeePerGas || 0, \"maxFeePerGas\"),\n formatNumber(tx.gasLimit, \"gasLimit\"),\n (tx.to || \"0x\"),\n formatNumber(tx.value, \"value\"),\n tx.data,\n formatAccessList(tx.accessList || [])\n ];\n if (sig) {\n fields.push(formatNumber(sig.yParity, \"yParity\"));\n fields.push(toBeArray(sig.r));\n fields.push(toBeArray(sig.s));\n }\n return concat([\"0x02\", encodeRlp(fields)]);\n}\nfunction _parseEip2930(data) {\n const fields = decodeRlp(getBytes(data).slice(1));\n assertArgument(Array.isArray(fields) && (fields.length === 8 || fields.length === 11), \"invalid field count for transaction type: 1\", \"data\", hexlify(data));\n const tx = {\n type: 1,\n chainId: handleUint(fields[0], \"chainId\"),\n nonce: handleNumber(fields[1], \"nonce\"),\n gasPrice: handleUint(fields[2], \"gasPrice\"),\n gasLimit: handleUint(fields[3], \"gasLimit\"),\n to: handleAddress(fields[4]),\n value: handleUint(fields[5], \"value\"),\n data: hexlify(fields[6]),\n accessList: handleAccessList(fields[7], \"accessList\")\n };\n // Unsigned EIP-2930 Transaction\n if (fields.length === 8) {\n return tx;\n }\n //tx.hash = keccak256(data);\n _parseEipSignature(tx, fields.slice(8));\n return tx;\n}\nfunction _serializeEip2930(tx, sig) {\n const fields = [\n formatNumber(tx.chainId, \"chainId\"),\n formatNumber(tx.nonce, \"nonce\"),\n formatNumber(tx.gasPrice || 0, \"gasPrice\"),\n formatNumber(tx.gasLimit, \"gasLimit\"),\n (tx.to || \"0x\"),\n formatNumber(tx.value, \"value\"),\n tx.data,\n formatAccessList(tx.accessList || [])\n ];\n if (sig) {\n fields.push(formatNumber(sig.yParity, \"recoveryParam\"));\n fields.push(toBeArray(sig.r));\n fields.push(toBeArray(sig.s));\n }\n return concat([\"0x01\", encodeRlp(fields)]);\n}\nfunction _parseEip4844(data) {\n let fields = decodeRlp(getBytes(data).slice(1));\n let typeName = \"3\";\n let blobs = null;\n // Parse the network format\n if (fields.length === 4 && Array.isArray(fields[0])) {\n typeName = \"3 (network format)\";\n const fBlobs = fields[1], fCommits = fields[2], fProofs = fields[3];\n assertArgument(Array.isArray(fBlobs), \"invalid network format: blobs not an array\", \"fields[1]\", fBlobs);\n assertArgument(Array.isArray(fCommits), \"invalid network format: commitments not an array\", \"fields[2]\", fCommits);\n assertArgument(Array.isArray(fProofs), \"invalid network format: proofs not an array\", \"fields[3]\", fProofs);\n assertArgument(fBlobs.length === fCommits.length, \"invalid network format: blobs/commitments length mismatch\", \"fields\", fields);\n assertArgument(fBlobs.length === fProofs.length, \"invalid network format: blobs/proofs length mismatch\", \"fields\", fields);\n blobs = [];\n for (let i = 0; i < fields[1].length; i++) {\n blobs.push({\n data: fBlobs[i],\n commitment: fCommits[i],\n proof: fProofs[i],\n });\n }\n fields = fields[0];\n }\n assertArgument(Array.isArray(fields) && (fields.length === 11 || fields.length === 14), `invalid field count for transaction type: ${typeName}`, \"data\", hexlify(data));\n const tx = {\n type: 3,\n chainId: handleUint(fields[0], \"chainId\"),\n nonce: handleNumber(fields[1], \"nonce\"),\n maxPriorityFeePerGas: handleUint(fields[2], \"maxPriorityFeePerGas\"),\n maxFeePerGas: handleUint(fields[3], \"maxFeePerGas\"),\n gasPrice: null,\n gasLimit: handleUint(fields[4], \"gasLimit\"),\n to: handleAddress(fields[5]),\n value: handleUint(fields[6], \"value\"),\n data: hexlify(fields[7]),\n accessList: handleAccessList(fields[8], \"accessList\"),\n maxFeePerBlobGas: handleUint(fields[9], \"maxFeePerBlobGas\"),\n blobVersionedHashes: fields[10]\n };\n if (blobs) {\n tx.blobs = blobs;\n }\n assertArgument(tx.to != null, `invalid address for transaction type: ${typeName}`, \"data\", data);\n assertArgument(Array.isArray(tx.blobVersionedHashes), \"invalid blobVersionedHashes: must be an array\", \"data\", data);\n for (let i = 0; i < tx.blobVersionedHashes.length; i++) {\n assertArgument(isHexString(tx.blobVersionedHashes[i], 32), `invalid blobVersionedHash at index ${i}: must be length 32`, \"data\", data);\n }\n // Unsigned EIP-4844 Transaction\n if (fields.length === 11) {\n return tx;\n }\n // @TODO: Do we need to do this? This is only called internally\n // and used to verify hashes; it might save time to not do this\n //tx.hash = keccak256(concat([ \"0x03\", encodeRlp(fields) ]));\n _parseEipSignature(tx, fields.slice(11));\n return tx;\n}\nfunction _serializeEip4844(tx, sig, blobs) {\n const fields = [\n formatNumber(tx.chainId, \"chainId\"),\n formatNumber(tx.nonce, \"nonce\"),\n formatNumber(tx.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n formatNumber(tx.maxFeePerGas || 0, \"maxFeePerGas\"),\n formatNumber(tx.gasLimit, \"gasLimit\"),\n (tx.to || ZeroAddress),\n formatNumber(tx.value, \"value\"),\n tx.data,\n formatAccessList(tx.accessList || []),\n formatNumber(tx.maxFeePerBlobGas || 0, \"maxFeePerBlobGas\"),\n formatHashes(tx.blobVersionedHashes || [], \"blobVersionedHashes\")\n ];\n if (sig) {\n fields.push(formatNumber(sig.yParity, \"yParity\"));\n fields.push(toBeArray(sig.r));\n fields.push(toBeArray(sig.s));\n // We have blobs; return the network wrapped format\n if (blobs) {\n return concat([\n \"0x03\",\n encodeRlp([\n fields,\n blobs.map((b) => b.data),\n blobs.map((b) => b.commitment),\n blobs.map((b) => b.proof),\n ])\n ]);\n }\n }\n return concat([\"0x03\", encodeRlp(fields)]);\n}\nfunction _parseEip7702(data) {\n const fields = decodeRlp(getBytes(data).slice(1));\n assertArgument(Array.isArray(fields) && (fields.length === 10 || fields.length === 13), \"invalid field count for transaction type: 4\", \"data\", hexlify(data));\n const tx = {\n type: 4,\n chainId: handleUint(fields[0], \"chainId\"),\n nonce: handleNumber(fields[1], \"nonce\"),\n maxPriorityFeePerGas: handleUint(fields[2], \"maxPriorityFeePerGas\"),\n maxFeePerGas: handleUint(fields[3], \"maxFeePerGas\"),\n gasPrice: null,\n gasLimit: handleUint(fields[4], \"gasLimit\"),\n to: handleAddress(fields[5]),\n value: handleUint(fields[6], \"value\"),\n data: hexlify(fields[7]),\n accessList: handleAccessList(fields[8], \"accessList\"),\n authorizationList: handleAuthorizationList(fields[9], \"authorizationList\"),\n };\n // Unsigned EIP-7702 Transaction\n if (fields.length === 10) {\n return tx;\n }\n _parseEipSignature(tx, fields.slice(10));\n return tx;\n}\nfunction _serializeEip7702(tx, sig) {\n const fields = [\n formatNumber(tx.chainId, \"chainId\"),\n formatNumber(tx.nonce, \"nonce\"),\n formatNumber(tx.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n formatNumber(tx.maxFeePerGas || 0, \"maxFeePerGas\"),\n formatNumber(tx.gasLimit, \"gasLimit\"),\n (tx.to || \"0x\"),\n formatNumber(tx.value, \"value\"),\n tx.data,\n formatAccessList(tx.accessList || []),\n formatAuthorizationList(tx.authorizationList || [])\n ];\n if (sig) {\n fields.push(formatNumber(sig.yParity, \"yParity\"));\n fields.push(toBeArray(sig.r));\n fields.push(toBeArray(sig.s));\n }\n return concat([\"0x04\", encodeRlp(fields)]);\n}\n/**\n * A **Transaction** describes an operation to be executed on\n * Ethereum by an Externally Owned Account (EOA). It includes\n * who (the [[to]] address), what (the [[data]]) and how much (the\n * [[value]] in ether) the operation should entail.\n *\n * @example:\n * tx = new Transaction()\n * //_result:\n *\n * tx.data = \"0x1234\";\n * //_result:\n */\nexport class Transaction {\n #type;\n #to;\n #data;\n #nonce;\n #gasLimit;\n #gasPrice;\n #maxPriorityFeePerGas;\n #maxFeePerGas;\n #value;\n #chainId;\n #sig;\n #accessList;\n #maxFeePerBlobGas;\n #blobVersionedHashes;\n #kzg;\n #blobs;\n #auths;\n /**\n * The transaction type.\n *\n * If null, the type will be automatically inferred based on\n * explicit properties.\n */\n get type() { return this.#type; }\n set type(value) {\n switch (value) {\n case null:\n this.#type = null;\n break;\n case 0:\n case \"legacy\":\n this.#type = 0;\n break;\n case 1:\n case \"berlin\":\n case \"eip-2930\":\n this.#type = 1;\n break;\n case 2:\n case \"london\":\n case \"eip-1559\":\n this.#type = 2;\n break;\n case 3:\n case \"cancun\":\n case \"eip-4844\":\n this.#type = 3;\n break;\n case 4:\n case \"pectra\":\n case \"eip-7702\":\n this.#type = 4;\n break;\n default:\n assertArgument(false, \"unsupported transaction type\", \"type\", value);\n }\n }\n /**\n * The name of the transaction type.\n */\n get typeName() {\n switch (this.type) {\n case 0: return \"legacy\";\n case 1: return \"eip-2930\";\n case 2: return \"eip-1559\";\n case 3: return \"eip-4844\";\n case 4: return \"eip-7702\";\n }\n return null;\n }\n /**\n * The ``to`` address for the transaction or ``null`` if the\n * transaction is an ``init`` transaction.\n */\n get to() {\n const value = this.#to;\n if (value == null && this.type === 3) {\n return ZeroAddress;\n }\n return value;\n }\n set to(value) {\n this.#to = (value == null) ? null : getAddress(value);\n }\n /**\n * The transaction nonce.\n */\n get nonce() { return this.#nonce; }\n set nonce(value) { this.#nonce = getNumber(value, \"value\"); }\n /**\n * The gas limit.\n */\n get gasLimit() { return this.#gasLimit; }\n set gasLimit(value) { this.#gasLimit = getBigInt(value); }\n /**\n * The gas price.\n *\n * On legacy networks this defines the fee that will be paid. On\n * EIP-1559 networks, this should be ``null``.\n */\n get gasPrice() {\n const value = this.#gasPrice;\n if (value == null && (this.type === 0 || this.type === 1)) {\n return BN_0;\n }\n return value;\n }\n set gasPrice(value) {\n this.#gasPrice = (value == null) ? null : getBigInt(value, \"gasPrice\");\n }\n /**\n * The maximum priority fee per unit of gas to pay. On legacy\n * networks this should be ``null``.\n */\n get maxPriorityFeePerGas() {\n const value = this.#maxPriorityFeePerGas;\n if (value == null) {\n if (this.type === 2 || this.type === 3) {\n return BN_0;\n }\n return null;\n }\n return value;\n }\n set maxPriorityFeePerGas(value) {\n this.#maxPriorityFeePerGas = (value == null) ? null : getBigInt(value, \"maxPriorityFeePerGas\");\n }\n /**\n * The maximum total fee per unit of gas to pay. On legacy\n * networks this should be ``null``.\n */\n get maxFeePerGas() {\n const value = this.#maxFeePerGas;\n if (value == null) {\n if (this.type === 2 || this.type === 3) {\n return BN_0;\n }\n return null;\n }\n return value;\n }\n set maxFeePerGas(value) {\n this.#maxFeePerGas = (value == null) ? null : getBigInt(value, \"maxFeePerGas\");\n }\n /**\n * The transaction data. For ``init`` transactions this is the\n * deployment code.\n */\n get data() { return this.#data; }\n set data(value) { this.#data = hexlify(value); }\n /**\n * The amount of ether (in wei) to send in this transactions.\n */\n get value() { return this.#value; }\n set value(value) {\n this.#value = getBigInt(value, \"value\");\n }\n /**\n * The chain ID this transaction is valid on.\n */\n get chainId() { return this.#chainId; }\n set chainId(value) { this.#chainId = getBigInt(value); }\n /**\n * If signed, the signature for this transaction.\n */\n get signature() { return this.#sig || null; }\n set signature(value) {\n this.#sig = (value == null) ? null : Signature.from(value);\n }\n /**\n * The access list.\n *\n * An access list permits discounted (but pre-paid) access to\n * bytecode and state variable access within contract execution.\n */\n get accessList() {\n const value = this.#accessList || null;\n if (value == null) {\n if (this.type === 1 || this.type === 2 || this.type === 3) {\n // @TODO: in v7, this should assign the value or become\n // a live object itself, otherwise mutation is inconsistent\n return [];\n }\n return null;\n }\n return value;\n }\n set accessList(value) {\n this.#accessList = (value == null) ? null : accessListify(value);\n }\n get authorizationList() {\n const value = this.#auths || null;\n if (value == null) {\n if (this.type === 4) {\n // @TODO: in v7, this should become a live object itself,\n // otherwise mutation is inconsistent\n return [];\n }\n }\n return value;\n }\n set authorizationList(auths) {\n this.#auths = (auths == null) ? null : auths.map((a) => authorizationify(a));\n }\n /**\n * The max fee per blob gas for Cancun transactions.\n */\n get maxFeePerBlobGas() {\n const value = this.#maxFeePerBlobGas;\n if (value == null && this.type === 3) {\n return BN_0;\n }\n return value;\n }\n set maxFeePerBlobGas(value) {\n this.#maxFeePerBlobGas = (value == null) ? null : getBigInt(value, \"maxFeePerBlobGas\");\n }\n /**\n * The BLOb versioned hashes for Cancun transactions.\n */\n get blobVersionedHashes() {\n // @TODO: Mutation is inconsistent; if unset, the returned value\n // cannot mutate the object, if set it can\n let value = this.#blobVersionedHashes;\n if (value == null && this.type === 3) {\n return [];\n }\n return value;\n }\n set blobVersionedHashes(value) {\n if (value != null) {\n assertArgument(Array.isArray(value), \"blobVersionedHashes must be an Array\", \"value\", value);\n value = value.slice();\n for (let i = 0; i < value.length; i++) {\n assertArgument(isHexString(value[i], 32), \"invalid blobVersionedHash\", `value[${i}]`, value[i]);\n }\n }\n this.#blobVersionedHashes = value;\n }\n /**\n * The BLObs for the Transaction, if any.\n *\n * If ``blobs`` is non-``null``, then the [[seriailized]]\n * will return the network formatted sidecar, otherwise it\n * will return the standard [[link-eip-2718]] payload. The\n * [[unsignedSerialized]] is unaffected regardless.\n *\n * When setting ``blobs``, either fully valid [[Blob]] objects\n * may be specified (i.e. correctly padded, with correct\n * committments and proofs) or a raw [[BytesLike]] may\n * be provided.\n *\n * If raw [[BytesLike]] are provided, the [[kzg]] property **must**\n * be already set. The blob will be correctly padded and the\n * [[KzgLibrary]] will be used to compute the committment and\n * proof for the blob.\n *\n * A BLOb is a sequence of field elements, each of which must\n * be within the BLS field modulo, so some additional processing\n * may be required to encode arbitrary data to ensure each 32 byte\n * field is within the valid range.\n *\n * Setting this automatically populates [[blobVersionedHashes]],\n * overwriting any existing values. Setting this to ``null``\n * does **not** remove the [[blobVersionedHashes]], leaving them\n * present.\n */\n get blobs() {\n if (this.#blobs == null) {\n return null;\n }\n return this.#blobs.map((b) => Object.assign({}, b));\n }\n set blobs(_blobs) {\n if (_blobs == null) {\n this.#blobs = null;\n return;\n }\n const blobs = [];\n const versionedHashes = [];\n for (let i = 0; i < _blobs.length; i++) {\n const blob = _blobs[i];\n if (isBytesLike(blob)) {\n assert(this.#kzg, \"adding a raw blob requires a KZG library\", \"UNSUPPORTED_OPERATION\", {\n operation: \"set blobs()\"\n });\n let data = getBytes(blob);\n assertArgument(data.length <= BLOB_SIZE, \"blob is too large\", `blobs[${i}]`, blob);\n // Pad blob if necessary\n if (data.length !== BLOB_SIZE) {\n const padded = new Uint8Array(BLOB_SIZE);\n padded.set(data);\n data = padded;\n }\n const commit = this.#kzg.blobToKzgCommitment(data);\n const proof = hexlify(this.#kzg.computeBlobKzgProof(data, commit));\n blobs.push({\n data: hexlify(data),\n commitment: hexlify(commit),\n proof\n });\n versionedHashes.push(getVersionedHash(1, commit));\n }\n else {\n const commit = hexlify(blob.commitment);\n blobs.push({\n data: hexlify(blob.data),\n commitment: commit,\n proof: hexlify(blob.proof)\n });\n versionedHashes.push(getVersionedHash(1, commit));\n }\n }\n this.#blobs = blobs;\n this.#blobVersionedHashes = versionedHashes;\n }\n get kzg() { return this.#kzg; }\n set kzg(kzg) {\n if (kzg == null) {\n this.#kzg = null;\n }\n else {\n this.#kzg = getKzgLibrary(kzg);\n }\n }\n /**\n * Creates a new Transaction with default values.\n */\n constructor() {\n this.#type = null;\n this.#to = null;\n this.#nonce = 0;\n this.#gasLimit = BN_0;\n this.#gasPrice = null;\n this.#maxPriorityFeePerGas = null;\n this.#maxFeePerGas = null;\n this.#data = \"0x\";\n this.#value = BN_0;\n this.#chainId = BN_0;\n this.#sig = null;\n this.#accessList = null;\n this.#maxFeePerBlobGas = null;\n this.#blobVersionedHashes = null;\n this.#kzg = null;\n this.#blobs = null;\n this.#auths = null;\n }\n /**\n * The transaction hash, if signed. Otherwise, ``null``.\n */\n get hash() {\n if (this.signature == null) {\n return null;\n }\n return keccak256(this.#getSerialized(true, false));\n }\n /**\n * The pre-image hash of this transaction.\n *\n * This is the digest that a [[Signer]] must sign to authorize\n * this transaction.\n */\n get unsignedHash() {\n return keccak256(this.unsignedSerialized);\n }\n /**\n * The sending address, if signed. Otherwise, ``null``.\n */\n get from() {\n if (this.signature == null) {\n return null;\n }\n return recoverAddress(this.unsignedHash, this.signature);\n }\n /**\n * The public key of the sender, if signed. Otherwise, ``null``.\n */\n get fromPublicKey() {\n if (this.signature == null) {\n return null;\n }\n return SigningKey.recoverPublicKey(this.unsignedHash, this.signature);\n }\n /**\n * Returns true if signed.\n *\n * This provides a Type Guard that properties requiring a signed\n * transaction are non-null.\n */\n isSigned() {\n return this.signature != null;\n }\n #getSerialized(signed, sidecar) {\n assert(!signed || this.signature != null, \"cannot serialize unsigned transaction; maybe you meant .unsignedSerialized\", \"UNSUPPORTED_OPERATION\", { operation: \".serialized\" });\n const sig = signed ? this.signature : null;\n switch (this.inferType()) {\n case 0:\n return _serializeLegacy(this, sig);\n case 1:\n return _serializeEip2930(this, sig);\n case 2:\n return _serializeEip1559(this, sig);\n case 3:\n return _serializeEip4844(this, sig, sidecar ? this.blobs : null);\n case 4:\n return _serializeEip7702(this, sig);\n }\n assert(false, \"unsupported transaction type\", \"UNSUPPORTED_OPERATION\", { operation: \".serialized\" });\n }\n /**\n * The serialized transaction.\n *\n * This throws if the transaction is unsigned. For the pre-image,\n * use [[unsignedSerialized]].\n */\n get serialized() {\n return this.#getSerialized(true, true);\n }\n /**\n * The transaction pre-image.\n *\n * The hash of this is the digest which needs to be signed to\n * authorize this transaction.\n */\n get unsignedSerialized() {\n return this.#getSerialized(false, false);\n }\n /**\n * Return the most \"likely\" type; currently the highest\n * supported transaction type.\n */\n inferType() {\n const types = this.inferTypes();\n // Prefer London (EIP-1559) over Cancun (BLOb)\n if (types.indexOf(2) >= 0) {\n return 2;\n }\n // Return the highest inferred type\n return (types.pop());\n }\n /**\n * Validates the explicit properties and returns a list of compatible\n * transaction types.\n */\n inferTypes() {\n // Checks that there are no conflicting properties set\n const hasGasPrice = this.gasPrice != null;\n const hasFee = (this.maxFeePerGas != null || this.maxPriorityFeePerGas != null);\n const hasAccessList = (this.accessList != null);\n const hasBlob = (this.#maxFeePerBlobGas != null || this.#blobVersionedHashes);\n //if (hasGasPrice && hasFee) {\n // throw new Error(\"transaction cannot have gasPrice and maxFeePerGas\");\n //}\n if (this.maxFeePerGas != null && this.maxPriorityFeePerGas != null) {\n assert(this.maxFeePerGas >= this.maxPriorityFeePerGas, \"priorityFee cannot be more than maxFee\", \"BAD_DATA\", { value: this });\n }\n //if (this.type === 2 && hasGasPrice) {\n // throw new Error(\"eip-1559 transaction cannot have gasPrice\");\n //}\n assert(!hasFee || (this.type !== 0 && this.type !== 1), \"transaction type cannot have maxFeePerGas or maxPriorityFeePerGas\", \"BAD_DATA\", { value: this });\n assert(this.type !== 0 || !hasAccessList, \"legacy transaction cannot have accessList\", \"BAD_DATA\", { value: this });\n const types = [];\n // Explicit type\n if (this.type != null) {\n types.push(this.type);\n }\n else {\n if (this.authorizationList && this.authorizationList.length) {\n types.push(4);\n }\n else if (hasFee) {\n types.push(2);\n }\n else if (hasGasPrice) {\n types.push(1);\n if (!hasAccessList) {\n types.push(0);\n }\n }\n else if (hasAccessList) {\n types.push(1);\n types.push(2);\n }\n else if (hasBlob && this.to) {\n types.push(3);\n }\n else {\n types.push(0);\n types.push(1);\n types.push(2);\n types.push(3);\n }\n }\n types.sort();\n return types;\n }\n /**\n * Returns true if this transaction is a legacy transaction (i.e.\n * ``type === 0``).\n *\n * This provides a Type Guard that the related properties are\n * non-null.\n */\n isLegacy() {\n return (this.type === 0);\n }\n /**\n * Returns true if this transaction is berlin hardform transaction (i.e.\n * ``type === 1``).\n *\n * This provides a Type Guard that the related properties are\n * non-null.\n */\n isBerlin() {\n return (this.type === 1);\n }\n /**\n * Returns true if this transaction is london hardform transaction (i.e.\n * ``type === 2``).\n *\n * This provides a Type Guard that the related properties are\n * non-null.\n */\n isLondon() {\n return (this.type === 2);\n }\n /**\n * Returns true if this transaction is an [[link-eip-4844]] BLOB\n * transaction.\n *\n * This provides a Type Guard that the related properties are\n * non-null.\n */\n isCancun() {\n return (this.type === 3);\n }\n /**\n * Create a copy of this transaciton.\n */\n clone() {\n return Transaction.from(this);\n }\n /**\n * Return a JSON-friendly object.\n */\n toJSON() {\n const s = (v) => {\n if (v == null) {\n return null;\n }\n return v.toString();\n };\n return {\n type: this.type,\n to: this.to,\n // from: this.from,\n data: this.data,\n nonce: this.nonce,\n gasLimit: s(this.gasLimit),\n gasPrice: s(this.gasPrice),\n maxPriorityFeePerGas: s(this.maxPriorityFeePerGas),\n maxFeePerGas: s(this.maxFeePerGas),\n value: s(this.value),\n chainId: s(this.chainId),\n sig: this.signature ? this.signature.toJSON() : null,\n accessList: this.accessList\n };\n }\n /**\n * Create a **Transaction** from a serialized transaction or a\n * Transaction-like object.\n */\n static from(tx) {\n if (tx == null) {\n return new Transaction();\n }\n if (typeof (tx) === \"string\") {\n const payload = getBytes(tx);\n if (payload[0] >= 0x7f) { // @TODO: > vs >= ??\n return Transaction.from(_parseLegacy(payload));\n }\n switch (payload[0]) {\n case 1: return Transaction.from(_parseEip2930(payload));\n case 2: return Transaction.from(_parseEip1559(payload));\n case 3: return Transaction.from(_parseEip4844(payload));\n case 4: return Transaction.from(_parseEip7702(payload));\n }\n assert(false, \"unsupported transaction type\", \"UNSUPPORTED_OPERATION\", { operation: \"from\" });\n }\n const result = new Transaction();\n if (tx.type != null) {\n result.type = tx.type;\n }\n if (tx.to != null) {\n result.to = tx.to;\n }\n if (tx.nonce != null) {\n result.nonce = tx.nonce;\n }\n if (tx.gasLimit != null) {\n result.gasLimit = tx.gasLimit;\n }\n if (tx.gasPrice != null) {\n result.gasPrice = tx.gasPrice;\n }\n if (tx.maxPriorityFeePerGas != null) {\n result.maxPriorityFeePerGas = tx.maxPriorityFeePerGas;\n }\n if (tx.maxFeePerGas != null) {\n result.maxFeePerGas = tx.maxFeePerGas;\n }\n if (tx.maxFeePerBlobGas != null) {\n result.maxFeePerBlobGas = tx.maxFeePerBlobGas;\n }\n if (tx.data != null) {\n result.data = tx.data;\n }\n if (tx.value != null) {\n result.value = tx.value;\n }\n if (tx.chainId != null) {\n result.chainId = tx.chainId;\n }\n if (tx.signature != null) {\n result.signature = Signature.from(tx.signature);\n }\n if (tx.accessList != null) {\n result.accessList = tx.accessList;\n }\n if (tx.authorizationList != null) {\n result.authorizationList = tx.authorizationList;\n }\n // This will get overwritten by blobs, if present\n if (tx.blobVersionedHashes != null) {\n result.blobVersionedHashes = tx.blobVersionedHashes;\n }\n // Make sure we assign the kzg before assigning blobs, which\n // require the library in the event raw blob data is provided.\n if (tx.kzg != null) {\n result.kzg = tx.kzg;\n }\n if (tx.blobs != null) {\n result.blobs = tx.blobs;\n }\n if (tx.hash != null) {\n assertArgument(result.isSigned(), \"unsigned transaction cannot define '.hash'\", \"tx\", tx);\n assertArgument(result.hash === tx.hash, \"hash mismatch\", \"tx\", tx);\n }\n if (tx.from != null) {\n assertArgument(result.isSigned(), \"unsigned transaction cannot define '.from'\", \"tx\", tx);\n assertArgument(result.from.toLowerCase() === (tx.from || \"\").toLowerCase(), \"from mismatch\", \"tx\", tx);\n }\n return result;\n }\n}\n//# sourceMappingURL=transaction.js.map","import { getAddress } from \"../address/index.js\";\nimport { keccak256 } from \"../crypto/index.js\";\nimport { recoverAddress } from \"../transaction/index.js\";\nimport { assertArgument, concat, encodeRlp, toBeArray } from \"../utils/index.js\";\n/**\n * Computes the [[link-eip-7702]] authorization digest to sign.\n */\nexport function hashAuthorization(auth) {\n assertArgument(typeof (auth.address) === \"string\", \"invalid address for hashAuthorization\", \"auth.address\", auth);\n return keccak256(concat([\n \"0x05\", encodeRlp([\n (auth.chainId != null) ? toBeArray(auth.chainId) : \"0x\",\n getAddress(auth.address),\n (auth.nonce != null) ? toBeArray(auth.nonce) : \"0x\",\n ])\n ]));\n}\n/**\n * Return the address of the private key that produced\n * the signature %%sig%% during signing for %%message%%.\n */\nexport function verifyAuthorization(auth, sig) {\n return recoverAddress(hashAuthorization(auth), sig);\n}\n//# sourceMappingURL=authorization.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { toUtf8Bytes } from \"../utils/index.js\";\n/**\n * A simple hashing function which operates on UTF-8 strings to\n * compute an 32-byte identifier.\n *\n * This simply computes the [UTF-8 bytes](toUtf8Bytes) and computes\n * the [[keccak256]].\n *\n * @example:\n * id(\"hello world\")\n * //_result:\n */\nexport function id(value) {\n return keccak256(toUtf8Bytes(value));\n}\n//# sourceMappingURL=id.js.map","// created 2023-09-25T01:01:55.148Z\n// compressed base64-encoded blob for include-ens data\n// source: https://github.com/adraffy/ens-normalize.js/blob/main/src/make.js\n// see: https://github.com/adraffy/ens-normalize.js#security\n// SHA-256: 0565ed049b9cf1614bb9e11ba7d8ac6a6fb96c893253d890f7e2b2884b9ded32\nvar COMPRESSED$1 = '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';\nconst FENCED = new Map([[8217,\"apostrophe\"],[8260,\"fraction slash\"],[12539,\"middle dot\"]]);\nconst NSM_MAX = 4;\n\nfunction decode_arithmetic(bytes) {\r\n\tlet pos = 0;\r\n\tfunction u16() { return (bytes[pos++] << 8) | bytes[pos++]; }\r\n\t\r\n\t// decode the frequency table\r\n\tlet symbol_count = u16();\r\n\tlet total = 1;\r\n\tlet acc = [0, 1]; // first symbol has frequency 1\r\n\tfor (let i = 1; i < symbol_count; i++) {\r\n\t\tacc.push(total += u16());\r\n\t}\r\n\r\n\t// skip the sized-payload that the last 3 symbols index into\r\n\tlet skip = u16();\r\n\tlet pos_payload = pos;\r\n\tpos += skip;\r\n\r\n\tlet read_width = 0;\r\n\tlet read_buffer = 0; \r\n\tfunction read_bit() {\r\n\t\tif (read_width == 0) {\r\n\t\t\t// this will read beyond end of buffer\r\n\t\t\t// but (undefined|0) => zero pad\r\n\t\t\tread_buffer = (read_buffer << 8) | bytes[pos++];\r\n\t\t\tread_width = 8;\r\n\t\t}\r\n\t\treturn (read_buffer >> --read_width) & 1;\r\n\t}\r\n\r\n\tconst N = 31;\r\n\tconst FULL = 2**N;\r\n\tconst HALF = FULL >>> 1;\r\n\tconst QRTR = HALF >> 1;\r\n\tconst MASK = FULL - 1;\r\n\r\n\t// fill register\r\n\tlet register = 0;\r\n\tfor (let i = 0; i < N; i++) register = (register << 1) | read_bit();\r\n\r\n\tlet symbols = [];\r\n\tlet low = 0;\r\n\tlet range = FULL; // treat like a float\r\n\twhile (true) {\r\n\t\tlet value = Math.floor((((register - low + 1) * total) - 1) / range);\r\n\t\tlet start = 0;\r\n\t\tlet end = symbol_count;\r\n\t\twhile (end - start > 1) { // binary search\r\n\t\t\tlet mid = (start + end) >>> 1;\r\n\t\t\tif (value < acc[mid]) {\r\n\t\t\t\tend = mid;\r\n\t\t\t} else {\r\n\t\t\t\tstart = mid;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (start == 0) break; // first symbol is end mark\r\n\t\tsymbols.push(start);\r\n\t\tlet a = low + Math.floor(range * acc[start] / total);\r\n\t\tlet b = low + Math.floor(range * acc[start+1] / total) - 1;\r\n\t\twhile (((a ^ b) & HALF) == 0) {\r\n\t\t\tregister = (register << 1) & MASK | read_bit();\r\n\t\t\ta = (a << 1) & MASK;\r\n\t\t\tb = (b << 1) & MASK | 1;\r\n\t\t}\r\n\t\twhile (a & ~b & QRTR) {\r\n\t\t\tregister = (register & HALF) | ((register << 1) & (MASK >>> 1)) | read_bit();\r\n\t\t\ta = (a << 1) ^ HALF;\r\n\t\t\tb = ((b ^ HALF) << 1) | HALF | 1;\r\n\t\t}\r\n\t\tlow = a;\r\n\t\trange = 1 + b - a;\r\n\t}\r\n\tlet offset = symbol_count - 4;\r\n\treturn symbols.map(x => { // index into payload\r\n\t\tswitch (x - offset) {\r\n\t\t\tcase 3: return offset + 0x10100 + ((bytes[pos_payload++] << 16) | (bytes[pos_payload++] << 8) | bytes[pos_payload++]);\r\n\t\t\tcase 2: return offset + 0x100 + ((bytes[pos_payload++] << 8) | bytes[pos_payload++]);\r\n\t\t\tcase 1: return offset + bytes[pos_payload++];\r\n\t\t\tdefault: return x - 1;\r\n\t\t}\r\n\t});\r\n}\t\r\n\r\n// returns an iterator which returns the next symbol\r\nfunction read_payload(v) {\r\n\tlet pos = 0;\r\n\treturn () => v[pos++];\r\n}\r\nfunction read_compressed_payload(s) {\r\n\treturn read_payload(decode_arithmetic(unsafe_atob(s)));\r\n}\r\n\r\n// unsafe in the sense:\r\n// expected well-formed Base64 w/o padding \r\n// 20220922: added for https://github.com/adraffy/ens-normalize.js/issues/4\r\nfunction unsafe_atob(s) {\r\n\tlet lookup = [];\r\n\t[...'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'].forEach((c, i) => lookup[c.charCodeAt(0)] = i);\r\n\tlet n = s.length;\r\n\tlet ret = new Uint8Array((6 * n) >> 3);\r\n\tfor (let i = 0, pos = 0, width = 0, carry = 0; i < n; i++) {\r\n\t\tcarry = (carry << 6) | lookup[s.charCodeAt(i)];\r\n\t\twidth += 6;\r\n\t\tif (width >= 8) {\r\n\t\t\tret[pos++] = (carry >> (width -= 8));\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\n// eg. [0,1,2,3...] => [0,-1,1,-2,...]\r\nfunction signed(i) { \r\n\treturn (i & 1) ? (~i >> 1) : (i >> 1);\r\n}\r\n\r\nfunction read_deltas(n, next) {\r\n\tlet v = Array(n);\r\n\tfor (let i = 0, x = 0; i < n; i++) v[i] = x += signed(next());\r\n\treturn v;\r\n}\r\n\r\n// [123][5] => [0 3] [1 1] [0 0]\r\nfunction read_sorted(next, prev = 0) {\r\n\tlet ret = [];\r\n\twhile (true) {\r\n\t\tlet x = next();\r\n\t\tlet n = next();\r\n\t\tif (!n) break;\r\n\t\tprev += x;\r\n\t\tfor (let i = 0; i < n; i++) {\r\n\t\t\tret.push(prev + i);\r\n\t\t}\r\n\t\tprev += n + 1;\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\nfunction read_sorted_arrays(next) {\r\n\treturn read_array_while(() => { \r\n\t\tlet v = read_sorted(next);\r\n\t\tif (v.length) return v;\r\n\t});\r\n}\r\n\r\n// returns map of x => ys\r\nfunction read_mapped(next) {\r\n\tlet ret = [];\r\n\twhile (true) {\r\n\t\tlet w = next();\r\n\t\tif (w == 0) break;\r\n\t\tret.push(read_linear_table(w, next));\r\n\t}\r\n\twhile (true) {\r\n\t\tlet w = next() - 1;\r\n\t\tif (w < 0) break;\r\n\t\tret.push(read_replacement_table(w, next));\r\n\t}\r\n\treturn ret.flat();\r\n}\r\n\r\n// read until next is falsy\r\n// return array of read values\r\nfunction read_array_while(next) {\r\n\tlet v = [];\r\n\twhile (true) {\r\n\t\tlet x = next(v.length);\r\n\t\tif (!x) break;\r\n\t\tv.push(x);\r\n\t}\r\n\treturn v;\r\n}\r\n\r\n// read w columns of length n\r\n// return as n rows of length w\r\nfunction read_transposed(n, w, next) {\r\n\tlet m = Array(n).fill().map(() => []);\r\n\tfor (let i = 0; i < w; i++) {\r\n\t\tread_deltas(n, next).forEach((x, j) => m[j].push(x));\r\n\t}\r\n\treturn m;\r\n}\r\n \r\n// returns [[x, ys], [x+dx, ys+dy], [x+2*dx, ys+2*dy], ...]\r\n// where dx/dy = steps, n = run size, w = length of y\r\nfunction read_linear_table(w, next) {\r\n\tlet dx = 1 + next();\r\n\tlet dy = next();\r\n\tlet vN = read_array_while(next);\r\n\tlet m = read_transposed(vN.length, 1+w, next);\r\n\treturn m.flatMap((v, i) => {\r\n\t\tlet [x, ...ys] = v;\r\n\t\treturn Array(vN[i]).fill().map((_, j) => {\r\n\t\t\tlet j_dy = j * dy;\r\n\t\t\treturn [x + j * dx, ys.map(y => y + j_dy)];\r\n\t\t});\r\n\t});\r\n}\r\n\r\n// return [[x, ys...], ...]\r\n// where w = length of y\r\nfunction read_replacement_table(w, next) { \r\n\tlet n = 1 + next();\r\n\tlet m = read_transposed(n, 1+w, next);\r\n\treturn m.map(v => [v[0], v.slice(1)]);\r\n}\r\n\r\n\r\nfunction read_trie(next) {\r\n\tlet ret = [];\r\n\tlet sorted = read_sorted(next); \r\n\texpand(decode([]), []);\r\n\treturn ret; // not sorted\r\n\tfunction decode(Q) { // characters that lead into this node\r\n\t\tlet S = next(); // state: valid, save, check\r\n\t\tlet B = read_array_while(() => { // buckets leading to new nodes\r\n\t\t\tlet cps = read_sorted(next).map(i => sorted[i]);\r\n\t\t\tif (cps.length) return decode(cps);\r\n\t\t});\r\n\t\treturn {S, B, Q};\r\n\t}\r\n\tfunction expand({S, B}, cps, saved) {\r\n\t\tif (S & 4 && saved === cps[cps.length-1]) return;\r\n\t\tif (S & 2) saved = cps[cps.length-1];\r\n\t\tif (S & 1) ret.push(cps); \r\n\t\tfor (let br of B) {\r\n\t\t\tfor (let cp of br.Q) {\r\n\t\t\t\texpand(br, [...cps, cp], saved);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\n\nfunction hex_cp(cp) {\r\n\treturn cp.toString(16).toUpperCase().padStart(2, '0');\r\n}\r\n\r\nfunction quote_cp(cp) {\r\n\treturn `{${hex_cp(cp)}}`; // raffy convention: like \"\\u{X}\" w/o the \"\\u\"\r\n}\r\n\r\n/*\r\nexport function explode_cp(s) {\r\n\treturn [...s].map(c => c.codePointAt(0));\r\n}\r\n*/\r\nfunction explode_cp(s) { // this is about 2x faster\r\n\tlet cps = [];\r\n\tfor (let pos = 0, len = s.length; pos < len; ) {\r\n\t\tlet cp = s.codePointAt(pos);\r\n\t\tpos += cp < 0x10000 ? 1 : 2;\r\n\t\tcps.push(cp);\r\n\t}\r\n\treturn cps;\r\n}\r\n\r\nfunction str_from_cps(cps) {\r\n\tconst chunk = 4096;\r\n\tlet len = cps.length;\r\n\tif (len < chunk) return String.fromCodePoint(...cps);\r\n\tlet buf = [];\r\n\tfor (let i = 0; i < len; ) {\r\n\t\tbuf.push(String.fromCodePoint(...cps.slice(i, i += chunk)));\r\n\t}\r\n\treturn buf.join('');\r\n}\r\n\r\nfunction compare_arrays(a, b) {\r\n\tlet n = a.length;\r\n\tlet c = n - b.length;\r\n\tfor (let i = 0; c == 0 && i < n; i++) c = a[i] - b[i];\r\n\treturn c;\r\n}\n\n// created 2023-09-25T01:01:55.148Z\n// compressed base64-encoded blob for include-nf data\n// source: https://github.com/adraffy/ens-normalize.js/blob/main/src/make.js\n// see: https://github.com/adraffy/ens-normalize.js#security\n// SHA-256: a974b6f8541fc29d919bc85118af0a44015851fab5343f8679cb31be2bdb209e\nvar COMPRESSED = 'AEUDTAHBCFQATQDRADAAcgAgADQAFAAsABQAHwAOACQADQARAAoAFwAHABIACAAPAAUACwAFAAwABAAQAAMABwAEAAoABQAIAAIACgABAAQAFAALAAIACwABAAIAAQAHAAMAAwAEAAsADAAMAAwACgANAA0AAwAKAAkABAAdAAYAZwDSAdsDJgC0CkMB8xhZAqfoC190UGcThgBurwf7PT09Pb09AjgJum8OjDllxHYUKXAPxzq6tABAxgK8ysUvWAgMPT09PT09PSs6LT2HcgWXWwFLoSMEEEl5RFVMKvO0XQ8ExDdJMnIgsj26PTQyy8FfEQ8AY8IPAGcEbwRwBHEEcgRzBHQEdQR2BHcEeAR6BHsEfAR+BIAEgfndBQoBYgULAWIFDAFiBNcE2ATZBRAFEQUvBdALFAsVDPcNBw13DYcOMA4xDjMB4BllHI0B2grbAMDpHLkQ7QHVAPRNQQFnGRUEg0yEB2uaJF8AJpIBpob5AERSMAKNoAXqaQLUBMCzEiACnwRZEkkVsS7tANAsBG0RuAQLEPABv9HICTUBXigPZwRBApMDOwAamhtaABqEAY8KvKx3LQ4ArAB8UhwEBAVSagD8AEFZADkBIadVj2UMUgx5Il4ANQC9AxIB1BlbEPMAs30CGxlXAhwZKQIECBc6EbsCoxngzv7UzRQA8M0BawL6ZwkN7wABAD33OQRcsgLJCjMCjqUChtw/km+NAsXPAoP2BT84PwURAK0RAvptb6cApQS/OMMey5HJS84UdxpxTPkCogVFITaTOwERAK5pAvkNBOVyA7q3BKlOJSALAgUIBRcEdASpBXqzABXFSWZOawLCOqw//AolCZdvv3dSBkEQGyelEPcMMwG1ATsN7UvYBPEGOwTJH30ZGQ/NlZwIpS3dDO0m4y6hgFoj9SqDBe1L9DzdC01RaA9ZC2UJ4zpjgU4DIQENIosK3Q05CG0Q8wrJaw3lEUUHOQPVSZoApQcBCxEdNRW1JhBirAsJOXcG+xr2C48mrxMpevwF0xohBk0BKRr/AM8u54WwWjFcHE9fBgMLJSPHFKhQIA0lQLd4SBobBxUlqQKRQ3BKh1E2HpMh9jw9DWYuE1F8B/U8BRlPC4E8nkarRQ4R0j6NPUgiSUwsBDV/LC8niwnPD4UMuXxyAVkJIQmxDHETMREXN8UIOQcZLZckJxUIIUaVYJoE958D8xPRAwsFPwlBBxMDtRwtEy4VKQUNgSTXAvM21S6zAo9WgAEXBcsPJR/fEFBH4A7pCJsCZQODJesALRUhABcimwhDYwBfj9hTBS7LCMdqbCN0A2cU52ERcweRDlcHpxwzFb8c4XDIXguGCCijrwlbAXUJmQFfBOMICTVbjKAgQWdTi1gYmyBhQT9d/AIxDGUVn0S9h3gCiw9rEhsBNQFzBzkNAQJ3Ee0RaxCVCOuGBDW1M/g6JQRPIYMgEQonA09szgsnJvkM+GkBoxJiAww0PXfuZ6tgtiQX/QcZMsVBYCHxC5JPzQycGsEYQlQuGeQHvwPzGvMn6kFXBf8DowMTOk0z7gS9C2kIiwk/AEkOoxcH1xhqCnGM0AExiwG3mQNXkYMCb48GNwcLAGcLhwV55QAdAqcIowAFAM8DVwA5Aq0HnQAZAIVBAT0DJy8BIeUCjwOTCDHLAZUvAfMpBBvDDBUA9zduSgLDsQKAamaiBd1YAo4CSTUBTSUEBU5HUQOvceEA2wBLBhPfRwEVq0rLGuNDAd9vKwDHAPsABTUHBUEBzQHzbQC3AV8LMQmis7UBTekpAIMAFWsB1wKJAN0ANQB/8QFTAE0FWfkF0wJPSQERMRgrV2EBuwMfATMBDQB5BsuNpckHHwRtB9MCEBsV4QLvLge1AQMi3xPNQsUCvd5VoWACZIECYkJbTa9bNyACofcCaJgCZgkCn4Q4GwsCZjsCZiYEbgR/A38TA36SOQY5dxc5gjojIwJsHQIyNjgKAm3HAm2u74ozZ0UrAWcA3gDhAEoFB5gMjQD+C8IADbUCdy8CdqI/AnlLQwJ4uh1c20WuRtcCfD8CesgCfQkCfPAFWQUgSABIfWMkAoFtAoAAAoAFAn+uSVhKWxUXSswC0QEC0MxLJwOITwOH5kTFkTIC8qFdAwMDrkvOTC0lA89NTE2vAos/AorYwRsHHUNnBbcCjjcCjlxAl4ECjtkCjlx4UbRTNQpS1FSFApP7ApMMAOkAHFUeVa9V0AYsGymVhjLheGZFOzkCl58C77JYIagAWSUClo8ClnycAKlZrFoJgU0AOwKWtQKWTlxEXNECmcsCmWRcyl0HGQKcmznCOp0CnBYCn5sCnriKAB0PMSoPAp3xAp6SALU9YTRh7wKe0wKgbgGpAp6fHwKeTqVjyGQnJSsCJ68CJn4CoPsCoEwCot0CocQCpi8Cpc4Cp/8AfQKn8mh8aLEAA0lqHGrRAqzjAqyuAq1nAq0CAlcdAlXcArHh1wMfTmyXArK9DQKy6Bds4G1jbUhfAyXNArZcOz9ukAMpRQK4XgK5RxUCuSp3cDZw4QK9GQK72nCWAzIRAr6IcgIDM3ECvhpzInNPAsPLAsMEc4J0SzVFdOADPKcDPJoDPb8CxXwCxkcCxhCJAshpUQLIRALJTwLJLgJknQLd0nh5YXiueSVL0AMYo2cCAmH0GfOVJHsLXpJeuxECz2sCz2wvS1PS8xOfAMatAs9zASnqA04SfksFAtwnAtuKAtJPA1JcA1NfAQEDVYyAiT8AyxbtYEWCHILTgs6DjQLaxwLZ3oQQhEmnPAOGpQAvA2QOhnFZ+QBVAt9lAt64c3cC4i/tFAHzMCcB9JsB8tKHAuvzAulweQLq+QLq5AD5RwG5Au6JAuuclqqXAwLuPwOF4Jh5cOBxoQLzAwBpA44WmZMC9xMDkW4DkocC95gC+dkC+GaaHJqruzebHgOdgwL++gEbADmfHJ+zAwWNA6ZqA6bZANHFAwZqoYiiBQkDDEkCwAA/AwDhQRdTARHzA2sHl2cFAJMtK7evvdsBiZkUfxEEOQH7KQUhDp0JnwCS/SlXxQL3AZ0AtwW5AG8LbUEuFCaNLgFDAYD8AbUmAHUDDgRtACwCFgyhAAAKAj0CagPdA34EkQEgRQUhfAoABQBEABMANhICdwEABdUDa+8KxQIA9wqfJ7+xt+UBkSFBQgHpFH8RNMCJAAQAGwBaAkUChIsABjpTOpSNbQC4Oo860ACNOME63AClAOgAywE6gTo7Ofw5+Tt2iTpbO56JOm85GAFWATMBbAUvNV01njWtNWY1dTW2NcU1gjWRNdI14TWeNa017jX9NbI1wTYCNhE1xjXVNhY2JzXeNe02LjY9Ni41LSE2OjY9Njw2yTcIBJA8VzY4Nt03IDcPNsogN4k3MAoEsDxnNiQ3GTdsOo03IULUQwdC4EMLHA8PCZsobShRVQYA6X8A6bABFCnXAukBowC9BbcAbwNzBL8MDAMMAQgDAAkKCwsLCQoGBAVVBI/DvwDz9b29kaUCb0QtsRTNLt4eGBcSHAMZFhYZEhYEARAEBUEcQRxBHEEcQRxBHEEaQRxBHEFCSTxBPElISUhBNkM2QTYbNklISVmBVIgBFLWZAu0BhQCjBcEAbykBvwGJAaQcEZ0ePCklMAAhMvAIMAL54gC7Bm8EescjzQMpARQpKgDUABavAj626xQAJP0A3etzuf4NNRA7efy2Z9NQrCnC0OSyANz5BBIbJ5IFDR6miIavYS6tprjjmuKebxm5C74Q225X1pkaYYPb6f1DK4k3xMEBb9S2WMjEibTNWhsRJIA+vwNVEiXTE5iXs/wezV66oFLfp9NZGYW+Gk19J2+bCT6Ye2w6LDYdgzKMUabk595eLBCXANz9HUpWbATq9vqXVx9XDg+Pc9Xp4+bsS005SVM/BJBM4687WUuf+Uj9dEi8aDNaPxtpbDxcG1THTImUMZq4UCaaNYpsVqraNyKLJXDYsFZ/5jl7bLRtO88t7P3xZaAxhb5OdPMXqsSkp1WCieG8jXm1U99+blvLlXzPCS+M93VnJCiK+09LfaSaBAVBomyDgJua8dfUzR7ga34IvR2Nvj+A9heJ6lsl1KG4NkI1032Cnff1m1wof2B9oHJK4bi6JkEdSqeNeiuo6QoZZincoc73/TH9SXF8sCE7XyuYyW8WSgbGFCjPV0ihLKhdPs08Tx82fYAkLLc4I2wdl4apY7GU5lHRFzRWJep7Ww3wbeA3qmd59/86P4xuNaqDpygXt6M85glSBHOCGgJDnt+pN9bK7HApMguX6+06RZNjzVmcZJ+wcUrJ9//bpRNxNuKpNl9uFds+S9tdx7LaM5ZkIrPj6nIU9mnbFtVbs9s/uLgl8MVczAwet+iOEzzBlYW7RCMgE6gyNLeq6+1tIx4dpgZnd0DksJS5f+JNDpwwcPNXaaVspq1fbQajOrJgK0ofKtJ1Ne90L6VO4MOl5S886p7u6xo7OLjG8TGL+HU1JXGJgppg4nNbNJ5nlzSpuPYy21JUEcUA94PoFiZfjZue+QnyQ80ekOuZVkxx4g+cvhJfHgNl4hy1/a6+RKcKlar/J29y//EztlbVPHVUeQ1zX86eQVAjR/M3dA9w4W8LfaXp4EgM85wOWasli837PzVMOnsLzR+k3o75/lRPAJSE1xAKQzEi5v10ke+VBvRt1cwQRMd+U5mLCTGVd6XiZtgBG5cDi0w22GKcVNvHiu5LQbZEDVtz0onn7k5+heuKXVsZtSzilkLRAUmjMXEMB3J9YC50XBxPiz53SC+EhnPl9WsKCv92SM/OFFIMJZYfl0WW8tIO3UxYcwdMAj7FSmgrsZ2aAZO03BOhP1bNNZItyXYQFTpC3SG1VuPDqH9GkiCDmE+JwxyIVSO5siDErAOpEXFgjy6PQtOVDj+s6e1r8heWVvmZnTciuf4EiNZzCAd7SOMhXERIOlsHIMG399i9aLTy3m2hRLZjJVDNLS53iGIK11dPqQt0zBDyg6qc7YqkDm2M5Ve6dCWCaCbTXX2rToaIgz6+zh4lYUi/+6nqcFMAkQJKHYLK0wYk5N9szV6xihDbDDFr45lN1K4aCXBq/FitPSud9gLt5ZVn+ZqGX7cwm2z5EGMgfFpIFyhGGuDPmso6TItTMwny+7uPnLCf4W6goFQFV0oQSsc9VfMmVLcLr6ZetDZbaSFTLqnSO/bIPjA3/zAUoqgGFAEQS4IhuMzEp2I3jJzbzkk/IEmyax+rhZTwd6f+CGtwPixu8IvzACquPWPREu9ZvGkUzpRwvRRuaNN6cr0W1wWits9ICdYJ7ltbgMiSL3sTPeufgNcVqMVWFkCPDH4jG2jA0XcVgQj62Cb29v9f/z/+2KbYvIv/zzjpQAPkliaVDzNrW57TZ/ZOyZD0nlfMmAIBIAGAI0D3k/mdN4xr9v85ZbZbbqfH2jGd5hUqNZWwl5SPfoGmfElmazUIeNL1j/mkF7VNAzTq4jNt8JoQ11NQOcmhprXoxSxfRGJ9LDEOAQ+dmxAQH90iti9e2u/MoeuaGcDTHoC+xsmEeWmxEKefQuIzHbpw5Tc5cEocboAD09oipWQhtTO1wivf/O+DRe2rpl/E9wlrzBorjJsOeG1B/XPW4EaJEFdNlECEZga5ZoGRHXgYouGRuVkm8tDESiEyFNo+3s5M5puSdTyUL2llnINVHEt91XUNW4ewdMgJ4boJfEyt/iY5WXqbA+A2Fkt5Z0lutiWhe9nZIyIUjyXDC3UsaG1t+eNx6z4W/OYoTB7A6x+dNSTOi9AInctbESqm5gvOLww7OWXPrmHwVZasrl4eD113pm+JtT7JVOvnCXqdzzdTRHgJ0PiGTFYW5Gvt9R9LD6Lzfs0v/TZZHSmyVNq7viIHE6DBK7Qp07Iz55EM8SYtQvZf/obBniTWi5C2/ovHfw4VndkE5XYdjOhCMRjDeOEfXeN/CwfGduiUIfsoFeUxXeQXba7c7972XNv8w+dTjjUM0QeNAReW+J014dKAD/McQYXT7c0GQPIkn3Ll6R7gGjuiQoZD0TEeEqQpKoZ15g/0OPQI17QiSv9AUROa/V/TQN3dvLArec3RrsYlvBm1b8LWzltdugsC50lNKYLEp2a+ZZYqPejULRlOJh5zj/LVMyTDvwKhMxxwuDkxJ1QpoNI0OTWLom4Z71SNzI9TV1iXJrIu9Wcnd+MCaAw8o1jSXd94YU/1gnkrC9BUEOtQvEIQ7g0i6h+KL2JKk8Ydl7HruvgWMSAmNe+LshGhV4qnWHhO9/RIPQzY1tHRj2VqOyNsDpK0cww+56AdDC4gsWwY0XxoucIWIqs/GcwnWqlaT0KPr8mbK5U94/301i1WLt4YINTVvCFBrFZbIbY8eycOdeJ2teD5IfPLCRg7jjcFTwlMFNl9zdh/o3E/hHPwj7BWg0MU09pPrBLbrCgm54A6H+I6v27+jL5gkjWg/iYdks9jbfVP5y/n0dlgWEMlKasl7JvFZd56LfybW1eeaVO0gxTfXZwD8G4SI116yx7UKVRgui6Ya1YpixqXeNLc8IxtAwCU5IhwQgn+NqHnRaDv61CxKhOq4pOX7M6pkA+Pmpd4j1vn6ACUALoLLc4vpXci8VidLxzm7qFBe7s+quuJs6ETYmnpgS3LwSZxPIltgBDXz8M1k/W2ySNv2f9/NPhxLGK2D21dkHeSGmenRT3Yqcdl0m/h3OYr8V+lXNYGf8aCCpd4bWjE4QIPj7vUKN4Nrfs7ML6Y2OyS830JCnofg/k7lpFpt4SqZc5HGg1HCOrHvOdC8bP6FGDbE/VV0mX4IakzbdS/op+Kt3G24/8QbBV7y86sGSQ/vZzU8FXs7u6jIvwchsEP2BpIhW3G8uWNwa3HmjfH/ZjhhCWvluAcF+nMf14ClKg5hGgtPLJ98ueNAkc5Hs2WZlk2QHvfreCK1CCGO6nMZVSb99VM/ajr8WHTte9JSmkXq/i/U943HEbdzW6Re/S88dKgg8pGOLlAeNiqrcLkUR3/aClFpMXcOUP3rmETcWSfMXZE3TUOi8i+fqRnTYLflVx/Vb/6GJ7eIRZUA6k3RYR3iFSK9c4iDdNwJuZL2FKz/IK5VimcNWEqdXjSoxSgmF0UPlDoUlNrPcM7ftmA8Y9gKiqKEHuWN+AZRIwtVSxye2Kf8rM3lhJ5XcBXU9n4v0Oy1RU2M+4qM8AQPVwse8ErNSob5oFPWxuqZnVzo1qB/IBxkM3EVUKFUUlO3e51259GgNcJbCmlvrdjtoTW7rChm1wyCKzpCTwozUUEOIcWLneRLgMXh+SjGSFkAllzbGS5HK7LlfCMRNRDSvbQPjcXaenNYxCvu2Qyznz6StuxVj66SgI0T8B6/sfHAJYZaZ78thjOSIFumNWLQbeZixDCCC+v0YBtkxiBB3jefHqZ/dFHU+crbj6OvS1x/JDD7vlm7zOVPwpUC01nhxZuY/63E7g';\n\n// https://unicode.org/reports/tr15/\r\n// for reference implementation\r\n// see: /derive/nf.js\r\n\r\n\r\n// algorithmic hangul\r\n// https://www.unicode.org/versions/Unicode15.0.0/ch03.pdf (page 144)\r\nconst S0 = 0xAC00;\r\nconst L0 = 0x1100;\r\nconst V0 = 0x1161;\r\nconst T0 = 0x11A7;\r\nconst L_COUNT = 19;\r\nconst V_COUNT = 21;\r\nconst T_COUNT = 28;\r\nconst N_COUNT = V_COUNT * T_COUNT;\r\nconst S_COUNT = L_COUNT * N_COUNT;\r\nconst S1 = S0 + S_COUNT;\r\nconst L1 = L0 + L_COUNT;\r\nconst V1 = V0 + V_COUNT;\r\nconst T1 = T0 + T_COUNT;\r\n\r\nfunction unpack_cc(packed) {\r\n\treturn (packed >> 24) & 0xFF;\r\n}\r\nfunction unpack_cp(packed) {\r\n\treturn packed & 0xFFFFFF;\r\n}\r\n\r\nlet SHIFTED_RANK, EXCLUSIONS, DECOMP, RECOMP;\r\n\r\nfunction init$1() {\r\n\t//console.time('nf');\r\n\tlet r = read_compressed_payload(COMPRESSED);\r\n\tSHIFTED_RANK = new Map(read_sorted_arrays(r).flatMap((v, i) => v.map(x => [x, (i+1) << 24]))); // pre-shifted\r\n\tEXCLUSIONS = new Set(read_sorted(r));\r\n\tDECOMP = new Map();\r\n\tRECOMP = new Map();\r\n\tfor (let [cp, cps] of read_mapped(r)) {\r\n\t\tif (!EXCLUSIONS.has(cp) && cps.length == 2) {\r\n\t\t\tlet [a, b] = cps;\r\n\t\t\tlet bucket = RECOMP.get(a);\r\n\t\t\tif (!bucket) {\r\n\t\t\t\tbucket = new Map();\r\n\t\t\t\tRECOMP.set(a, bucket);\r\n\t\t\t}\r\n\t\t\tbucket.set(b, cp);\r\n\t\t}\r\n\t\tDECOMP.set(cp, cps.reverse()); // stored reversed\r\n\t}\r\n\t//console.timeEnd('nf');\r\n\t// 20230905: 11ms\r\n}\r\n\r\nfunction is_hangul(cp) {\r\n\treturn cp >= S0 && cp < S1;\r\n}\r\n\r\nfunction compose_pair(a, b) {\r\n\tif (a >= L0 && a < L1 && b >= V0 && b < V1) {\r\n\t\treturn S0 + (a - L0) * N_COUNT + (b - V0) * T_COUNT;\r\n\t} else if (is_hangul(a) && b > T0 && b < T1 && (a - S0) % T_COUNT == 0) {\r\n\t\treturn a + (b - T0);\r\n\t} else {\r\n\t\tlet recomp = RECOMP.get(a);\r\n\t\tif (recomp) {\r\n\t\t\trecomp = recomp.get(b);\r\n\t\t\tif (recomp) {\r\n\t\t\t\treturn recomp;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n}\r\n\r\nfunction decomposed(cps) {\r\n\tif (!SHIFTED_RANK) init$1();\r\n\tlet ret = [];\r\n\tlet buf = [];\r\n\tlet check_order = false;\r\n\tfunction add(cp) {\r\n\t\tlet cc = SHIFTED_RANK.get(cp);\r\n\t\tif (cc) {\r\n\t\t\tcheck_order = true;\r\n\t\t\tcp |= cc;\r\n\t\t}\r\n\t\tret.push(cp);\r\n\t}\r\n\tfor (let cp of cps) {\r\n\t\twhile (true) {\r\n\t\t\tif (cp < 0x80) {\r\n\t\t\t\tret.push(cp);\r\n\t\t\t} else if (is_hangul(cp)) {\r\n\t\t\t\tlet s_index = cp - S0;\r\n\t\t\t\tlet l_index = s_index / N_COUNT | 0;\r\n\t\t\t\tlet v_index = (s_index % N_COUNT) / T_COUNT | 0;\r\n\t\t\t\tlet t_index = s_index % T_COUNT;\r\n\t\t\t\tadd(L0 + l_index);\r\n\t\t\t\tadd(V0 + v_index);\r\n\t\t\t\tif (t_index > 0) add(T0 + t_index);\r\n\t\t\t} else {\r\n\t\t\t\tlet mapped = DECOMP.get(cp);\r\n\t\t\t\tif (mapped) {\r\n\t\t\t\t\tbuf.push(...mapped);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tadd(cp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!buf.length) break;\r\n\t\t\tcp = buf.pop();\r\n\t\t}\r\n\t}\r\n\tif (check_order && ret.length > 1) {\r\n\t\tlet prev_cc = unpack_cc(ret[0]);\r\n\t\tfor (let i = 1; i < ret.length; i++) {\r\n\t\t\tlet cc = unpack_cc(ret[i]);\r\n\t\t\tif (cc == 0 || prev_cc <= cc) {\r\n\t\t\t\tprev_cc = cc;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tlet j = i-1;\r\n\t\t\twhile (true) {\r\n\t\t\t\tlet tmp = ret[j+1];\r\n\t\t\t\tret[j+1] = ret[j];\r\n\t\t\t\tret[j] = tmp;\r\n\t\t\t\tif (!j) break;\r\n\t\t\t\tprev_cc = unpack_cc(ret[--j]);\r\n\t\t\t\tif (prev_cc <= cc) break;\r\n\t\t\t}\r\n\t\t\tprev_cc = unpack_cc(ret[i]);\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\nfunction composed_from_decomposed(v) {\r\n\tlet ret = [];\r\n\tlet stack = [];\r\n\tlet prev_cp = -1;\r\n\tlet prev_cc = 0;\r\n\tfor (let packed of v) {\r\n\t\tlet cc = unpack_cc(packed);\r\n\t\tlet cp = unpack_cp(packed);\r\n\t\tif (prev_cp == -1) {\r\n\t\t\tif (cc == 0) {\r\n\t\t\t\tprev_cp = cp;\r\n\t\t\t} else {\r\n\t\t\t\tret.push(cp);\r\n\t\t\t}\r\n\t\t} else if (prev_cc > 0 && prev_cc >= cc) {\r\n\t\t\tif (cc == 0) {\r\n\t\t\t\tret.push(prev_cp, ...stack);\r\n\t\t\t\tstack.length = 0;\r\n\t\t\t\tprev_cp = cp;\r\n\t\t\t} else {\r\n\t\t\t\tstack.push(cp);\r\n\t\t\t}\r\n\t\t\tprev_cc = cc;\r\n\t\t} else {\r\n\t\t\tlet composed = compose_pair(prev_cp, cp);\r\n\t\t\tif (composed >= 0) {\r\n\t\t\t\tprev_cp = composed;\r\n\t\t\t} else if (prev_cc == 0 && cc == 0) {\r\n\t\t\t\tret.push(prev_cp);\r\n\t\t\t\tprev_cp = cp;\r\n\t\t\t} else {\r\n\t\t\t\tstack.push(cp);\r\n\t\t\t\tprev_cc = cc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (prev_cp >= 0) {\r\n\t\tret.push(prev_cp, ...stack);\t\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\n// note: cps can be iterable\r\nfunction nfd(cps) {\r\n\treturn decomposed(cps).map(unpack_cp);\r\n}\r\nfunction nfc(cps) {\r\n\treturn composed_from_decomposed(decomposed(cps));\r\n}\n\nconst HYPHEN = 0x2D;\r\nconst STOP = 0x2E;\r\nconst STOP_CH = '.';\r\nconst FE0F = 0xFE0F;\r\nconst UNIQUE_PH = 1;\r\n\r\n// 20230913: replace [...v] with Array_from(v) to avoid large spreads\r\nconst Array_from = x => Array.from(x); // Array.from.bind(Array);\r\n\r\nfunction group_has_cp(g, cp) {\r\n\t// 20230913: keep primary and secondary distinct instead of creating valid union\r\n\treturn g.P.has(cp) || g.Q.has(cp);\r\n}\r\n\r\nclass Emoji extends Array {\r\n\tget is_emoji() { return true; } // free tagging system\r\n}\r\n\r\nlet MAPPED, IGNORED, CM, NSM, ESCAPE, NFC_CHECK, GROUPS, WHOLE_VALID, WHOLE_MAP, VALID, EMOJI_LIST, EMOJI_ROOT;\r\n\r\nfunction init() {\r\n\tif (MAPPED) return;\r\n\t\r\n\tlet r = read_compressed_payload(COMPRESSED$1);\r\n\tconst read_sorted_array = () => read_sorted(r);\r\n\tconst read_sorted_set = () => new Set(read_sorted_array());\r\n\tconst set_add_many = (set, v) => v.forEach(x => set.add(x));\r\n\r\n\tMAPPED = new Map(read_mapped(r)); \r\n\tIGNORED = read_sorted_set(); // ignored characters are not valid, so just read raw codepoints\r\n\r\n\t/*\r\n\t// direct include from payload is smaller than the decompression code\r\n\tconst FENCED = new Map(read_array_while(() => {\r\n\t\tlet cp = r();\r\n\t\tif (cp) return [cp, read_str(r())];\r\n\t}));\r\n\t*/\r\n\t// 20230217: we still need all CM for proper error formatting\r\n\t// but norm only needs NSM subset that are potentially-valid\r\n\tCM = read_sorted_array();\r\n\tNSM = new Set(read_sorted_array().map(i => CM[i]));\r\n\tCM = new Set(CM);\r\n\t\r\n\tESCAPE = read_sorted_set(); // characters that should not be printed\r\n\tNFC_CHECK = read_sorted_set(); // only needed to illustrate ens_tokenize() transformations\r\n\r\n\tlet chunks = read_sorted_arrays(r);\r\n\tlet unrestricted = r();\r\n\t//const read_chunked = () => new Set(read_sorted_array().flatMap(i => chunks[i]).concat(read_sorted_array()));\r\n\tconst read_chunked = () => {\r\n\t\t// 20230921: build set in parts, 2x faster\r\n\t\tlet set = new Set();\r\n\t\tread_sorted_array().forEach(i => set_add_many(set, chunks[i]));\r\n\t\tset_add_many(set, read_sorted_array());\r\n\t\treturn set; \r\n\t};\r\n\tGROUPS = read_array_while(i => {\r\n\t\t// minifier property mangling seems unsafe\r\n\t\t// so these are manually renamed to single chars\r\n\t\tlet N = read_array_while(r).map(x => x+0x60);\r\n\t\tif (N.length) {\r\n\t\t\tlet R = i >= unrestricted; // unrestricted then restricted\r\n\t\t\tN[0] -= 32; // capitalize\r\n\t\t\tN = str_from_cps(N);\r\n\t\t\tif (R) N=`Restricted[${N}]`;\r\n\t\t\tlet P = read_chunked(); // primary\r\n\t\t\tlet Q = read_chunked(); // secondary\r\n\t\t\tlet M = !r(); // not-whitelisted, check for NSM\r\n\t\t\t// *** this code currently isn't needed ***\r\n\t\t\t/*\r\n\t\t\tlet V = [...P, ...Q].sort((a, b) => a-b); // derive: sorted valid\r\n\t\t\tlet M = r()-1; // number of combining mark\r\n\t\t\tif (M < 0) { // whitelisted\r\n\t\t\t\tM = new Map(read_array_while(() => {\r\n\t\t\t\t\tlet i = r();\r\n\t\t\t\t\tif (i) return [V[i-1], read_array_while(() => {\r\n\t\t\t\t\t\tlet v = read_array_while(r);\r\n\t\t\t\t\t\tif (v.length) return v.map(x => x-1);\r\n\t\t\t\t\t})];\r\n\t\t\t\t}));\r\n\t\t\t}*/\r\n\t\t\treturn {N, P, Q, M, R};\r\n\t\t}\r\n\t});\r\n\r\n\t// decode compressed wholes\r\n\tWHOLE_VALID = read_sorted_set();\r\n\tWHOLE_MAP = new Map();\r\n\tlet wholes = read_sorted_array().concat(Array_from(WHOLE_VALID)).sort((a, b) => a-b); // must be sorted\r\n\twholes.forEach((cp, i) => {\r\n\t\tlet d = r(); \r\n\t\tlet w = wholes[i] = d ? wholes[i-d] : {V: [], M: new Map()};\r\n\t\tw.V.push(cp); // add to member set\r\n\t\tif (!WHOLE_VALID.has(cp)) {\r\n\t\t\tWHOLE_MAP.set(cp, w); // register with whole map\r\n\t\t}\r\n\t});\r\n\r\n\t// compute confusable-extent complements\r\n\t// usage: WHOLE_MAP.get(cp).M.get(cp) = complement set\r\n\tfor (let {V, M} of new Set(WHOLE_MAP.values())) {\r\n\t\t// connect all groups that have each whole character\r\n\t\tlet recs = [];\r\n\t\tfor (let cp of V) {\r\n\t\t\tlet gs = GROUPS.filter(g => group_has_cp(g, cp));\r\n\t\t\tlet rec = recs.find(({G}) => gs.some(g => G.has(g)));\r\n\t\t\tif (!rec) {\r\n\t\t\t\trec = {G: new Set(), V: []};\r\n\t\t\t\trecs.push(rec);\r\n\t\t\t}\r\n\t\t\trec.V.push(cp);\r\n\t\t\tset_add_many(rec.G, gs);\r\n\t\t}\r\n\t\t// per character cache groups which are not a member of the extent\r\n\t\tlet union = recs.flatMap(x => Array_from(x.G)); // all of the groups used by this whole\r\n\t\tfor (let {G, V} of recs) {\r\n\t\t\tlet complement = new Set(union.filter(g => !G.has(g))); // groups not covered by the extent\r\n\t\t\tfor (let cp of V) {\r\n\t\t\t\tM.set(cp, complement); // this is the same reference\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// compute valid set\r\n\t// 20230924: VALID was union but can be re-used\r\n\tVALID = new Set(); // exists in 1+ groups\r\n\tlet multi = new Set(); // exists in 2+ groups\r\n\tconst add_to_union = cp => VALID.has(cp) ? multi.add(cp) : VALID.add(cp);\r\n\tfor (let g of GROUPS) {\r\n\t\tfor (let cp of g.P) add_to_union(cp);\r\n\t\tfor (let cp of g.Q) add_to_union(cp);\r\n\t}\r\n\t// dual purpose WHOLE_MAP: return placeholder if unique non-confusable\r\n\tfor (let cp of VALID) {\r\n\t\tif (!WHOLE_MAP.has(cp) && !multi.has(cp)) {\r\n\t\t\tWHOLE_MAP.set(cp, UNIQUE_PH);\r\n\t\t}\r\n\t}\r\n\t// add all decomposed parts\r\n\t// see derive: \"Valid is Closed (via Brute-force)\"\r\n\tset_add_many(VALID, nfd(VALID));\r\n\t\r\n\t// decode emoji\r\n\t// 20230719: emoji are now fully-expanded to avoid quirk logic \r\n\tEMOJI_LIST = read_trie(r).map(v => Emoji.from(v)).sort(compare_arrays);\r\n\tEMOJI_ROOT = new Map(); // this has approx 7K nodes (2+ per emoji)\r\n\tfor (let cps of EMOJI_LIST) {\r\n\t\t// 20230719: change to *slightly* stricter algorithm which disallows \r\n\t\t// insertion of misplaced FE0F in emoji sequences (matching ENSIP-15)\r\n\t\t// example: beautified [A B] (eg. flag emoji) \r\n\t\t// before: allow: [A FE0F B], error: [A FE0F FE0F B] \r\n\t\t// after: error: both\r\n\t\t// note: this code now matches ENSNormalize.{cs,java} logic\r\n\t\tlet prev = [EMOJI_ROOT];\r\n\t\tfor (let cp of cps) {\r\n\t\t\tlet next = prev.map(node => {\r\n\t\t\t\tlet child = node.get(cp);\r\n\t\t\t\tif (!child) {\r\n\t\t\t\t\t// should this be object? \r\n\t\t\t\t\t// (most have 1-2 items, few have many)\r\n\t\t\t\t\t// 20230719: no, v8 default map is 4?\r\n\t\t\t\t\tchild = new Map();\r\n\t\t\t\t\tnode.set(cp, child);\r\n\t\t\t\t}\r\n\t\t\t\treturn child;\r\n\t\t\t});\r\n\t\t\tif (cp === FE0F) {\r\n\t\t\t\tprev.push(...next); // less than 20 elements\r\n\t\t\t} else {\r\n\t\t\t\tprev = next;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (let x of prev) {\r\n\t\t\tx.V = cps;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// if escaped: {HEX}\r\n// else: \"x\" {HEX}\r\nfunction quoted_cp(cp) {\r\n\treturn (should_escape(cp) ? '' : `${bidi_qq(safe_str_from_cps([cp]))} `) + quote_cp(cp);\r\n}\r\n\r\n// 20230211: some messages can be mixed-directional and result in spillover\r\n// use 200E after a quoted string to force the remainder of a string from \r\n// acquring the direction of the quote\r\n// https://www.w3.org/International/questions/qa-bidi-unicode-controls#exceptions\r\nfunction bidi_qq(s) {\r\n\treturn `\"${s}\"\\u200E`; // strong LTR\r\n}\r\n\r\nfunction check_label_extension(cps) {\r\n\tif (cps.length >= 4 && cps[2] == HYPHEN && cps[3] == HYPHEN) {\r\n\t\tthrow new Error(`invalid label extension: \"${str_from_cps(cps.slice(0, 4))}\"`); // this can only be ascii so cant be bidi\r\n\t}\r\n}\r\nfunction check_leading_underscore(cps) {\r\n\tconst UNDERSCORE = 0x5F;\r\n\tfor (let i = cps.lastIndexOf(UNDERSCORE); i > 0; ) {\r\n\t\tif (cps[--i] !== UNDERSCORE) {\r\n\t\t\tthrow new Error('underscore allowed only at start');\r\n\t\t}\r\n\t}\r\n}\r\n// check that a fenced cp is not leading, trailing, or touching another fenced cp\r\nfunction check_fenced(cps) {\r\n\tlet cp = cps[0];\r\n\tlet prev = FENCED.get(cp);\r\n\tif (prev) throw error_placement(`leading ${prev}`);\r\n\tlet n = cps.length;\r\n\tlet last = -1; // prevents trailing from throwing\r\n\tfor (let i = 1; i < n; i++) {\r\n\t\tcp = cps[i];\r\n\t\tlet match = FENCED.get(cp);\r\n\t\tif (match) {\r\n\t\t\t// since cps[0] isn't fenced, cps[1] cannot throw\r\n\t\t\tif (last == i) throw error_placement(`${prev} + ${match}`);\r\n\t\t\tlast = i + 1;\r\n\t\t\tprev = match;\r\n\t\t}\r\n\t}\r\n\tif (last == n) throw error_placement(`trailing ${prev}`);\r\n}\r\n\r\n// create a safe to print string \r\n// invisibles are escaped\r\n// leading cm uses placeholder\r\n// if cps exceed max, middle truncate with ellipsis\r\n// quoter(cp) => string, eg. 3000 => \"{3000}\"\r\n// note: in html, you'd call this function then replace [<>&] with entities\r\nfunction safe_str_from_cps(cps, max = Infinity, quoter = quote_cp) {\r\n\t//if (Number.isInteger(cps)) cps = [cps];\r\n\t//if (!Array.isArray(cps)) throw new TypeError(`expected codepoints`);\r\n\tlet buf = [];\r\n\tif (is_combining_mark(cps[0])) buf.push('◌');\r\n\tif (cps.length > max) {\r\n\t\tmax >>= 1;\r\n\t\tcps = [...cps.slice(0, max), 0x2026, ...cps.slice(-max)];\r\n\t}\r\n\tlet prev = 0;\r\n\tlet n = cps.length;\r\n\tfor (let i = 0; i < n; i++) {\r\n\t\tlet cp = cps[i];\r\n\t\tif (should_escape(cp)) {\r\n\t\t\tbuf.push(str_from_cps(cps.slice(prev, i)));\r\n\t\t\tbuf.push(quoter(cp));\r\n\t\t\tprev = i + 1;\r\n\t\t}\r\n\t}\r\n\tbuf.push(str_from_cps(cps.slice(prev, n)));\r\n\treturn buf.join('');\r\n}\r\n\r\n// note: set(s) cannot be exposed because they can be modified\r\n// note: Object.freeze() doesn't work\r\nfunction is_combining_mark(cp) {\r\n\tinit();\r\n\treturn CM.has(cp);\r\n}\r\nfunction should_escape(cp) {\r\n\tinit();\r\n\treturn ESCAPE.has(cp);\r\n}\r\n\r\n// return all supported emoji as fully-qualified emoji \r\n// ordered by length then lexicographic \r\nfunction ens_emoji() {\r\n\tinit();\r\n\treturn EMOJI_LIST.map(x => x.slice()); // emoji are exposed so copy\r\n}\r\n\r\nfunction ens_normalize_fragment(frag, decompose) {\r\n\tinit();\r\n\tlet nf = decompose ? nfd : nfc;\r\n\treturn frag.split(STOP_CH).map(label => str_from_cps(tokens_from_str(explode_cp(label), nf, filter_fe0f).flat())).join(STOP_CH);\r\n}\r\n\r\nfunction ens_normalize(name) {\r\n\treturn flatten(split(name, nfc, filter_fe0f));\r\n}\r\n\r\nfunction ens_beautify(name) {\r\n\tlet labels = split(name, nfc, x => x); // emoji not exposed\r\n\tfor (let {type, output, error} of labels) {\r\n\t\tif (error) break; // flatten will throw\r\n\r\n\t\t// replace leading/trailing hyphen\r\n\t\t// 20230121: consider beautifing all or leading/trailing hyphen to unicode variant\r\n\t\t// not exactly the same in every font, but very similar: \"-\" vs \"‐\"\r\n\t\t/*\r\n\t\tconst UNICODE_HYPHEN = 0x2010;\r\n\t\t// maybe this should replace all for visual consistancy?\r\n\t\t// `node tools/reg-count.js regex ^-\\{2,\\}` => 592\r\n\t\t//for (let i = 0; i < output.length; i++) if (output[i] == 0x2D) output[i] = 0x2010;\r\n\t\tif (output[0] == HYPHEN) output[0] = UNICODE_HYPHEN;\r\n\t\tlet end = output.length-1;\r\n\t\tif (output[end] == HYPHEN) output[end] = UNICODE_HYPHEN;\r\n\t\t*/\r\n\t\t// 20230123: WHATWG URL uses \"CheckHyphens\" false\r\n\t\t// https://url.spec.whatwg.org/#idna\r\n\r\n\t\t// update ethereum symbol\r\n\t\t// ξ => Ξ if not greek\r\n\t\tif (type !== 'Greek') array_replace(output, 0x3BE, 0x39E);\r\n\r\n\t\t// 20221213: fixes bidi subdomain issue, but breaks invariant (200E is disallowed)\r\n\t\t// could be fixed with special case for: 2D (.) + 200E (LTR)\r\n\t\t// https://discuss.ens.domains/t/bidi-label-ordering-spoof/15824\r\n\t\t//output.splice(0, 0, 0x200E);\r\n\t}\r\n\treturn flatten(labels);\r\n}\r\n\r\nfunction array_replace(v, a, b) {\r\n\tlet prev = 0;\r\n\twhile (true) {\r\n\t\tlet next = v.indexOf(a, prev);\r\n\t\tif (next < 0) break;\r\n\t\tv[next] = b; \r\n\t\tprev = next + 1;\r\n\t}\r\n}\r\n\r\nfunction ens_split(name, preserve_emoji) {\r\n\treturn split(name, nfc, preserve_emoji ? x => x.slice() : filter_fe0f); // emoji are exposed so copy\r\n}\r\n\r\nfunction split(name, nf, ef) {\r\n\tif (!name) return []; // 20230719: empty name allowance\r\n\tinit();\r\n\tlet offset = 0;\r\n\t// https://unicode.org/reports/tr46/#Validity_Criteria\r\n\t// 4.) \"The label must not contain a U+002E ( . ) FULL STOP.\"\r\n\treturn name.split(STOP_CH).map(label => {\r\n\t\tlet input = explode_cp(label);\r\n\t\tlet info = {\r\n\t\t\tinput,\r\n\t\t\toffset, // codepoint, not substring!\r\n\t\t};\r\n\t\toffset += input.length + 1; // + stop\r\n\t\ttry {\r\n\t\t\t// 1.) \"The label must be in Unicode Normalization Form NFC\"\r\n\t\t\tlet tokens = info.tokens = tokens_from_str(input, nf, ef);\r\n\t\t\tlet token_count = tokens.length;\r\n\t\t\tlet type;\r\n\t\t\tif (!token_count) { // the label was effectively empty (could of had ignored characters)\r\n\t\t\t\t//norm = [];\r\n\t\t\t\t//type = 'None'; // use this instead of next match, \"ASCII\"\r\n\t\t\t\t// 20230120: change to strict\r\n\t\t\t\t// https://discuss.ens.domains/t/ens-name-normalization-2nd/14564/59\r\n\t\t\t\tthrow new Error(`empty label`);\r\n\t\t\t} \r\n\t\t\tlet norm = info.output = tokens.flat();\r\n\t\t\tcheck_leading_underscore(norm);\r\n\t\t\tlet emoji = info.emoji = token_count > 1 || tokens[0].is_emoji; // same as: tokens.some(x => x.is_emoji);\r\n\t\t\tif (!emoji && norm.every(cp => cp < 0x80)) { // special case for ascii\r\n\t\t\t\t// 20230123: matches matches WHATWG, see note 3.3\r\n\t\t\t\tcheck_label_extension(norm); // only needed for ascii\r\n\t\t\t\t// cant have fenced\r\n\t\t\t\t// cant have cm\r\n\t\t\t\t// cant have wholes\r\n\t\t\t\t// see derive: \"Fastpath ASCII\"\r\n\t\t\t\ttype = 'ASCII';\r\n\t\t\t} else {\r\n\t\t\t\tlet chars = tokens.flatMap(x => x.is_emoji ? [] : x); // all of the nfc tokens concat together\r\n\t\t\t\tif (!chars.length) { // theres no text, just emoji\r\n\t\t\t\t\ttype = 'Emoji';\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 5.) \"The label must not begin with a combining mark, that is: General_Category=Mark.\"\r\n\t\t\t\t\tif (CM.has(norm[0])) throw error_placement('leading combining mark');\r\n\t\t\t\t\tfor (let i = 1; i < token_count; i++) { // we've already checked the first token\r\n\t\t\t\t\t\tlet cps = tokens[i];\r\n\t\t\t\t\t\tif (!cps.is_emoji && CM.has(cps[0])) { // every text token has emoji neighbors, eg. EtEEEtEt...\r\n\t\t\t\t\t\t\t// bidi_qq() not needed since emoji is LTR and cps is a CM\r\n\t\t\t\t\t\t\tthrow error_placement(`emoji + combining mark: \"${str_from_cps(tokens[i-1])} + ${safe_str_from_cps([cps[0]])}\"`); \r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcheck_fenced(norm);\r\n\t\t\t\t\tlet unique = Array_from(new Set(chars));\r\n\t\t\t\t\tlet [g] = determine_group(unique); // take the first match\r\n\t\t\t\t\t// see derive: \"Matching Groups have Same CM Style\"\r\n\t\t\t\t\t// alternative: could form a hybrid type: Latin/Japanese/...\t\r\n\t\t\t\t\tcheck_group(g, chars); // need text in order\r\n\t\t\t\t\tcheck_whole(g, unique); // only need unique text (order would be required for multiple-char confusables)\r\n\t\t\t\t\ttype = g.N;\r\n\t\t\t\t\t// 20230121: consider exposing restricted flag\r\n\t\t\t\t\t// it's simpler to just check for 'Restricted'\r\n\t\t\t\t\t// or even better: type.endsWith(']')\r\n\t\t\t\t\t//if (g.R) info.restricted = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tinfo.type = type;\r\n\t\t} catch (err) {\r\n\t\t\tinfo.error = err; // use full error object\r\n\t\t}\r\n\t\treturn info;\r\n\t});\r\n}\r\n\r\nfunction check_whole(group, unique) {\r\n\tlet maker;\r\n\tlet shared = [];\r\n\tfor (let cp of unique) {\r\n\t\tlet whole = WHOLE_MAP.get(cp);\r\n\t\tif (whole === UNIQUE_PH) return; // unique, non-confusable\r\n\t\tif (whole) {\r\n\t\t\tlet set = whole.M.get(cp); // groups which have a character that look-like this character\r\n\t\t\tmaker = maker ? maker.filter(g => set.has(g)) : Array_from(set);\r\n\t\t\tif (!maker.length) return; // confusable intersection is empty\r\n\t\t} else {\r\n\t\t\tshared.push(cp); \r\n\t\t}\r\n\t}\r\n\tif (maker) {\r\n\t\t// we have 1+ confusable\r\n\t\t// check if any of the remaining groups\r\n\t\t// contain the shared characters too\r\n\t\tfor (let g of maker) {\r\n\t\t\tif (shared.every(cp => group_has_cp(g, cp))) {\r\n\t\t\t\tthrow new Error(`whole-script confusable: ${group.N}/${g.N}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// assumption: unique.size > 0\r\n// returns list of matching groups\r\nfunction determine_group(unique) {\r\n\tlet groups = GROUPS;\r\n\tfor (let cp of unique) {\r\n\t\t// note: we need to dodge CM that are whitelisted\r\n\t\t// but that code isn't currently necessary\r\n\t\tlet gs = groups.filter(g => group_has_cp(g, cp));\r\n\t\tif (!gs.length) {\r\n\t\t\tif (!GROUPS.some(g => group_has_cp(g, cp))) { \r\n\t\t\t\t// the character was composed of valid parts\r\n\t\t\t\t// but it's NFC form is invalid\r\n\t\t\t\t// 20230716: change to more exact statement, see: ENSNormalize.{cs,java}\r\n\t\t\t\t// note: this doesn't have to be a composition\r\n\t\t\t\t// 20230720: change to full check\r\n\t\t\t\tthrow error_disallowed(cp); // this should be rare\r\n\t\t\t} else {\r\n\t\t\t\t// there is no group that contains all these characters\r\n\t\t\t\t// throw using the highest priority group that matched\r\n\t\t\t\t// https://www.unicode.org/reports/tr39/#mixed_script_confusables\r\n\t\t\t\tthrow error_group_member(groups[0], cp);\r\n\t\t\t}\r\n\t\t}\r\n\t\tgroups = gs;\r\n\t\tif (gs.length == 1) break; // there is only one group left\r\n\t}\r\n\t// there are at least 1 group(s) with all of these characters\r\n\treturn groups;\r\n}\r\n\r\n// throw on first error\r\nfunction flatten(split) {\r\n\treturn split.map(({input, error, output}) => {\r\n\t\tif (error) {\r\n\t\t\t// don't print label again if just a single label\r\n\t\t\tlet msg = error.message;\r\n\t\t\t// bidi_qq() only necessary if msg is digits\r\n\t\t\tthrow new Error(split.length == 1 ? msg : `Invalid label ${bidi_qq(safe_str_from_cps(input, 63))}: ${msg}`); \r\n\t\t}\r\n\t\treturn str_from_cps(output);\r\n\t}).join(STOP_CH);\r\n}\r\n\r\nfunction error_disallowed(cp) {\r\n\t// TODO: add cp to error?\r\n\treturn new Error(`disallowed character: ${quoted_cp(cp)}`); \r\n}\r\nfunction error_group_member(g, cp) {\r\n\tlet quoted = quoted_cp(cp);\r\n\tlet gg = GROUPS.find(g => g.P.has(cp)); // only check primary\r\n\tif (gg) {\r\n\t\tquoted = `${gg.N} ${quoted}`;\r\n\t}\r\n\treturn new Error(`illegal mixture: ${g.N} + ${quoted}`);\r\n}\r\nfunction error_placement(where) {\r\n\treturn new Error(`illegal placement: ${where}`);\r\n}\r\n\r\n// assumption: cps.length > 0\r\n// assumption: cps[0] isn't a CM\r\n// assumption: the previous character isn't an emoji\r\nfunction check_group(g, cps) {\r\n\tfor (let cp of cps) {\r\n\t\tif (!group_has_cp(g, cp)) {\r\n\t\t\t// for whitelisted scripts, this will throw illegal mixture on invalid cm, eg. \"e{300}{300}\"\r\n\t\t\t// at the moment, it's unnecessary to introduce an extra error type\r\n\t\t\t// until there exists a whitelisted multi-character\r\n\t\t\t// eg. if (M < 0 && is_combining_mark(cp)) { ... }\r\n\t\t\t// there are 3 cases:\r\n\t\t\t// 1. illegal cm for wrong group => mixture error\r\n\t\t\t// 2. illegal cm for same group => cm error\r\n\t\t\t// requires set of whitelist cm per group: \r\n\t\t\t// eg. new Set([...g.P, ...g.Q].flatMap(nfc).filter(cp => CM.has(cp)))\r\n\t\t\t// 3. wrong group => mixture error\r\n\t\t\tthrow error_group_member(g, cp);\r\n\t\t}\r\n\t}\r\n\t//if (M >= 0) { // we have a known fixed cm count\r\n\tif (g.M) { // we need to check for NSM\r\n\t\tlet decomposed = nfd(cps);\r\n\t\tfor (let i = 1, e = decomposed.length; i < e; i++) { // see: assumption\r\n\t\t\t// 20230210: bugfix: using cps instead of decomposed h/t Carbon225\r\n\t\t\t/*\r\n\t\t\tif (CM.has(decomposed[i])) {\r\n\t\t\t\tlet j = i + 1;\r\n\t\t\t\twhile (j < e && CM.has(decomposed[j])) j++;\r\n\t\t\t\tif (j - i > M) {\r\n\t\t\t\t\tthrow new Error(`too many combining marks: ${g.N} ${bidi_qq(str_from_cps(decomposed.slice(i-1, j)))} (${j-i}/${M})`);\r\n\t\t\t\t}\r\n\t\t\t\ti = j;\r\n\t\t\t}\r\n\t\t\t*/\r\n\t\t\t// 20230217: switch to NSM counting\r\n\t\t\t// https://www.unicode.org/reports/tr39/#Optional_Detection\r\n\t\t\tif (NSM.has(decomposed[i])) {\r\n\t\t\t\tlet j = i + 1;\r\n\t\t\t\tfor (let cp; j < e && NSM.has(cp = decomposed[j]); j++) {\r\n\t\t\t\t\t// a. Forbid sequences of the same nonspacing mark.\r\n\t\t\t\t\tfor (let k = i; k < j; k++) { // O(n^2) but n < 100\r\n\t\t\t\t\t\tif (decomposed[k] == cp) {\r\n\t\t\t\t\t\t\tthrow new Error(`duplicate non-spacing marks: ${quoted_cp(cp)}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// parse to end so we have full nsm count\r\n\t\t\t\t// b. Forbid sequences of more than 4 nonspacing marks (gc=Mn or gc=Me).\r\n\t\t\t\tif (j - i > NSM_MAX) {\r\n\t\t\t\t\t// note: this slice starts with a base char or spacing-mark cm\r\n\t\t\t\t\tthrow new Error(`excessive non-spacing marks: ${bidi_qq(safe_str_from_cps(decomposed.slice(i-1, j)))} (${j-i}/${NSM_MAX})`);\r\n\t\t\t\t}\r\n\t\t\t\ti = j;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// *** this code currently isn't needed ***\r\n\t/*\r\n\tlet cm_whitelist = M instanceof Map;\r\n\tfor (let i = 0, e = cps.length; i < e; ) {\r\n\t\tlet cp = cps[i++];\r\n\t\tlet seqs = cm_whitelist && M.get(cp);\r\n\t\tif (seqs) { \r\n\t\t\t// list of codepoints that can follow\r\n\t\t\t// if this exists, this will always be 1+\r\n\t\t\tlet j = i;\r\n\t\t\twhile (j < e && CM.has(cps[j])) j++;\r\n\t\t\tlet cms = cps.slice(i, j);\r\n\t\t\tlet match = seqs.find(seq => !compare_arrays(seq, cms));\r\n\t\t\tif (!match) throw new Error(`disallowed combining mark sequence: \"${safe_str_from_cps([cp, ...cms])}\"`);\r\n\t\t\ti = j;\r\n\t\t} else if (!V.has(cp)) {\r\n\t\t\t// https://www.unicode.org/reports/tr39/#mixed_script_confusables\r\n\t\t\tlet quoted = quoted_cp(cp);\r\n\t\t\tfor (let cp of cps) {\r\n\t\t\t\tlet u = UNIQUE.get(cp);\r\n\t\t\t\tif (u && u !== g) {\r\n\t\t\t\t\t// if both scripts are restricted this error is confusing\r\n\t\t\t\t\t// because we don't differentiate RestrictedA from RestrictedB \r\n\t\t\t\t\tif (!u.R) quoted = `${quoted} is ${u.N}`;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthrow new Error(`disallowed ${g.N} character: ${quoted}`);\r\n\t\t\t//throw new Error(`disallowed character: ${quoted} (expected ${g.N})`);\r\n\t\t\t//throw new Error(`${g.N} does not allow: ${quoted}`);\r\n\t\t}\r\n\t}\r\n\tif (!cm_whitelist) {\r\n\t\tlet decomposed = nfd(cps);\r\n\t\tfor (let i = 1, e = decomposed.length; i < e; i++) { // we know it can't be cm leading\r\n\t\t\tif (CM.has(decomposed[i])) {\r\n\t\t\t\tlet j = i + 1;\r\n\t\t\t\twhile (j < e && CM.has(decomposed[j])) j++;\r\n\t\t\t\tif (j - i > M) {\r\n\t\t\t\t\tthrow new Error(`too many combining marks: \"${str_from_cps(decomposed.slice(i-1, j))}\" (${j-i}/${M})`);\r\n\t\t\t\t}\r\n\t\t\t\ti = j;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t*/\r\n}\r\n\r\n// given a list of codepoints\r\n// returns a list of lists, where emoji are a fully-qualified (as Array subclass)\r\n// eg. explode_cp(\"abc💩d\") => [[61, 62, 63], Emoji[1F4A9, FE0F], [64]]\r\n// 20230818: rename for 'process' name collision h/t Javarome\r\n// https://github.com/adraffy/ens-normalize.js/issues/23\r\nfunction tokens_from_str(input, nf, ef) {\r\n\tlet ret = [];\r\n\tlet chars = [];\r\n\tinput = input.slice().reverse(); // flip so we can pop\r\n\twhile (input.length) {\r\n\t\tlet emoji = consume_emoji_reversed(input);\r\n\t\tif (emoji) {\r\n\t\t\tif (chars.length) {\r\n\t\t\t\tret.push(nf(chars));\r\n\t\t\t\tchars = [];\r\n\t\t\t}\r\n\t\t\tret.push(ef(emoji));\r\n\t\t} else {\r\n\t\t\tlet cp = input.pop();\r\n\t\t\tif (VALID.has(cp)) {\r\n\t\t\t\tchars.push(cp);\r\n\t\t\t} else {\r\n\t\t\t\tlet cps = MAPPED.get(cp);\r\n\t\t\t\tif (cps) {\r\n\t\t\t\t\tchars.push(...cps); // less than 10 elements\r\n\t\t\t\t} else if (!IGNORED.has(cp)) {\r\n\t\t\t\t\t// 20230912: unicode 15.1 changed the order of processing such that\r\n\t\t\t\t\t// disallowed parts are only rejected after NFC\r\n\t\t\t\t\t// https://unicode.org/reports/tr46/#Validity_Criteria\r\n\t\t\t\t\t// this doesn't impact normalization as of today\r\n\t\t\t\t\t// technically, this error can be removed as the group logic will apply similar logic\r\n\t\t\t\t\t// however the error type might be less clear\r\n\t\t\t\t\tthrow error_disallowed(cp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (chars.length) {\r\n\t\tret.push(nf(chars));\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\nfunction filter_fe0f(cps) {\r\n\treturn cps.filter(cp => cp != FE0F);\r\n}\r\n\r\n// given array of codepoints\r\n// returns the longest valid emoji sequence (or undefined if no match)\r\n// *MUTATES* the supplied array\r\n// disallows interleaved ignored characters\r\n// fills (optional) eaten array with matched codepoints\r\nfunction consume_emoji_reversed(cps, eaten) {\r\n\tlet node = EMOJI_ROOT;\r\n\tlet emoji;\r\n\tlet pos = cps.length;\r\n\twhile (pos) {\r\n\t\tnode = node.get(cps[--pos]);\r\n\t\tif (!node) break;\r\n\t\tlet {V} = node;\r\n\t\tif (V) { // this is a valid emoji (so far)\r\n\t\t\temoji = V;\r\n\t\t\tif (eaten) eaten.push(...cps.slice(pos).reverse()); // (optional) copy input, used for ens_tokenize()\r\n\t\t\tcps.length = pos; // truncate\r\n\t\t}\r\n\t}\r\n\treturn emoji;\r\n}\r\n\r\n// ************************************************************\r\n// tokenizer \r\n\r\nconst TY_VALID = 'valid';\r\nconst TY_MAPPED = 'mapped';\r\nconst TY_IGNORED = 'ignored';\r\nconst TY_DISALLOWED = 'disallowed';\r\nconst TY_EMOJI = 'emoji';\r\nconst TY_NFC = 'nfc';\r\nconst TY_STOP = 'stop';\r\n\r\nfunction ens_tokenize(name, {\r\n\tnf = true, // collapse unnormalized runs into a single token\r\n} = {}) {\r\n\tinit();\r\n\tlet input = explode_cp(name).reverse();\r\n\tlet eaten = [];\r\n\tlet tokens = [];\r\n\twhile (input.length) {\r\n\t\tlet emoji = consume_emoji_reversed(input, eaten);\r\n\t\tif (emoji) {\r\n\t\t\ttokens.push({\r\n\t\t\t\ttype: TY_EMOJI,\r\n\t\t\t\temoji: emoji.slice(), // copy emoji\r\n\t\t\t\tinput: eaten,\r\n\t\t\t\tcps: filter_fe0f(emoji)\r\n\t\t\t});\r\n\t\t\teaten = []; // reset buffer\r\n\t\t} else {\r\n\t\t\tlet cp = input.pop();\r\n\t\t\tif (cp == STOP) {\r\n\t\t\t\ttokens.push({type: TY_STOP, cp});\r\n\t\t\t} else if (VALID.has(cp)) {\r\n\t\t\t\ttokens.push({type: TY_VALID, cps: [cp]});\r\n\t\t\t} else if (IGNORED.has(cp)) {\r\n\t\t\t\ttokens.push({type: TY_IGNORED, cp});\r\n\t\t\t} else {\r\n\t\t\t\tlet cps = MAPPED.get(cp);\r\n\t\t\t\tif (cps) {\r\n\t\t\t\t\ttokens.push({type: TY_MAPPED, cp, cps: cps.slice()});\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttokens.push({type: TY_DISALLOWED, cp});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (nf) {\r\n\t\tfor (let i = 0, start = -1; i < tokens.length; i++) {\r\n\t\t\tlet token = tokens[i];\r\n\t\t\tif (is_valid_or_mapped(token.type)) {\r\n\t\t\t\tif (requires_check(token.cps)) { // normalization might be needed\r\n\t\t\t\t\tlet end = i + 1;\r\n\t\t\t\t\tfor (let pos = end; pos < tokens.length; pos++) { // find adjacent text\r\n\t\t\t\t\t\tlet {type, cps} = tokens[pos];\r\n\t\t\t\t\t\tif (is_valid_or_mapped(type)) {\r\n\t\t\t\t\t\t\tif (!requires_check(cps)) break;\r\n\t\t\t\t\t\t\tend = pos + 1;\r\n\t\t\t\t\t\t} else if (type !== TY_IGNORED) { // || type !== TY_DISALLOWED) { \r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (start < 0) start = i;\r\n\t\t\t\t\tlet slice = tokens.slice(start, end);\r\n\t\t\t\t\tlet cps0 = slice.flatMap(x => is_valid_or_mapped(x.type) ? x.cps : []); // strip junk tokens\r\n\t\t\t\t\tlet cps = nfc(cps0);\r\n\t\t\t\t\tif (compare_arrays(cps, cps0)) { // bundle into an nfc token\r\n\t\t\t\t\t\ttokens.splice(start, end - start, {\r\n\t\t\t\t\t\t\ttype: TY_NFC, \r\n\t\t\t\t\t\t\tinput: cps0, // there are 3 states: tokens0 ==(process)=> input ==(nfc)=> tokens/cps\r\n\t\t\t\t\t\t\tcps, \r\n\t\t\t\t\t\t\ttokens0: collapse_valid_tokens(slice),\r\n\t\t\t\t\t\t\ttokens: ens_tokenize(str_from_cps(cps), {nf: false})\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\ti = start;\r\n\t\t\t\t\t} else { \r\n\t\t\t\t\t\ti = end - 1; // skip to end of slice\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstart = -1; // reset\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstart = i; // remember last\r\n\t\t\t\t}\r\n\t\t\t} else if (token.type !== TY_IGNORED) { // 20221024: is this correct?\r\n\t\t\t\tstart = -1; // reset\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn collapse_valid_tokens(tokens);\r\n}\r\n\r\nfunction is_valid_or_mapped(type) {\r\n\treturn type == TY_VALID || type == TY_MAPPED;\r\n}\r\n\r\nfunction requires_check(cps) {\r\n\treturn cps.some(cp => NFC_CHECK.has(cp));\r\n}\r\n\r\nfunction collapse_valid_tokens(tokens) {\r\n\tfor (let i = 0; i < tokens.length; i++) {\r\n\t\tif (tokens[i].type == TY_VALID) {\r\n\t\t\tlet j = i + 1;\r\n\t\t\twhile (j < tokens.length && tokens[j].type == TY_VALID) j++;\r\n\t\t\ttokens.splice(i, j - i, {type: TY_VALID, cps: tokens.slice(i, j).flatMap(x => x.cps)});\r\n\t\t}\r\n\t}\r\n\treturn tokens;\r\n}\n\nexport { ens_beautify, ens_emoji, ens_normalize, ens_normalize_fragment, ens_split, ens_tokenize, is_combining_mark, nfc, nfd, safe_str_from_cps, should_escape };\n","import { keccak256 } from \"../crypto/index.js\";\nimport { concat, hexlify, assertArgument, toUtf8Bytes } from \"../utils/index.js\";\nimport { ens_normalize } from \"@adraffy/ens-normalize\";\nconst Zeros = new Uint8Array(32);\nZeros.fill(0);\nfunction checkComponent(comp) {\n assertArgument(comp.length !== 0, \"invalid ENS name; empty component\", \"comp\", comp);\n return comp;\n}\nfunction ensNameSplit(name) {\n const bytes = toUtf8Bytes(ensNormalize(name));\n const comps = [];\n if (name.length === 0) {\n return comps;\n }\n let last = 0;\n for (let i = 0; i < bytes.length; i++) {\n const d = bytes[i];\n // A separator (i.e. \".\"); copy this component\n if (d === 0x2e) {\n comps.push(checkComponent(bytes.slice(last, i)));\n last = i + 1;\n }\n }\n // There was a stray separator at the end of the name\n assertArgument(last < bytes.length, \"invalid ENS name; empty component\", \"name\", name);\n comps.push(checkComponent(bytes.slice(last)));\n return comps;\n}\n/**\n * Returns the ENS %%name%% normalized.\n */\nexport function ensNormalize(name) {\n try {\n if (name.length === 0) {\n throw new Error(\"empty label\");\n }\n return ens_normalize(name);\n }\n catch (error) {\n assertArgument(false, `invalid ENS name (${error.message})`, \"name\", name);\n }\n}\n/**\n * Returns ``true`` if %%name%% is a valid ENS name.\n */\nexport function isValidName(name) {\n try {\n return (ensNameSplit(name).length !== 0);\n }\n catch (error) { }\n return false;\n}\n/**\n * Returns the [[link-namehash]] for %%name%%.\n */\nexport function namehash(name) {\n assertArgument(typeof (name) === \"string\", \"invalid ENS name; not a string\", \"name\", name);\n assertArgument(name.length, `invalid ENS name (empty label)`, \"name\", name);\n let result = Zeros;\n const comps = ensNameSplit(name);\n while (comps.length) {\n result = keccak256(concat([result, keccak256((comps.pop()))]));\n }\n return hexlify(result);\n}\n/**\n * Returns the DNS encoded %%name%%.\n *\n * This is used for various parts of ENS name resolution, such\n * as the wildcard resolution.\n */\nexport function dnsEncode(name, _maxLength) {\n const length = (_maxLength != null) ? _maxLength : 63;\n assertArgument(length <= 255, \"DNS encoded label cannot exceed 255\", \"length\", length);\n return hexlify(concat(ensNameSplit(name).map((comp) => {\n assertArgument(comp.length <= length, `label ${JSON.stringify(name)} exceeds ${length} bytes`, \"name\", name);\n const bytes = new Uint8Array(comp.length + 1);\n bytes.set(comp, 1);\n bytes[0] = bytes.length - 1;\n return bytes;\n }))) + \"00\";\n}\n//# sourceMappingURL=namehash.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { MessagePrefix } from \"../constants/index.js\";\nimport { recoverAddress } from \"../transaction/index.js\";\nimport { concat, toUtf8Bytes } from \"../utils/index.js\";\n/**\n * Computes the [[link-eip-191]] personal-sign message digest to sign.\n *\n * This prefixes the message with [[MessagePrefix]] and the decimal length\n * of %%message%% and computes the [[keccak256]] digest.\n *\n * If %%message%% is a string, it is converted to its UTF-8 bytes\n * first. To compute the digest of a [[DataHexString]], it must be converted\n * to [bytes](getBytes).\n *\n * @example:\n * hashMessage(\"Hello World\")\n * //_result:\n *\n * // Hashes the SIX (6) string characters, i.e.\n * // [ \"0\", \"x\", \"4\", \"2\", \"4\", \"3\" ]\n * hashMessage(\"0x4243\")\n * //_result:\n *\n * // Hashes the TWO (2) bytes [ 0x42, 0x43 ]...\n * hashMessage(getBytes(\"0x4243\"))\n * //_result:\n *\n * // ...which is equal to using data\n * hashMessage(new Uint8Array([ 0x42, 0x43 ]))\n * //_result:\n *\n */\nexport function hashMessage(message) {\n if (typeof (message) === \"string\") {\n message = toUtf8Bytes(message);\n }\n return keccak256(concat([\n toUtf8Bytes(MessagePrefix),\n toUtf8Bytes(String(message.length)),\n message\n ]));\n}\n/**\n * Return the address of the private key that produced\n * the signature %%sig%% during signing for %%message%%.\n */\nexport function verifyMessage(message, sig) {\n const digest = hashMessage(message);\n return recoverAddress(digest, sig);\n}\n//# sourceMappingURL=message.js.map","import { getAddress } from \"../address/index.js\";\nimport { keccak256 as _keccak256, sha256 as _sha256 } from \"../crypto/index.js\";\nimport { concat, dataLength, getBytes, hexlify, toBeArray, toTwos, toUtf8Bytes, zeroPadBytes, zeroPadValue, assertArgument } from \"../utils/index.js\";\nconst regexBytes = new RegExp(\"^bytes([0-9]+)$\");\nconst regexNumber = new RegExp(\"^(u?int)([0-9]*)$\");\nconst regexArray = new RegExp(\"^(.*)\\\\[([0-9]*)\\\\]$\");\nfunction _pack(type, value, isArray) {\n switch (type) {\n case \"address\":\n if (isArray) {\n return getBytes(zeroPadValue(value, 32));\n }\n return getBytes(getAddress(value));\n case \"string\":\n return toUtf8Bytes(value);\n case \"bytes\":\n return getBytes(value);\n case \"bool\":\n value = (!!value ? \"0x01\" : \"0x00\");\n if (isArray) {\n return getBytes(zeroPadValue(value, 32));\n }\n return getBytes(value);\n }\n let match = type.match(regexNumber);\n if (match) {\n let signed = (match[1] === \"int\");\n let size = parseInt(match[2] || \"256\");\n assertArgument((!match[2] || match[2] === String(size)) && (size % 8 === 0) && size !== 0 && size <= 256, \"invalid number type\", \"type\", type);\n if (isArray) {\n size = 256;\n }\n if (signed) {\n value = toTwos(value, size);\n }\n return getBytes(zeroPadValue(toBeArray(value), size / 8));\n }\n match = type.match(regexBytes);\n if (match) {\n const size = parseInt(match[1]);\n assertArgument(String(size) === match[1] && size !== 0 && size <= 32, \"invalid bytes type\", \"type\", type);\n assertArgument(dataLength(value) === size, `invalid value for ${type}`, \"value\", value);\n if (isArray) {\n return getBytes(zeroPadBytes(value, 32));\n }\n return value;\n }\n match = type.match(regexArray);\n if (match && Array.isArray(value)) {\n const baseType = match[1];\n const count = parseInt(match[2] || String(value.length));\n assertArgument(count === value.length, `invalid array length for ${type}`, \"value\", value);\n const result = [];\n value.forEach(function (value) {\n result.push(_pack(baseType, value, true));\n });\n return getBytes(concat(result));\n }\n assertArgument(false, \"invalid type\", \"type\", type);\n}\n// @TODO: Array Enum\n/**\n * Computes the [[link-solc-packed]] representation of %%values%%\n * respectively to their %%types%%.\n *\n * @example:\n * addr = \"0x8ba1f109551bd432803012645ac136ddd64dba72\"\n * solidityPacked([ \"address\", \"uint\" ], [ addr, 45 ]);\n * //_result:\n */\nexport function solidityPacked(types, values) {\n assertArgument(types.length === values.length, \"wrong number of values; expected ${ types.length }\", \"values\", values);\n const tight = [];\n types.forEach(function (type, index) {\n tight.push(_pack(type, values[index]));\n });\n return hexlify(concat(tight));\n}\n/**\n * Computes the [[link-solc-packed]] [[keccak256]] hash of %%values%%\n * respectively to their %%types%%.\n *\n * @example:\n * addr = \"0x8ba1f109551bd432803012645ac136ddd64dba72\"\n * solidityPackedKeccak256([ \"address\", \"uint\" ], [ addr, 45 ]);\n * //_result:\n */\nexport function solidityPackedKeccak256(types, values) {\n return _keccak256(solidityPacked(types, values));\n}\n/**\n * Computes the [[link-solc-packed]] [[sha256]] hash of %%values%%\n * respectively to their %%types%%.\n *\n * @example:\n * addr = \"0x8ba1f109551bd432803012645ac136ddd64dba72\"\n * solidityPackedSha256([ \"address\", \"uint\" ], [ addr, 45 ]);\n * //_result:\n */\nexport function solidityPackedSha256(types, values) {\n return _sha256(solidityPacked(types, values));\n}\n//# sourceMappingURL=solidity.js.map","//import { TypedDataDomain, TypedDataField } from \"@ethersproject/providerabstract-signer\";\nimport { getAddress } from \"../address/index.js\";\nimport { keccak256 } from \"../crypto/index.js\";\nimport { recoverAddress } from \"../transaction/index.js\";\nimport { concat, defineProperties, getBigInt, getBytes, hexlify, isHexString, mask, toBeHex, toQuantity, toTwos, zeroPadValue, assertArgument } from \"../utils/index.js\";\nimport { id } from \"./id.js\";\nconst padding = new Uint8Array(32);\npadding.fill(0);\nconst BN__1 = BigInt(-1);\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n;\n;\nfunction hexPadRight(value) {\n const bytes = getBytes(value);\n const padOffset = bytes.length % 32;\n if (padOffset) {\n return concat([bytes, padding.slice(padOffset)]);\n }\n return hexlify(bytes);\n}\nconst hexTrue = toBeHex(BN_1, 32);\nconst hexFalse = toBeHex(BN_0, 32);\nconst domainFieldTypes = {\n name: \"string\",\n version: \"string\",\n chainId: \"uint256\",\n verifyingContract: \"address\",\n salt: \"bytes32\"\n};\nconst domainFieldNames = [\n \"name\", \"version\", \"chainId\", \"verifyingContract\", \"salt\"\n];\nfunction checkString(key) {\n return function (value) {\n assertArgument(typeof (value) === \"string\", `invalid domain value for ${JSON.stringify(key)}`, `domain.${key}`, value);\n return value;\n };\n}\nconst domainChecks = {\n name: checkString(\"name\"),\n version: checkString(\"version\"),\n chainId: function (_value) {\n const value = getBigInt(_value, \"domain.chainId\");\n assertArgument(value >= 0, \"invalid chain ID\", \"domain.chainId\", _value);\n if (Number.isSafeInteger(value)) {\n return Number(value);\n }\n return toQuantity(value);\n },\n verifyingContract: function (value) {\n try {\n return getAddress(value).toLowerCase();\n }\n catch (error) { }\n assertArgument(false, `invalid domain value \"verifyingContract\"`, \"domain.verifyingContract\", value);\n },\n salt: function (value) {\n const bytes = getBytes(value, \"domain.salt\");\n assertArgument(bytes.length === 32, `invalid domain value \"salt\"`, \"domain.salt\", value);\n return hexlify(bytes);\n }\n};\nfunction getBaseEncoder(type) {\n // intXX and uintXX\n {\n const match = type.match(/^(u?)int(\\d+)$/);\n if (match) {\n const signed = (match[1] === \"\");\n const width = parseInt(match[2]);\n assertArgument(width % 8 === 0 && width !== 0 && width <= 256 && match[2] === String(width), \"invalid numeric width\", \"type\", type);\n const boundsUpper = mask(BN_MAX_UINT256, signed ? (width - 1) : width);\n const boundsLower = signed ? ((boundsUpper + BN_1) * BN__1) : BN_0;\n return function (_value) {\n const value = getBigInt(_value, \"value\");\n assertArgument(value >= boundsLower && value <= boundsUpper, `value out-of-bounds for ${type}`, \"value\", value);\n return toBeHex(signed ? toTwos(value, 256) : value, 32);\n };\n }\n }\n // bytesXX\n {\n const match = type.match(/^bytes(\\d+)$/);\n if (match) {\n const width = parseInt(match[1]);\n assertArgument(width !== 0 && width <= 32 && match[1] === String(width), \"invalid bytes width\", \"type\", type);\n return function (value) {\n const bytes = getBytes(value);\n assertArgument(bytes.length === width, `invalid length for ${type}`, \"value\", value);\n return hexPadRight(value);\n };\n }\n }\n switch (type) {\n case \"address\": return function (value) {\n return zeroPadValue(getAddress(value), 32);\n };\n case \"bool\": return function (value) {\n return ((!value) ? hexFalse : hexTrue);\n };\n case \"bytes\": return function (value) {\n return keccak256(value);\n };\n case \"string\": return function (value) {\n return id(value);\n };\n }\n return null;\n}\nfunction encodeType(name, fields) {\n return `${name}(${fields.map(({ name, type }) => (type + \" \" + name)).join(\",\")})`;\n}\n// foo[][3] => { base: \"foo\", index: \"[][3]\", array: {\n// base: \"foo\", prefix: \"foo[]\", count: 3 } }\nfunction splitArray(type) {\n const match = type.match(/^([^\\x5b]*)((\\x5b\\d*\\x5d)*)(\\x5b(\\d*)\\x5d)$/);\n if (match) {\n return {\n base: match[1],\n index: (match[2] + match[4]),\n array: {\n base: match[1],\n prefix: (match[1] + match[2]),\n count: (match[5] ? parseInt(match[5]) : -1),\n }\n };\n }\n return { base: type };\n}\n/**\n * A **TypedDataEncode** prepares and encodes [[link-eip-712]] payloads\n * for signed typed data.\n *\n * This is useful for those that wish to compute various components of a\n * typed data hash, primary types, or sub-components, but generally the\n * higher level [[Signer-signTypedData]] is more useful.\n */\nexport class TypedDataEncoder {\n /**\n * The primary type for the structured [[types]].\n *\n * This is derived automatically from the [[types]], since no\n * recursion is possible, once the DAG for the types is consturcted\n * internally, the primary type must be the only remaining type with\n * no parent nodes.\n */\n primaryType;\n #types;\n /**\n * The types.\n */\n get types() {\n return JSON.parse(this.#types);\n }\n #fullTypes;\n #encoderCache;\n /**\n * Create a new **TypedDataEncoder** for %%types%%.\n *\n * This performs all necessary checking that types are valid and\n * do not violate the [[link-eip-712]] structural constraints as\n * well as computes the [[primaryType]].\n */\n constructor(_types) {\n this.#fullTypes = new Map();\n this.#encoderCache = new Map();\n // Link struct types to their direct child structs\n const links = new Map();\n // Link structs to structs which contain them as a child\n const parents = new Map();\n // Link all subtypes within a given struct\n const subtypes = new Map();\n const types = {};\n Object.keys(_types).forEach((type) => {\n types[type] = _types[type].map(({ name, type }) => {\n // Normalize the base type (unless name conflict)\n let { base, index } = splitArray(type);\n if (base === \"int\" && !_types[\"int\"]) {\n base = \"int256\";\n }\n if (base === \"uint\" && !_types[\"uint\"]) {\n base = \"uint256\";\n }\n return { name, type: (base + (index || \"\")) };\n });\n links.set(type, new Set());\n parents.set(type, []);\n subtypes.set(type, new Set());\n });\n this.#types = JSON.stringify(types);\n for (const name in types) {\n const uniqueNames = new Set();\n for (const field of types[name]) {\n // Check each field has a unique name\n assertArgument(!uniqueNames.has(field.name), `duplicate variable name ${JSON.stringify(field.name)} in ${JSON.stringify(name)}`, \"types\", _types);\n uniqueNames.add(field.name);\n // Get the base type (drop any array specifiers)\n const baseType = splitArray(field.type).base;\n assertArgument(baseType !== name, `circular type reference to ${JSON.stringify(baseType)}`, \"types\", _types);\n // Is this a base encoding type?\n const encoder = getBaseEncoder(baseType);\n if (encoder) {\n continue;\n }\n assertArgument(parents.has(baseType), `unknown type ${JSON.stringify(baseType)}`, \"types\", _types);\n // Add linkage\n parents.get(baseType).push(name);\n links.get(name).add(baseType);\n }\n }\n // Deduce the primary type\n const primaryTypes = Array.from(parents.keys()).filter((n) => (parents.get(n).length === 0));\n assertArgument(primaryTypes.length !== 0, \"missing primary type\", \"types\", _types);\n assertArgument(primaryTypes.length === 1, `ambiguous primary types or unused types: ${primaryTypes.map((t) => (JSON.stringify(t))).join(\", \")}`, \"types\", _types);\n defineProperties(this, { primaryType: primaryTypes[0] });\n // Check for circular type references\n function checkCircular(type, found) {\n assertArgument(!found.has(type), `circular type reference to ${JSON.stringify(type)}`, \"types\", _types);\n found.add(type);\n for (const child of links.get(type)) {\n if (!parents.has(child)) {\n continue;\n }\n // Recursively check children\n checkCircular(child, found);\n // Mark all ancestors as having this decendant\n for (const subtype of found) {\n subtypes.get(subtype).add(child);\n }\n }\n found.delete(type);\n }\n checkCircular(this.primaryType, new Set());\n // Compute each fully describe type\n for (const [name, set] of subtypes) {\n const st = Array.from(set);\n st.sort();\n this.#fullTypes.set(name, encodeType(name, types[name]) + st.map((t) => encodeType(t, types[t])).join(\"\"));\n }\n }\n /**\n * Returnthe encoder for the specific %%type%%.\n */\n getEncoder(type) {\n let encoder = this.#encoderCache.get(type);\n if (!encoder) {\n encoder = this.#getEncoder(type);\n this.#encoderCache.set(type, encoder);\n }\n return encoder;\n }\n #getEncoder(type) {\n // Basic encoder type (address, bool, uint256, etc)\n {\n const encoder = getBaseEncoder(type);\n if (encoder) {\n return encoder;\n }\n }\n // Array\n const array = splitArray(type).array;\n if (array) {\n const subtype = array.prefix;\n const subEncoder = this.getEncoder(subtype);\n return (value) => {\n assertArgument(array.count === -1 || array.count === value.length, `array length mismatch; expected length ${array.count}`, \"value\", value);\n let result = value.map(subEncoder);\n if (this.#fullTypes.has(subtype)) {\n result = result.map(keccak256);\n }\n return keccak256(concat(result));\n };\n }\n // Struct\n const fields = this.types[type];\n if (fields) {\n const encodedType = id(this.#fullTypes.get(type));\n return (value) => {\n const values = fields.map(({ name, type }) => {\n const result = this.getEncoder(type)(value[name]);\n if (this.#fullTypes.has(type)) {\n return keccak256(result);\n }\n return result;\n });\n values.unshift(encodedType);\n return concat(values);\n };\n }\n assertArgument(false, `unknown type: ${type}`, \"type\", type);\n }\n /**\n * Return the full type for %%name%%.\n */\n encodeType(name) {\n const result = this.#fullTypes.get(name);\n assertArgument(result, `unknown type: ${JSON.stringify(name)}`, \"name\", name);\n return result;\n }\n /**\n * Return the encoded %%value%% for the %%type%%.\n */\n encodeData(type, value) {\n return this.getEncoder(type)(value);\n }\n /**\n * Returns the hash of %%value%% for the type of %%name%%.\n */\n hashStruct(name, value) {\n return keccak256(this.encodeData(name, value));\n }\n /**\n * Return the fulled encoded %%value%% for the [[types]].\n */\n encode(value) {\n return this.encodeData(this.primaryType, value);\n }\n /**\n * Return the hash of the fully encoded %%value%% for the [[types]].\n */\n hash(value) {\n return this.hashStruct(this.primaryType, value);\n }\n /**\n * @_ignore:\n */\n _visit(type, value, callback) {\n // Basic encoder type (address, bool, uint256, etc)\n {\n const encoder = getBaseEncoder(type);\n if (encoder) {\n return callback(type, value);\n }\n }\n // Array\n const array = splitArray(type).array;\n if (array) {\n assertArgument(array.count === -1 || array.count === value.length, `array length mismatch; expected length ${array.count}`, \"value\", value);\n return value.map((v) => this._visit(array.prefix, v, callback));\n }\n // Struct\n const fields = this.types[type];\n if (fields) {\n return fields.reduce((accum, { name, type }) => {\n accum[name] = this._visit(type, value[name], callback);\n return accum;\n }, {});\n }\n assertArgument(false, `unknown type: ${type}`, \"type\", type);\n }\n /**\n * Call %%calback%% for each value in %%value%%, passing the type and\n * component within %%value%%.\n *\n * This is useful for replacing addresses or other transformation that\n * may be desired on each component, based on its type.\n */\n visit(value, callback) {\n return this._visit(this.primaryType, value, callback);\n }\n /**\n * Create a new **TypedDataEncoder** for %%types%%.\n */\n static from(types) {\n return new TypedDataEncoder(types);\n }\n /**\n * Return the primary type for %%types%%.\n */\n static getPrimaryType(types) {\n return TypedDataEncoder.from(types).primaryType;\n }\n /**\n * Return the hashed struct for %%value%% using %%types%% and %%name%%.\n */\n static hashStruct(name, types, value) {\n return TypedDataEncoder.from(types).hashStruct(name, value);\n }\n /**\n * Return the domain hash for %%domain%%.\n */\n static hashDomain(domain) {\n const domainFields = [];\n for (const name in domain) {\n if (domain[name] == null) {\n continue;\n }\n const type = domainFieldTypes[name];\n assertArgument(type, `invalid typed-data domain key: ${JSON.stringify(name)}`, \"domain\", domain);\n domainFields.push({ name, type });\n }\n domainFields.sort((a, b) => {\n return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name);\n });\n return TypedDataEncoder.hashStruct(\"EIP712Domain\", { EIP712Domain: domainFields }, domain);\n }\n /**\n * Return the fully encoded [[link-eip-712]] %%value%% for %%types%% with %%domain%%.\n */\n static encode(domain, types, value) {\n return concat([\n \"0x1901\",\n TypedDataEncoder.hashDomain(domain),\n TypedDataEncoder.from(types).hash(value)\n ]);\n }\n /**\n * Return the hash of the fully encoded [[link-eip-712]] %%value%% for %%types%% with %%domain%%.\n */\n static hash(domain, types, value) {\n return keccak256(TypedDataEncoder.encode(domain, types, value));\n }\n // Replaces all address types with ENS names with their looked up address\n /**\n * Resolves to the value from resolving all addresses in %%value%% for\n * %%types%% and the %%domain%%.\n */\n static async resolveNames(domain, types, value, resolveName) {\n // Make a copy to isolate it from the object passed in\n domain = Object.assign({}, domain);\n // Allow passing null to ignore value\n for (const key in domain) {\n if (domain[key] == null) {\n delete domain[key];\n }\n }\n // Look up all ENS names\n const ensCache = {};\n // Do we need to look up the domain's verifyingContract?\n if (domain.verifyingContract && !isHexString(domain.verifyingContract, 20)) {\n ensCache[domain.verifyingContract] = \"0x\";\n }\n // We are going to use the encoder to visit all the base values\n const encoder = TypedDataEncoder.from(types);\n // Get a list of all the addresses\n encoder.visit(value, (type, value) => {\n if (type === \"address\" && !isHexString(value, 20)) {\n ensCache[value] = \"0x\";\n }\n return value;\n });\n // Lookup each name\n for (const name in ensCache) {\n ensCache[name] = await resolveName(name);\n }\n // Replace the domain verifyingContract if needed\n if (domain.verifyingContract && ensCache[domain.verifyingContract]) {\n domain.verifyingContract = ensCache[domain.verifyingContract];\n }\n // Replace all ENS names with their address\n value = encoder.visit(value, (type, value) => {\n if (type === \"address\" && ensCache[value]) {\n return ensCache[value];\n }\n return value;\n });\n return { domain, value };\n }\n /**\n * Returns the JSON-encoded payload expected by nodes which implement\n * the JSON-RPC [[link-eip-712]] method.\n */\n static getPayload(domain, types, value) {\n // Validate the domain fields\n TypedDataEncoder.hashDomain(domain);\n // Derive the EIP712Domain Struct reference type\n const domainValues = {};\n const domainTypes = [];\n domainFieldNames.forEach((name) => {\n const value = domain[name];\n if (value == null) {\n return;\n }\n domainValues[name] = domainChecks[name](value);\n domainTypes.push({ name, type: domainFieldTypes[name] });\n });\n const encoder = TypedDataEncoder.from(types);\n // Get the normalized types\n types = encoder.types;\n const typesWithDomain = Object.assign({}, types);\n assertArgument(typesWithDomain.EIP712Domain == null, \"types must not contain EIP712Domain type\", \"types.EIP712Domain\", types);\n typesWithDomain.EIP712Domain = domainTypes;\n // Validate the data structures and types\n encoder.encode(value);\n return {\n types: typesWithDomain,\n domain: domainValues,\n primaryType: encoder.primaryType,\n message: encoder.visit(value, (type, value) => {\n // bytes\n if (type.match(/^bytes(\\d*)/)) {\n return hexlify(getBytes(value));\n }\n // uint or int\n if (type.match(/^u?int/)) {\n return getBigInt(value).toString();\n }\n switch (type) {\n case \"address\":\n return value.toLowerCase();\n case \"bool\":\n return !!value;\n case \"string\":\n assertArgument(typeof (value) === \"string\", \"invalid string\", \"value\", value);\n return value;\n }\n assertArgument(false, \"unsupported type\", \"type\", type);\n })\n };\n }\n}\n/**\n * Compute the address used to sign the typed data for the %%signature%%.\n */\nexport function verifyTypedData(domain, types, value, signature) {\n return recoverAddress(TypedDataEncoder.hash(domain, types, value), signature);\n}\n//# sourceMappingURL=typed-data.js.map","/**\n * A fragment is a single item from an ABI, which may represent any of:\n *\n * - [Functions](FunctionFragment)\n * - [Events](EventFragment)\n * - [Constructors](ConstructorFragment)\n * - Custom [Errors](ErrorFragment)\n * - [Fallback or Receive](FallbackFragment) functions\n *\n * @_subsection api/abi/abi-coder:Fragments [about-fragments]\n */\nimport { defineProperties, getBigInt, getNumber, assert, assertPrivate, assertArgument } from \"../utils/index.js\";\nimport { id } from \"../hash/index.js\";\n;\n// [ \"a\", \"b\" ] => { \"a\": 1, \"b\": 1 }\nfunction setify(items) {\n const result = new Set();\n items.forEach((k) => result.add(k));\n return Object.freeze(result);\n}\nconst _kwVisibDeploy = \"external public payable override\";\nconst KwVisibDeploy = setify(_kwVisibDeploy.split(\" \"));\n// Visibility Keywords\nconst _kwVisib = \"constant external internal payable private public pure view override\";\nconst KwVisib = setify(_kwVisib.split(\" \"));\nconst _kwTypes = \"constructor error event fallback function receive struct\";\nconst KwTypes = setify(_kwTypes.split(\" \"));\nconst _kwModifiers = \"calldata memory storage payable indexed\";\nconst KwModifiers = setify(_kwModifiers.split(\" \"));\nconst _kwOther = \"tuple returns\";\n// All Keywords\nconst _keywords = [_kwTypes, _kwModifiers, _kwOther, _kwVisib].join(\" \");\nconst Keywords = setify(_keywords.split(\" \"));\n// Single character tokens\nconst SimpleTokens = {\n \"(\": \"OPEN_PAREN\", \")\": \"CLOSE_PAREN\",\n \"[\": \"OPEN_BRACKET\", \"]\": \"CLOSE_BRACKET\",\n \",\": \"COMMA\", \"@\": \"AT\"\n};\n// Parser regexes to consume the next token\nconst regexWhitespacePrefix = new RegExp(\"^(\\\\s*)\");\nconst regexNumberPrefix = new RegExp(\"^([0-9]+)\");\nconst regexIdPrefix = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)\");\n// Parser regexs to check validity\nconst regexId = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)$\");\nconst regexType = new RegExp(\"^(address|bool|bytes([0-9]*)|string|u?int([0-9]*))$\");\nclass TokenString {\n #offset;\n #tokens;\n get offset() { return this.#offset; }\n get length() { return this.#tokens.length - this.#offset; }\n constructor(tokens) {\n this.#offset = 0;\n this.#tokens = tokens.slice();\n }\n clone() { return new TokenString(this.#tokens); }\n reset() { this.#offset = 0; }\n #subTokenString(from = 0, to = 0) {\n return new TokenString(this.#tokens.slice(from, to).map((t) => {\n return Object.freeze(Object.assign({}, t, {\n match: (t.match - from),\n linkBack: (t.linkBack - from),\n linkNext: (t.linkNext - from),\n }));\n }));\n }\n // Pops and returns the value of the next token, if it is a keyword in allowed; throws if out of tokens\n popKeyword(allowed) {\n const top = this.peek();\n if (top.type !== \"KEYWORD\" || !allowed.has(top.text)) {\n throw new Error(`expected keyword ${top.text}`);\n }\n return this.pop().text;\n }\n // Pops and returns the value of the next token if it is `type`; throws if out of tokens\n popType(type) {\n if (this.peek().type !== type) {\n const top = this.peek();\n throw new Error(`expected ${type}; got ${top.type} ${JSON.stringify(top.text)}`);\n }\n return this.pop().text;\n }\n // Pops and returns a \"(\" TOKENS \")\"\n popParen() {\n const top = this.peek();\n if (top.type !== \"OPEN_PAREN\") {\n throw new Error(\"bad start\");\n }\n const result = this.#subTokenString(this.#offset + 1, top.match + 1);\n this.#offset = top.match + 1;\n return result;\n }\n // Pops and returns the items within \"(\" ITEM1 \",\" ITEM2 \",\" ... \")\"\n popParams() {\n const top = this.peek();\n if (top.type !== \"OPEN_PAREN\") {\n throw new Error(\"bad start\");\n }\n const result = [];\n while (this.#offset < top.match - 1) {\n const link = this.peek().linkNext;\n result.push(this.#subTokenString(this.#offset + 1, link));\n this.#offset = link;\n }\n this.#offset = top.match + 1;\n return result;\n }\n // Returns the top Token, throwing if out of tokens\n peek() {\n if (this.#offset >= this.#tokens.length) {\n throw new Error(\"out-of-bounds\");\n }\n return this.#tokens[this.#offset];\n }\n // Returns the next value, if it is a keyword in `allowed`\n peekKeyword(allowed) {\n const top = this.peekType(\"KEYWORD\");\n return (top != null && allowed.has(top)) ? top : null;\n }\n // Returns the value of the next token if it is `type`\n peekType(type) {\n if (this.length === 0) {\n return null;\n }\n const top = this.peek();\n return (top.type === type) ? top.text : null;\n }\n // Returns the next token; throws if out of tokens\n pop() {\n const result = this.peek();\n this.#offset++;\n return result;\n }\n toString() {\n const tokens = [];\n for (let i = this.#offset; i < this.#tokens.length; i++) {\n const token = this.#tokens[i];\n tokens.push(`${token.type}:${token.text}`);\n }\n return ``;\n }\n}\nfunction lex(text) {\n const tokens = [];\n const throwError = (message) => {\n const token = (offset < text.length) ? JSON.stringify(text[offset]) : \"$EOI\";\n throw new Error(`invalid token ${token} at ${offset}: ${message}`);\n };\n let brackets = [];\n let commas = [];\n let offset = 0;\n while (offset < text.length) {\n // Strip off any leading whitespace\n let cur = text.substring(offset);\n let match = cur.match(regexWhitespacePrefix);\n if (match) {\n offset += match[1].length;\n cur = text.substring(offset);\n }\n const token = { depth: brackets.length, linkBack: -1, linkNext: -1, match: -1, type: \"\", text: \"\", offset, value: -1 };\n tokens.push(token);\n let type = (SimpleTokens[cur[0]] || \"\");\n if (type) {\n token.type = type;\n token.text = cur[0];\n offset++;\n if (type === \"OPEN_PAREN\") {\n brackets.push(tokens.length - 1);\n commas.push(tokens.length - 1);\n }\n else if (type == \"CLOSE_PAREN\") {\n if (brackets.length === 0) {\n throwError(\"no matching open bracket\");\n }\n token.match = brackets.pop();\n (tokens[token.match]).match = tokens.length - 1;\n token.depth--;\n token.linkBack = commas.pop();\n (tokens[token.linkBack]).linkNext = tokens.length - 1;\n }\n else if (type === \"COMMA\") {\n token.linkBack = commas.pop();\n (tokens[token.linkBack]).linkNext = tokens.length - 1;\n commas.push(tokens.length - 1);\n }\n else if (type === \"OPEN_BRACKET\") {\n token.type = \"BRACKET\";\n }\n else if (type === \"CLOSE_BRACKET\") {\n // Remove the CLOSE_BRACKET\n let suffix = tokens.pop().text;\n if (tokens.length > 0 && tokens[tokens.length - 1].type === \"NUMBER\") {\n const value = tokens.pop().text;\n suffix = value + suffix;\n (tokens[tokens.length - 1]).value = getNumber(value);\n }\n if (tokens.length === 0 || tokens[tokens.length - 1].type !== \"BRACKET\") {\n throw new Error(\"missing opening bracket\");\n }\n (tokens[tokens.length - 1]).text += suffix;\n }\n continue;\n }\n match = cur.match(regexIdPrefix);\n if (match) {\n token.text = match[1];\n offset += token.text.length;\n if (Keywords.has(token.text)) {\n token.type = \"KEYWORD\";\n continue;\n }\n if (token.text.match(regexType)) {\n token.type = \"TYPE\";\n continue;\n }\n token.type = \"ID\";\n continue;\n }\n match = cur.match(regexNumberPrefix);\n if (match) {\n token.text = match[1];\n token.type = \"NUMBER\";\n offset += token.text.length;\n continue;\n }\n throw new Error(`unexpected token ${JSON.stringify(cur[0])} at position ${offset}`);\n }\n return new TokenString(tokens.map((t) => Object.freeze(t)));\n}\n// Check only one of `allowed` is in `set`\nfunction allowSingle(set, allowed) {\n let included = [];\n for (const key in allowed.keys()) {\n if (set.has(key)) {\n included.push(key);\n }\n }\n if (included.length > 1) {\n throw new Error(`conflicting types: ${included.join(\", \")}`);\n }\n}\n// Functions to process a Solidity Signature TokenString from left-to-right for...\n// ...the name with an optional type, returning the name\nfunction consumeName(type, tokens) {\n if (tokens.peekKeyword(KwTypes)) {\n const keyword = tokens.pop().text;\n if (keyword !== type) {\n throw new Error(`expected ${type}, got ${keyword}`);\n }\n }\n return tokens.popType(\"ID\");\n}\n// ...all keywords matching allowed, returning the keywords\nfunction consumeKeywords(tokens, allowed) {\n const keywords = new Set();\n while (true) {\n const keyword = tokens.peekType(\"KEYWORD\");\n if (keyword == null || (allowed && !allowed.has(keyword))) {\n break;\n }\n tokens.pop();\n if (keywords.has(keyword)) {\n throw new Error(`duplicate keywords: ${JSON.stringify(keyword)}`);\n }\n keywords.add(keyword);\n }\n return Object.freeze(keywords);\n}\n// ...all visibility keywords, returning the coalesced mutability\nfunction consumeMutability(tokens) {\n let modifiers = consumeKeywords(tokens, KwVisib);\n // Detect conflicting modifiers\n allowSingle(modifiers, setify(\"constant payable nonpayable\".split(\" \")));\n allowSingle(modifiers, setify(\"pure view payable nonpayable\".split(\" \")));\n // Process mutability states\n if (modifiers.has(\"view\")) {\n return \"view\";\n }\n if (modifiers.has(\"pure\")) {\n return \"pure\";\n }\n if (modifiers.has(\"payable\")) {\n return \"payable\";\n }\n if (modifiers.has(\"nonpayable\")) {\n return \"nonpayable\";\n }\n // Process legacy `constant` last\n if (modifiers.has(\"constant\")) {\n return \"view\";\n }\n return \"nonpayable\";\n}\n// ...a parameter list, returning the ParamType list\nfunction consumeParams(tokens, allowIndexed) {\n return tokens.popParams().map((t) => ParamType.from(t, allowIndexed));\n}\n// ...a gas limit, returning a BigNumber or null if none\nfunction consumeGas(tokens) {\n if (tokens.peekType(\"AT\")) {\n tokens.pop();\n if (tokens.peekType(\"NUMBER\")) {\n return getBigInt(tokens.pop().text);\n }\n throw new Error(\"invalid gas\");\n }\n return null;\n}\nfunction consumeEoi(tokens) {\n if (tokens.length) {\n throw new Error(`unexpected tokens at offset ${tokens.offset}: ${tokens.toString()}`);\n }\n}\nconst regexArrayType = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\nfunction verifyBasicType(type) {\n const match = type.match(regexType);\n assertArgument(match, \"invalid type\", \"type\", type);\n if (type === \"uint\") {\n return \"uint256\";\n }\n if (type === \"int\") {\n return \"int256\";\n }\n if (match[2]) {\n // bytesXX\n const length = parseInt(match[2]);\n assertArgument(length !== 0 && length <= 32, \"invalid bytes length\", \"type\", type);\n }\n else if (match[3]) {\n // intXX or uintXX\n const size = parseInt(match[3]);\n assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, \"invalid numeric width\", \"type\", type);\n }\n return type;\n}\n// Make the Fragment constructors effectively private\nconst _guard = {};\nconst internal = Symbol.for(\"_ethers_internal\");\nconst ParamTypeInternal = \"_ParamTypeInternal\";\nconst ErrorFragmentInternal = \"_ErrorInternal\";\nconst EventFragmentInternal = \"_EventInternal\";\nconst ConstructorFragmentInternal = \"_ConstructorInternal\";\nconst FallbackFragmentInternal = \"_FallbackInternal\";\nconst FunctionFragmentInternal = \"_FunctionInternal\";\nconst StructFragmentInternal = \"_StructInternal\";\n/**\n * Each input and output of a [[Fragment]] is an Array of **ParamType**.\n */\nexport class ParamType {\n /**\n * The local name of the parameter (or ``\"\"`` if unbound)\n */\n name;\n /**\n * The fully qualified type (e.g. ``\"address\"``, ``\"tuple(address)\"``,\n * ``\"uint256[3][]\"``)\n */\n type;\n /**\n * The base type (e.g. ``\"address\"``, ``\"tuple\"``, ``\"array\"``)\n */\n baseType;\n /**\n * True if the parameters is indexed.\n *\n * For non-indexable types this is ``null``.\n */\n indexed;\n /**\n * The components for the tuple.\n *\n * For non-tuple types this is ``null``.\n */\n components;\n /**\n * The array length, or ``-1`` for dynamic-lengthed arrays.\n *\n * For non-array types this is ``null``.\n */\n arrayLength;\n /**\n * The type of each child in the array.\n *\n * For non-array types this is ``null``.\n */\n arrayChildren;\n /**\n * @private\n */\n constructor(guard, name, type, baseType, indexed, components, arrayLength, arrayChildren) {\n assertPrivate(guard, _guard, \"ParamType\");\n Object.defineProperty(this, internal, { value: ParamTypeInternal });\n if (components) {\n components = Object.freeze(components.slice());\n }\n if (baseType === \"array\") {\n if (arrayLength == null || arrayChildren == null) {\n throw new Error(\"\");\n }\n }\n else if (arrayLength != null || arrayChildren != null) {\n throw new Error(\"\");\n }\n if (baseType === \"tuple\") {\n if (components == null) {\n throw new Error(\"\");\n }\n }\n else if (components != null) {\n throw new Error(\"\");\n }\n defineProperties(this, {\n name, type, baseType, indexed, components, arrayLength, arrayChildren\n });\n }\n /**\n * Return a string representation of this type.\n *\n * For example,\n *\n * ``sighash\" => \"(uint256,address)\"``\n *\n * ``\"minimal\" => \"tuple(uint256,address) indexed\"``\n *\n * ``\"full\" => \"tuple(uint256 foo, address bar) indexed baz\"``\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n const name = this.name || \"\";\n if (this.isArray()) {\n const result = JSON.parse(this.arrayChildren.format(\"json\"));\n result.name = name;\n result.type += `[${(this.arrayLength < 0 ? \"\" : String(this.arrayLength))}]`;\n return JSON.stringify(result);\n }\n const result = {\n type: ((this.baseType === \"tuple\") ? \"tuple\" : this.type),\n name\n };\n if (typeof (this.indexed) === \"boolean\") {\n result.indexed = this.indexed;\n }\n if (this.isTuple()) {\n result.components = this.components.map((c) => JSON.parse(c.format(format)));\n }\n return JSON.stringify(result);\n }\n let result = \"\";\n // Array\n if (this.isArray()) {\n result += this.arrayChildren.format(format);\n result += `[${(this.arrayLength < 0 ? \"\" : String(this.arrayLength))}]`;\n }\n else {\n if (this.isTuple()) {\n result += \"(\" + this.components.map((comp) => comp.format(format)).join((format === \"full\") ? \", \" : \",\") + \")\";\n }\n else {\n result += this.type;\n }\n }\n if (format !== \"sighash\") {\n if (this.indexed === true) {\n result += \" indexed\";\n }\n if (format === \"full\" && this.name) {\n result += \" \" + this.name;\n }\n }\n return result;\n }\n /**\n * Returns true if %%this%% is an Array type.\n *\n * This provides a type gaurd ensuring that [[arrayChildren]]\n * and [[arrayLength]] are non-null.\n */\n isArray() {\n return (this.baseType === \"array\");\n }\n /**\n * Returns true if %%this%% is a Tuple type.\n *\n * This provides a type gaurd ensuring that [[components]]\n * is non-null.\n */\n isTuple() {\n return (this.baseType === \"tuple\");\n }\n /**\n * Returns true if %%this%% is an Indexable type.\n *\n * This provides a type gaurd ensuring that [[indexed]]\n * is non-null.\n */\n isIndexable() {\n return (this.indexed != null);\n }\n /**\n * Walks the **ParamType** with %%value%%, calling %%process%%\n * on each type, destructing the %%value%% recursively.\n */\n walk(value, process) {\n if (this.isArray()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid array value\");\n }\n if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n throw new Error(\"array is wrong length\");\n }\n const _this = this;\n return value.map((v) => (_this.arrayChildren.walk(v, process)));\n }\n if (this.isTuple()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid tuple value\");\n }\n if (value.length !== this.components.length) {\n throw new Error(\"array is wrong length\");\n }\n const _this = this;\n return value.map((v, i) => (_this.components[i].walk(v, process)));\n }\n return process(this.type, value);\n }\n #walkAsync(promises, value, process, setValue) {\n if (this.isArray()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid array value\");\n }\n if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n throw new Error(\"array is wrong length\");\n }\n const childType = this.arrayChildren;\n const result = value.slice();\n result.forEach((value, index) => {\n childType.#walkAsync(promises, value, process, (value) => {\n result[index] = value;\n });\n });\n setValue(result);\n return;\n }\n if (this.isTuple()) {\n const components = this.components;\n // Convert the object into an array\n let result;\n if (Array.isArray(value)) {\n result = value.slice();\n }\n else {\n if (value == null || typeof (value) !== \"object\") {\n throw new Error(\"invalid tuple value\");\n }\n result = components.map((param) => {\n if (!param.name) {\n throw new Error(\"cannot use object value with unnamed components\");\n }\n if (!(param.name in value)) {\n throw new Error(`missing value for component ${param.name}`);\n }\n return value[param.name];\n });\n }\n if (result.length !== this.components.length) {\n throw new Error(\"array is wrong length\");\n }\n result.forEach((value, index) => {\n components[index].#walkAsync(promises, value, process, (value) => {\n result[index] = value;\n });\n });\n setValue(result);\n return;\n }\n const result = process(this.type, value);\n if (result.then) {\n promises.push((async function () { setValue(await result); })());\n }\n else {\n setValue(result);\n }\n }\n /**\n * Walks the **ParamType** with %%value%%, asynchronously calling\n * %%process%% on each type, destructing the %%value%% recursively.\n *\n * This can be used to resolve ENS names by walking and resolving each\n * ``\"address\"`` type.\n */\n async walkAsync(value, process) {\n const promises = [];\n const result = [value];\n this.#walkAsync(promises, value, process, (value) => {\n result[0] = value;\n });\n if (promises.length) {\n await Promise.all(promises);\n }\n return result[0];\n }\n /**\n * Creates a new **ParamType** for %%obj%%.\n *\n * If %%allowIndexed%% then the ``indexed`` keyword is permitted,\n * otherwise the ``indexed`` keyword will throw an error.\n */\n static from(obj, allowIndexed) {\n if (ParamType.isParamType(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return ParamType.from(lex(obj), allowIndexed);\n }\n catch (error) {\n assertArgument(false, \"invalid param type\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n let type = \"\", baseType = \"\";\n let comps = null;\n if (consumeKeywords(obj, setify([\"tuple\"])).has(\"tuple\") || obj.peekType(\"OPEN_PAREN\")) {\n // Tuple\n baseType = \"tuple\";\n comps = obj.popParams().map((t) => ParamType.from(t));\n type = `tuple(${comps.map((c) => c.format()).join(\",\")})`;\n }\n else {\n // Normal\n type = verifyBasicType(obj.popType(\"TYPE\"));\n baseType = type;\n }\n // Check for Array\n let arrayChildren = null;\n let arrayLength = null;\n while (obj.length && obj.peekType(\"BRACKET\")) {\n const bracket = obj.pop(); //arrays[i];\n arrayChildren = new ParamType(_guard, \"\", type, baseType, null, comps, arrayLength, arrayChildren);\n arrayLength = bracket.value;\n type += bracket.text;\n baseType = \"array\";\n comps = null;\n }\n let indexed = null;\n const keywords = consumeKeywords(obj, KwModifiers);\n if (keywords.has(\"indexed\")) {\n if (!allowIndexed) {\n throw new Error(\"\");\n }\n indexed = true;\n }\n const name = (obj.peekType(\"ID\") ? obj.pop().text : \"\");\n if (obj.length) {\n throw new Error(\"leftover tokens\");\n }\n return new ParamType(_guard, name, type, baseType, indexed, comps, arrayLength, arrayChildren);\n }\n const name = obj.name;\n assertArgument(!name || (typeof (name) === \"string\" && name.match(regexId)), \"invalid name\", \"obj.name\", name);\n let indexed = obj.indexed;\n if (indexed != null) {\n assertArgument(allowIndexed, \"parameter cannot be indexed\", \"obj.indexed\", obj.indexed);\n indexed = !!indexed;\n }\n let type = obj.type;\n let arrayMatch = type.match(regexArrayType);\n if (arrayMatch) {\n const arrayLength = parseInt(arrayMatch[2] || \"-1\");\n const arrayChildren = ParamType.from({\n type: arrayMatch[1],\n components: obj.components\n });\n return new ParamType(_guard, name || \"\", type, \"array\", indexed, null, arrayLength, arrayChildren);\n }\n if (type === \"tuple\" || type.startsWith(\"tuple(\" /* fix: ) */) || type.startsWith(\"(\" /* fix: ) */)) {\n const comps = (obj.components != null) ? obj.components.map((c) => ParamType.from(c)) : null;\n const tuple = new ParamType(_guard, name || \"\", type, \"tuple\", indexed, comps, null, null);\n // @TODO: use lexer to validate and normalize type\n return tuple;\n }\n type = verifyBasicType(obj.type);\n return new ParamType(_guard, name || \"\", type, type, indexed, null, null, null);\n }\n /**\n * Returns true if %%value%% is a **ParamType**.\n */\n static isParamType(value) {\n return (value && value[internal] === ParamTypeInternal);\n }\n}\n/**\n * An abstract class to represent An individual fragment from a parse ABI.\n */\nexport class Fragment {\n /**\n * The type of the fragment.\n */\n type;\n /**\n * The inputs for the fragment.\n */\n inputs;\n /**\n * @private\n */\n constructor(guard, type, inputs) {\n assertPrivate(guard, _guard, \"Fragment\");\n inputs = Object.freeze(inputs.slice());\n defineProperties(this, { type, inputs });\n }\n /**\n * Creates a new **Fragment** for %%obj%%, wich can be any supported\n * ABI frgament type.\n */\n static from(obj) {\n if (typeof (obj) === \"string\") {\n // Try parsing JSON...\n try {\n Fragment.from(JSON.parse(obj));\n }\n catch (e) { }\n // ...otherwise, use the human-readable lexer\n return Fragment.from(lex(obj));\n }\n if (obj instanceof TokenString) {\n // Human-readable ABI (already lexed)\n const type = obj.peekKeyword(KwTypes);\n switch (type) {\n case \"constructor\": return ConstructorFragment.from(obj);\n case \"error\": return ErrorFragment.from(obj);\n case \"event\": return EventFragment.from(obj);\n case \"fallback\":\n case \"receive\":\n return FallbackFragment.from(obj);\n case \"function\": return FunctionFragment.from(obj);\n case \"struct\": return StructFragment.from(obj);\n }\n }\n else if (typeof (obj) === \"object\") {\n // JSON ABI\n switch (obj.type) {\n case \"constructor\": return ConstructorFragment.from(obj);\n case \"error\": return ErrorFragment.from(obj);\n case \"event\": return EventFragment.from(obj);\n case \"fallback\":\n case \"receive\":\n return FallbackFragment.from(obj);\n case \"function\": return FunctionFragment.from(obj);\n case \"struct\": return StructFragment.from(obj);\n }\n assert(false, `unsupported type: ${obj.type}`, \"UNSUPPORTED_OPERATION\", {\n operation: \"Fragment.from\"\n });\n }\n assertArgument(false, \"unsupported frgament object\", \"obj\", obj);\n }\n /**\n * Returns true if %%value%% is a [[ConstructorFragment]].\n */\n static isConstructor(value) {\n return ConstructorFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is an [[ErrorFragment]].\n */\n static isError(value) {\n return ErrorFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is an [[EventFragment]].\n */\n static isEvent(value) {\n return EventFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is a [[FunctionFragment]].\n */\n static isFunction(value) {\n return FunctionFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is a [[StructFragment]].\n */\n static isStruct(value) {\n return StructFragment.isFragment(value);\n }\n}\n/**\n * An abstract class to represent An individual fragment\n * which has a name from a parse ABI.\n */\nexport class NamedFragment extends Fragment {\n /**\n * The name of the fragment.\n */\n name;\n /**\n * @private\n */\n constructor(guard, type, name, inputs) {\n super(guard, type, inputs);\n assertArgument(typeof (name) === \"string\" && name.match(regexId), \"invalid identifier\", \"name\", name);\n inputs = Object.freeze(inputs.slice());\n defineProperties(this, { name });\n }\n}\nfunction joinParams(format, params) {\n return \"(\" + params.map((p) => p.format(format)).join((format === \"full\") ? \", \" : \",\") + \")\";\n}\n/**\n * A Fragment which represents a //Custom Error//.\n */\nexport class ErrorFragment extends NamedFragment {\n /**\n * @private\n */\n constructor(guard, name, inputs) {\n super(guard, \"error\", name, inputs);\n Object.defineProperty(this, internal, { value: ErrorFragmentInternal });\n }\n /**\n * The Custom Error selector.\n */\n get selector() {\n return id(this.format(\"sighash\")).substring(0, 10);\n }\n /**\n * Returns a string representation of this fragment as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"error\",\n name: this.name,\n inputs: this.inputs.map((input) => JSON.parse(input.format(format))),\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"error\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n return result.join(\" \");\n }\n /**\n * Returns a new **ErrorFragment** for %%obj%%.\n */\n static from(obj) {\n if (ErrorFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n return ErrorFragment.from(lex(obj));\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"error\", obj);\n const inputs = consumeParams(obj);\n consumeEoi(obj);\n return new ErrorFragment(_guard, name, inputs);\n }\n return new ErrorFragment(_guard, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is an\n * **ErrorFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === ErrorFragmentInternal);\n }\n}\n/**\n * A Fragment which represents an Event.\n */\nexport class EventFragment extends NamedFragment {\n /**\n * Whether this event is anonymous.\n */\n anonymous;\n /**\n * @private\n */\n constructor(guard, name, inputs, anonymous) {\n super(guard, \"event\", name, inputs);\n Object.defineProperty(this, internal, { value: EventFragmentInternal });\n defineProperties(this, { anonymous });\n }\n /**\n * The Event topic hash.\n */\n get topicHash() {\n return id(this.format(\"sighash\"));\n }\n /**\n * Returns a string representation of this event as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"event\",\n anonymous: this.anonymous,\n name: this.name,\n inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"event\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n if (format !== \"sighash\" && this.anonymous) {\n result.push(\"anonymous\");\n }\n return result.join(\" \");\n }\n /**\n * Return the topic hash for an event with %%name%% and %%params%%.\n */\n static getTopicHash(name, params) {\n params = (params || []).map((p) => ParamType.from(p));\n const fragment = new EventFragment(_guard, name, params, false);\n return fragment.topicHash;\n }\n /**\n * Returns a new **EventFragment** for %%obj%%.\n */\n static from(obj) {\n if (EventFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return EventFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid event fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"event\", obj);\n const inputs = consumeParams(obj, true);\n const anonymous = !!consumeKeywords(obj, setify([\"anonymous\"])).has(\"anonymous\");\n consumeEoi(obj);\n return new EventFragment(_guard, name, inputs, anonymous);\n }\n return new EventFragment(_guard, obj.name, obj.inputs ? obj.inputs.map((p) => ParamType.from(p, true)) : [], !!obj.anonymous);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is an\n * **EventFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === EventFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a constructor.\n */\nexport class ConstructorFragment extends Fragment {\n /**\n * Whether the constructor can receive an endowment.\n */\n payable;\n /**\n * The recommended gas limit for deployment or ``null``.\n */\n gas;\n /**\n * @private\n */\n constructor(guard, type, inputs, payable, gas) {\n super(guard, type, inputs);\n Object.defineProperty(this, internal, { value: ConstructorFragmentInternal });\n defineProperties(this, { payable, gas });\n }\n /**\n * Returns a string representation of this constructor as %%format%%.\n */\n format(format) {\n assert(format != null && format !== \"sighash\", \"cannot format a constructor for sighash\", \"UNSUPPORTED_OPERATION\", { operation: \"format(sighash)\" });\n if (format === \"json\") {\n return JSON.stringify({\n type: \"constructor\",\n stateMutability: (this.payable ? \"payable\" : \"undefined\"),\n payable: this.payable,\n gas: ((this.gas != null) ? this.gas : undefined),\n inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n });\n }\n const result = [`constructor${joinParams(format, this.inputs)}`];\n if (this.payable) {\n result.push(\"payable\");\n }\n if (this.gas != null) {\n result.push(`@${this.gas.toString()}`);\n }\n return result.join(\" \");\n }\n /**\n * Returns a new **ConstructorFragment** for %%obj%%.\n */\n static from(obj) {\n if (ConstructorFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return ConstructorFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid constuctor fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n consumeKeywords(obj, setify([\"constructor\"]));\n const inputs = consumeParams(obj);\n const payable = !!consumeKeywords(obj, KwVisibDeploy).has(\"payable\");\n const gas = consumeGas(obj);\n consumeEoi(obj);\n return new ConstructorFragment(_guard, \"constructor\", inputs, payable, gas);\n }\n return new ConstructorFragment(_guard, \"constructor\", obj.inputs ? obj.inputs.map(ParamType.from) : [], !!obj.payable, (obj.gas != null) ? obj.gas : null);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **ConstructorFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === ConstructorFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a method.\n */\nexport class FallbackFragment extends Fragment {\n /**\n * If the function can be sent value during invocation.\n */\n payable;\n constructor(guard, inputs, payable) {\n super(guard, \"fallback\", inputs);\n Object.defineProperty(this, internal, { value: FallbackFragmentInternal });\n defineProperties(this, { payable });\n }\n /**\n * Returns a string representation of this fallback as %%format%%.\n */\n format(format) {\n const type = ((this.inputs.length === 0) ? \"receive\" : \"fallback\");\n if (format === \"json\") {\n const stateMutability = (this.payable ? \"payable\" : \"nonpayable\");\n return JSON.stringify({ type, stateMutability });\n }\n return `${type}()${this.payable ? \" payable\" : \"\"}`;\n }\n /**\n * Returns a new **FallbackFragment** for %%obj%%.\n */\n static from(obj) {\n if (FallbackFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return FallbackFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid fallback fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const errorObj = obj.toString();\n const topIsValid = obj.peekKeyword(setify([\"fallback\", \"receive\"]));\n assertArgument(topIsValid, \"type must be fallback or receive\", \"obj\", errorObj);\n const type = obj.popKeyword(setify([\"fallback\", \"receive\"]));\n // receive()\n if (type === \"receive\") {\n const inputs = consumeParams(obj);\n assertArgument(inputs.length === 0, `receive cannot have arguments`, \"obj.inputs\", inputs);\n consumeKeywords(obj, setify([\"payable\"]));\n consumeEoi(obj);\n return new FallbackFragment(_guard, [], true);\n }\n // fallback() [payable]\n // fallback(bytes) [payable] returns (bytes)\n let inputs = consumeParams(obj);\n if (inputs.length) {\n assertArgument(inputs.length === 1 && inputs[0].type === \"bytes\", \"invalid fallback inputs\", \"obj.inputs\", inputs.map((i) => i.format(\"minimal\")).join(\", \"));\n }\n else {\n inputs = [ParamType.from(\"bytes\")];\n }\n const mutability = consumeMutability(obj);\n assertArgument(mutability === \"nonpayable\" || mutability === \"payable\", \"fallback cannot be constants\", \"obj.stateMutability\", mutability);\n if (consumeKeywords(obj, setify([\"returns\"])).has(\"returns\")) {\n const outputs = consumeParams(obj);\n assertArgument(outputs.length === 1 && outputs[0].type === \"bytes\", \"invalid fallback outputs\", \"obj.outputs\", outputs.map((i) => i.format(\"minimal\")).join(\", \"));\n }\n consumeEoi(obj);\n return new FallbackFragment(_guard, inputs, mutability === \"payable\");\n }\n if (obj.type === \"receive\") {\n return new FallbackFragment(_guard, [], true);\n }\n if (obj.type === \"fallback\") {\n const inputs = [ParamType.from(\"bytes\")];\n const payable = (obj.stateMutability === \"payable\");\n return new FallbackFragment(_guard, inputs, payable);\n }\n assertArgument(false, \"invalid fallback description\", \"obj\", obj);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **FallbackFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === FallbackFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a method.\n */\nexport class FunctionFragment extends NamedFragment {\n /**\n * If the function is constant (e.g. ``pure`` or ``view`` functions).\n */\n constant;\n /**\n * The returned types for the result of calling this function.\n */\n outputs;\n /**\n * The state mutability (e.g. ``payable``, ``nonpayable``, ``view``\n * or ``pure``)\n */\n stateMutability;\n /**\n * If the function can be sent value during invocation.\n */\n payable;\n /**\n * The recommended gas limit to send when calling this function.\n */\n gas;\n /**\n * @private\n */\n constructor(guard, name, stateMutability, inputs, outputs, gas) {\n super(guard, \"function\", name, inputs);\n Object.defineProperty(this, internal, { value: FunctionFragmentInternal });\n outputs = Object.freeze(outputs.slice());\n const constant = (stateMutability === \"view\" || stateMutability === \"pure\");\n const payable = (stateMutability === \"payable\");\n defineProperties(this, { constant, gas, outputs, payable, stateMutability });\n }\n /**\n * The Function selector.\n */\n get selector() {\n return id(this.format(\"sighash\")).substring(0, 10);\n }\n /**\n * Returns a string representation of this function as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"function\",\n name: this.name,\n constant: this.constant,\n stateMutability: ((this.stateMutability !== \"nonpayable\") ? this.stateMutability : undefined),\n payable: this.payable,\n gas: ((this.gas != null) ? this.gas : undefined),\n inputs: this.inputs.map((i) => JSON.parse(i.format(format))),\n outputs: this.outputs.map((o) => JSON.parse(o.format(format))),\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"function\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n if (format !== \"sighash\") {\n if (this.stateMutability !== \"nonpayable\") {\n result.push(this.stateMutability);\n }\n if (this.outputs && this.outputs.length) {\n result.push(\"returns\");\n result.push(joinParams(format, this.outputs));\n }\n if (this.gas != null) {\n result.push(`@${this.gas.toString()}`);\n }\n }\n return result.join(\" \");\n }\n /**\n * Return the selector for a function with %%name%% and %%params%%.\n */\n static getSelector(name, params) {\n params = (params || []).map((p) => ParamType.from(p));\n const fragment = new FunctionFragment(_guard, name, \"view\", params, [], null);\n return fragment.selector;\n }\n /**\n * Returns a new **FunctionFragment** for %%obj%%.\n */\n static from(obj) {\n if (FunctionFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return FunctionFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid function fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"function\", obj);\n const inputs = consumeParams(obj);\n const mutability = consumeMutability(obj);\n let outputs = [];\n if (consumeKeywords(obj, setify([\"returns\"])).has(\"returns\")) {\n outputs = consumeParams(obj);\n }\n const gas = consumeGas(obj);\n consumeEoi(obj);\n return new FunctionFragment(_guard, name, mutability, inputs, outputs, gas);\n }\n let stateMutability = obj.stateMutability;\n // Use legacy Solidity ABI logic if stateMutability is missing\n if (stateMutability == null) {\n stateMutability = \"payable\";\n if (typeof (obj.constant) === \"boolean\") {\n stateMutability = \"view\";\n if (!obj.constant) {\n stateMutability = \"payable\";\n if (typeof (obj.payable) === \"boolean\" && !obj.payable) {\n stateMutability = \"nonpayable\";\n }\n }\n }\n else if (typeof (obj.payable) === \"boolean\" && !obj.payable) {\n stateMutability = \"nonpayable\";\n }\n }\n // @TODO: verifyState for stateMutability (e.g. throw if\n // payable: false but stateMutability is \"nonpayable\")\n return new FunctionFragment(_guard, obj.name, stateMutability, obj.inputs ? obj.inputs.map(ParamType.from) : [], obj.outputs ? obj.outputs.map(ParamType.from) : [], (obj.gas != null) ? obj.gas : null);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **FunctionFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === FunctionFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a structure.\n */\nexport class StructFragment extends NamedFragment {\n /**\n * @private\n */\n constructor(guard, name, inputs) {\n super(guard, \"struct\", name, inputs);\n Object.defineProperty(this, internal, { value: StructFragmentInternal });\n }\n /**\n * Returns a string representation of this struct as %%format%%.\n */\n format() {\n throw new Error(\"@TODO\");\n }\n /**\n * Returns a new **StructFragment** for %%obj%%.\n */\n static from(obj) {\n if (typeof (obj) === \"string\") {\n try {\n return StructFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid struct fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"struct\", obj);\n const inputs = consumeParams(obj);\n consumeEoi(obj);\n return new StructFragment(_guard, name, inputs);\n }\n return new StructFragment(_guard, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []);\n }\n // @TODO: fix this return type\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **StructFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === StructFragmentInternal);\n }\n}\n//# sourceMappingURL=fragments.js.map","/**\n * When sending values to or receiving values from a [[Contract]], the\n * data is generally encoded using the [ABI standard](link-solc-abi).\n *\n * The AbiCoder provides a utility to encode values to ABI data and\n * decode values from ABI data.\n *\n * Most of the time, developers should favour the [[Contract]] class,\n * which further abstracts a lot of the finer details of ABI data.\n *\n * @_section api/abi/abi-coder:ABI Encoding\n */\n// See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI\nimport { assertArgumentCount, assertArgument } from \"../utils/index.js\";\nimport { Reader, Writer } from \"./coders/abstract-coder.js\";\nimport { AddressCoder } from \"./coders/address.js\";\nimport { ArrayCoder } from \"./coders/array.js\";\nimport { BooleanCoder } from \"./coders/boolean.js\";\nimport { BytesCoder } from \"./coders/bytes.js\";\nimport { FixedBytesCoder } from \"./coders/fixed-bytes.js\";\nimport { NullCoder } from \"./coders/null.js\";\nimport { NumberCoder } from \"./coders/number.js\";\nimport { StringCoder } from \"./coders/string.js\";\nimport { TupleCoder } from \"./coders/tuple.js\";\nimport { ParamType } from \"./fragments.js\";\nimport { getAddress } from \"../address/index.js\";\nimport { getBytes, hexlify, makeError } from \"../utils/index.js\";\n// https://docs.soliditylang.org/en/v0.8.17/control-structures.html\nconst PanicReasons = new Map();\nPanicReasons.set(0x00, \"GENERIC_PANIC\");\nPanicReasons.set(0x01, \"ASSERT_FALSE\");\nPanicReasons.set(0x11, \"OVERFLOW\");\nPanicReasons.set(0x12, \"DIVIDE_BY_ZERO\");\nPanicReasons.set(0x21, \"ENUM_RANGE_ERROR\");\nPanicReasons.set(0x22, \"BAD_STORAGE_DATA\");\nPanicReasons.set(0x31, \"STACK_UNDERFLOW\");\nPanicReasons.set(0x32, \"ARRAY_RANGE_ERROR\");\nPanicReasons.set(0x41, \"OUT_OF_MEMORY\");\nPanicReasons.set(0x51, \"UNINITIALIZED_FUNCTION_CALL\");\nconst paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\nconst paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\nlet defaultCoder = null;\nlet defaultMaxInflation = 1024;\nfunction getBuiltinCallException(action, tx, data, abiCoder) {\n let message = \"missing revert data\";\n let reason = null;\n const invocation = null;\n let revert = null;\n if (data) {\n message = \"execution reverted\";\n const bytes = getBytes(data);\n data = hexlify(data);\n if (bytes.length === 0) {\n message += \" (no data present; likely require(false) occurred\";\n reason = \"require(false)\";\n }\n else if (bytes.length % 32 !== 4) {\n message += \" (could not decode reason; invalid data length)\";\n }\n else if (hexlify(bytes.slice(0, 4)) === \"0x08c379a0\") {\n // Error(string)\n try {\n reason = abiCoder.decode([\"string\"], bytes.slice(4))[0];\n revert = {\n signature: \"Error(string)\",\n name: \"Error\",\n args: [reason]\n };\n message += `: ${JSON.stringify(reason)}`;\n }\n catch (error) {\n message += \" (could not decode reason; invalid string data)\";\n }\n }\n else if (hexlify(bytes.slice(0, 4)) === \"0x4e487b71\") {\n // Panic(uint256)\n try {\n const code = Number(abiCoder.decode([\"uint256\"], bytes.slice(4))[0]);\n revert = {\n signature: \"Panic(uint256)\",\n name: \"Panic\",\n args: [code]\n };\n reason = `Panic due to ${PanicReasons.get(code) || \"UNKNOWN\"}(${code})`;\n message += `: ${reason}`;\n }\n catch (error) {\n message += \" (could not decode panic code)\";\n }\n }\n else {\n message += \" (unknown custom error)\";\n }\n }\n const transaction = {\n to: (tx.to ? getAddress(tx.to) : null),\n data: (tx.data || \"0x\")\n };\n if (tx.from) {\n transaction.from = getAddress(tx.from);\n }\n return makeError(message, \"CALL_EXCEPTION\", {\n action, data, reason, transaction, invocation, revert\n });\n}\n/**\n * The **AbiCoder** is a low-level class responsible for encoding JavaScript\n * values into binary data and decoding binary data into JavaScript values.\n */\nexport class AbiCoder {\n #getCoder(param) {\n if (param.isArray()) {\n return new ArrayCoder(this.#getCoder(param.arrayChildren), param.arrayLength, param.name);\n }\n if (param.isTuple()) {\n return new TupleCoder(param.components.map((c) => this.#getCoder(c)), param.name);\n }\n switch (param.baseType) {\n case \"address\":\n return new AddressCoder(param.name);\n case \"bool\":\n return new BooleanCoder(param.name);\n case \"string\":\n return new StringCoder(param.name);\n case \"bytes\":\n return new BytesCoder(param.name);\n case \"\":\n return new NullCoder(param.name);\n }\n // u?int[0-9]*\n let match = param.type.match(paramTypeNumber);\n if (match) {\n let size = parseInt(match[2] || \"256\");\n assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, \"invalid \" + match[1] + \" bit length\", \"param\", param);\n return new NumberCoder(size / 8, (match[1] === \"int\"), param.name);\n }\n // bytes[0-9]+\n match = param.type.match(paramTypeBytes);\n if (match) {\n let size = parseInt(match[1]);\n assertArgument(size !== 0 && size <= 32, \"invalid bytes length\", \"param\", param);\n return new FixedBytesCoder(size, param.name);\n }\n assertArgument(false, \"invalid type\", \"type\", param.type);\n }\n /**\n * Get the default values for the given %%types%%.\n *\n * For example, a ``uint`` is by default ``0`` and ``bool``\n * is by default ``false``.\n */\n getDefaultValue(types) {\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = new TupleCoder(coders, \"_\");\n return coder.defaultValue();\n }\n /**\n * Encode the %%values%% as the %%types%% into ABI data.\n *\n * @returns DataHexstring\n */\n encode(types, values) {\n assertArgumentCount(values.length, types.length, \"types/values length mismatch\");\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = (new TupleCoder(coders, \"_\"));\n const writer = new Writer();\n coder.encode(writer, values);\n return writer.data;\n }\n /**\n * Decode the ABI %%data%% as the %%types%% into values.\n *\n * If %%loose%% decoding is enabled, then strict padding is\n * not enforced. Some older versions of Solidity incorrectly\n * padded event data emitted from ``external`` functions.\n */\n decode(types, data, loose) {\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = new TupleCoder(coders, \"_\");\n return coder.decode(new Reader(data, loose, defaultMaxInflation));\n }\n static _setDefaultMaxInflation(value) {\n assertArgument(typeof (value) === \"number\" && Number.isInteger(value), \"invalid defaultMaxInflation factor\", \"value\", value);\n defaultMaxInflation = value;\n }\n /**\n * Returns the shared singleton instance of a default [[AbiCoder]].\n *\n * On the first call, the instance is created internally.\n */\n static defaultAbiCoder() {\n if (defaultCoder == null) {\n defaultCoder = new AbiCoder();\n }\n return defaultCoder;\n }\n /**\n * Returns an ethers-compatible [[CallExceptionError]] Error for the given\n * result %%data%% for the [[CallExceptionAction]] %%action%% against\n * the Transaction %%tx%%.\n */\n static getBuiltinCallException(action, tx, data) {\n return getBuiltinCallException(action, tx, data, AbiCoder.defaultAbiCoder());\n }\n}\n//# sourceMappingURL=abi-coder.js.map","/**\n * About bytes32 strings...\n *\n * @_docloc: api/utils:Bytes32 Strings\n */\nimport { getBytes, toUtf8Bytes, toUtf8String, zeroPadBytes } from \"../utils/index.js\";\n/**\n * Encodes %%text%% as a Bytes32 string.\n */\nexport function encodeBytes32String(text) {\n // Get the bytes\n const bytes = toUtf8Bytes(text);\n // Check we have room for null-termination\n if (bytes.length > 31) {\n throw new Error(\"bytes32 string must be less than 32 bytes\");\n }\n // Zero-pad (implicitly null-terminates)\n return zeroPadBytes(bytes, 32);\n}\n/**\n * Encodes the Bytes32-encoded %%bytes%% into a string.\n */\nexport function decodeBytes32String(_bytes) {\n const data = getBytes(_bytes, \"bytes\");\n // Must be 32 bytes with a null-termination\n if (data.length !== 32) {\n throw new Error(\"invalid bytes32 - not 32 bytes long\");\n }\n if (data[31] !== 0) {\n throw new Error(\"invalid bytes32 string - no null terminator\");\n }\n // Find the null termination\n let length = 31;\n while (data[length - 1] === 0) {\n length--;\n }\n // Determine the string value\n return toUtf8String(data.slice(0, length));\n}\n//# sourceMappingURL=bytes32.js.map","/**\n * The Interface class is a low-level class that accepts an\n * ABI and provides all the necessary functionality to encode\n * and decode paramaters to and results from methods, events\n * and errors.\n *\n * It also provides several convenience methods to automatically\n * search and find matching transactions and events to parse them.\n *\n * @_subsection api/abi:Interfaces [interfaces]\n */\nimport { keccak256 } from \"../crypto/index.js\";\nimport { id } from \"../hash/index.js\";\nimport { concat, dataSlice, getBigInt, getBytes, getBytesCopy, hexlify, zeroPadBytes, zeroPadValue, isHexString, defineProperties, assertArgument, toBeHex, assert } from \"../utils/index.js\";\nimport { AbiCoder } from \"./abi-coder.js\";\nimport { checkResultErrors, Result } from \"./coders/abstract-coder.js\";\nimport { ConstructorFragment, ErrorFragment, EventFragment, Fragment, FunctionFragment, ParamType } from \"./fragments.js\";\nimport { Typed } from \"./typed.js\";\nexport { checkResultErrors, Result };\n/**\n * When using the [[Interface-parseLog]] to automatically match a Log to its event\n * for parsing, a **LogDescription** is returned.\n */\nexport class LogDescription {\n /**\n * The matching fragment for the ``topic0``.\n */\n fragment;\n /**\n * The name of the Event.\n */\n name;\n /**\n * The full Event signature.\n */\n signature;\n /**\n * The topic hash for the Event.\n */\n topic;\n /**\n * The arguments passed into the Event with ``emit``.\n */\n args;\n /**\n * @_ignore:\n */\n constructor(fragment, topic, args) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, signature, topic, args\n });\n }\n}\n/**\n * When using the [[Interface-parseTransaction]] to automatically match\n * a transaction data to its function for parsing,\n * a **TransactionDescription** is returned.\n */\nexport class TransactionDescription {\n /**\n * The matching fragment from the transaction ``data``.\n */\n fragment;\n /**\n * The name of the Function from the transaction ``data``.\n */\n name;\n /**\n * The arguments passed to the Function from the transaction ``data``.\n */\n args;\n /**\n * The full Function signature from the transaction ``data``.\n */\n signature;\n /**\n * The selector for the Function from the transaction ``data``.\n */\n selector;\n /**\n * The ``value`` (in wei) from the transaction.\n */\n value;\n /**\n * @_ignore:\n */\n constructor(fragment, selector, args, value) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, args, signature, selector, value\n });\n }\n}\n/**\n * When using the [[Interface-parseError]] to automatically match an\n * error for a call result for parsing, an **ErrorDescription** is returned.\n */\nexport class ErrorDescription {\n /**\n * The matching fragment.\n */\n fragment;\n /**\n * The name of the Error.\n */\n name;\n /**\n * The arguments passed to the Error with ``revert``.\n */\n args;\n /**\n * The full Error signature.\n */\n signature;\n /**\n * The selector for the Error.\n */\n selector;\n /**\n * @_ignore:\n */\n constructor(fragment, selector, args) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, args, signature, selector\n });\n }\n}\n/**\n * An **Indexed** is used as a value when a value that does not\n * fit within a topic (i.e. not a fixed-length, 32-byte type). It\n * is the ``keccak256`` of the value, and used for types such as\n * arrays, tuples, bytes and strings.\n */\nexport class Indexed {\n /**\n * The ``keccak256`` of the value logged.\n */\n hash;\n /**\n * @_ignore:\n */\n _isIndexed;\n /**\n * Returns ``true`` if %%value%% is an **Indexed**.\n *\n * This provides a Type Guard for property access.\n */\n static isIndexed(value) {\n return !!(value && value._isIndexed);\n }\n /**\n * @_ignore:\n */\n constructor(hash) {\n defineProperties(this, { hash, _isIndexed: true });\n }\n}\n// https://docs.soliditylang.org/en/v0.8.13/control-structures.html?highlight=panic#panic-via-assert-and-error-via-require\nconst PanicReasons = {\n \"0\": \"generic panic\",\n \"1\": \"assert(false)\",\n \"17\": \"arithmetic overflow\",\n \"18\": \"division or modulo by zero\",\n \"33\": \"enum overflow\",\n \"34\": \"invalid encoded storage byte array accessed\",\n \"49\": \"out-of-bounds array access; popping on an empty array\",\n \"50\": \"out-of-bounds access of an array or bytesN\",\n \"65\": \"out of memory\",\n \"81\": \"uninitialized function\",\n};\nconst BuiltinErrors = {\n \"0x08c379a0\": {\n signature: \"Error(string)\",\n name: \"Error\",\n inputs: [\"string\"],\n reason: (message) => {\n return `reverted with reason string ${JSON.stringify(message)}`;\n }\n },\n \"0x4e487b71\": {\n signature: \"Panic(uint256)\",\n name: \"Panic\",\n inputs: [\"uint256\"],\n reason: (code) => {\n let reason = \"unknown panic code\";\n if (code >= 0 && code <= 0xff && PanicReasons[code.toString()]) {\n reason = PanicReasons[code.toString()];\n }\n return `reverted with panic code 0x${code.toString(16)} (${reason})`;\n }\n }\n};\n/**\n * An Interface abstracts many of the low-level details for\n * encoding and decoding the data on the blockchain.\n *\n * An ABI provides information on how to encode data to send to\n * a Contract, how to decode the results and events and how to\n * interpret revert errors.\n *\n * The ABI can be specified by [any supported format](InterfaceAbi).\n */\nexport class Interface {\n /**\n * All the Contract ABI members (i.e. methods, events, errors, etc).\n */\n fragments;\n /**\n * The Contract constructor.\n */\n deploy;\n /**\n * The Fallback method, if any.\n */\n fallback;\n /**\n * If receiving ether is supported.\n */\n receive;\n #errors;\n #events;\n #functions;\n // #structs: Map;\n #abiCoder;\n /**\n * Create a new Interface for the %%fragments%%.\n */\n constructor(fragments) {\n let abi = [];\n if (typeof (fragments) === \"string\") {\n abi = JSON.parse(fragments);\n }\n else {\n abi = fragments;\n }\n this.#functions = new Map();\n this.#errors = new Map();\n this.#events = new Map();\n // this.#structs = new Map();\n const frags = [];\n for (const a of abi) {\n try {\n frags.push(Fragment.from(a));\n }\n catch (error) {\n console.log(`[Warning] Invalid Fragment ${JSON.stringify(a)}:`, error.message);\n }\n }\n defineProperties(this, {\n fragments: Object.freeze(frags)\n });\n let fallback = null;\n let receive = false;\n this.#abiCoder = this.getAbiCoder();\n // Add all fragments by their signature\n this.fragments.forEach((fragment, index) => {\n let bucket;\n switch (fragment.type) {\n case \"constructor\":\n if (this.deploy) {\n console.log(\"duplicate definition - constructor\");\n return;\n }\n //checkNames(fragment, \"input\", fragment.inputs);\n defineProperties(this, { deploy: fragment });\n return;\n case \"fallback\":\n if (fragment.inputs.length === 0) {\n receive = true;\n }\n else {\n assertArgument(!fallback || fragment.payable !== fallback.payable, \"conflicting fallback fragments\", `fragments[${index}]`, fragment);\n fallback = fragment;\n receive = fallback.payable;\n }\n return;\n case \"function\":\n //checkNames(fragment, \"input\", fragment.inputs);\n //checkNames(fragment, \"output\", (fragment).outputs);\n bucket = this.#functions;\n break;\n case \"event\":\n //checkNames(fragment, \"input\", fragment.inputs);\n bucket = this.#events;\n break;\n case \"error\":\n bucket = this.#errors;\n break;\n default:\n return;\n }\n // Two identical entries; ignore it\n const signature = fragment.format();\n if (bucket.has(signature)) {\n return;\n }\n bucket.set(signature, fragment);\n });\n // If we do not have a constructor add a default\n if (!this.deploy) {\n defineProperties(this, {\n deploy: ConstructorFragment.from(\"constructor()\")\n });\n }\n defineProperties(this, { fallback, receive });\n }\n /**\n * Returns the entire Human-Readable ABI, as an array of\n * signatures, optionally as %%minimal%% strings, which\n * removes parameter names and unneceesary spaces.\n */\n format(minimal) {\n const format = (minimal ? \"minimal\" : \"full\");\n const abi = this.fragments.map((f) => f.format(format));\n return abi;\n }\n /**\n * Return the JSON-encoded ABI. This is the format Solidiy\n * returns.\n */\n formatJson() {\n const abi = this.fragments.map((f) => f.format(\"json\"));\n // We need to re-bundle the JSON fragments a bit\n return JSON.stringify(abi.map((j) => JSON.parse(j)));\n }\n /**\n * The ABI coder that will be used to encode and decode binary\n * data.\n */\n getAbiCoder() {\n return AbiCoder.defaultAbiCoder();\n }\n // Find a function definition by any means necessary (unless it is ambiguous)\n #getFunction(key, values, forceUnique) {\n // Selector\n if (isHexString(key)) {\n const selector = key.toLowerCase();\n for (const fragment of this.#functions.values()) {\n if (selector === fragment.selector) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#functions) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (values) {\n const lastValue = (values.length > 0) ? values[values.length - 1] : null;\n let valueLength = values.length;\n let allowOptions = true;\n if (Typed.isTyped(lastValue) && lastValue.type === \"overrides\") {\n allowOptions = false;\n valueLength--;\n }\n // Remove all matches that don't have a compatible length. The args\n // may contain an overrides, so the match may have n or n - 1 parameters\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs.length;\n if (inputs !== valueLength && (!allowOptions || inputs !== valueLength - 1)) {\n matching.splice(i, 1);\n }\n }\n // Remove all matches that don't match the Typed signature\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs;\n for (let j = 0; j < values.length; j++) {\n // Not a typed value\n if (!Typed.isTyped(values[j])) {\n continue;\n }\n // We are past the inputs\n if (j >= inputs.length) {\n if (values[j].type === \"overrides\") {\n continue;\n }\n matching.splice(i, 1);\n break;\n }\n // Make sure the value type matches the input type\n if (values[j].type !== inputs[j].baseType) {\n matching.splice(i, 1);\n break;\n }\n }\n }\n }\n // We found a single matching signature with an overrides, but the\n // last value is something that cannot possibly be an options\n if (matching.length === 1 && values && values.length !== matching[0].inputs.length) {\n const lastArg = values[values.length - 1];\n if (lastArg == null || Array.isArray(lastArg) || typeof (lastArg) !== \"object\") {\n matching.splice(0, 1);\n }\n }\n if (matching.length === 0) {\n return null;\n }\n if (matching.length > 1 && forceUnique) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous function description (i.e. matches ${matchStr})`, \"key\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n const result = this.#functions.get(FunctionFragment.from(key).format());\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Get the function name for %%key%%, which may be a function selector,\n * function name or function signature that belongs to the ABI.\n */\n getFunctionName(key) {\n const fragment = this.#getFunction(key, null, false);\n assertArgument(fragment, \"no matching function\", \"key\", key);\n return fragment.name;\n }\n /**\n * Returns true if %%key%% (a function selector, function name or\n * function signature) is present in the ABI.\n *\n * In the case of a function name, the name may be ambiguous, so\n * accessing the [[FunctionFragment]] may require refinement.\n */\n hasFunction(key) {\n return !!this.#getFunction(key, null, false);\n }\n /**\n * Get the [[FunctionFragment]] for %%key%%, which may be a function\n * selector, function name or function signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple functions match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single function in\n * the ABI, this will throw.\n */\n getFunction(key, values) {\n return this.#getFunction(key, values || null, true);\n }\n /**\n * Iterate over all functions, calling %%callback%%, sorted by their name.\n */\n forEachFunction(callback) {\n const names = Array.from(this.#functions.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#functions.get(name)), i);\n }\n }\n // Find an event definition by any means necessary (unless it is ambiguous)\n #getEvent(key, values, forceUnique) {\n // EventTopic\n if (isHexString(key)) {\n const eventTopic = key.toLowerCase();\n for (const fragment of this.#events.values()) {\n if (eventTopic === fragment.topicHash) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#events) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (values) {\n // Remove all matches that don't have a compatible length.\n for (let i = matching.length - 1; i >= 0; i--) {\n if (matching[i].inputs.length < values.length) {\n matching.splice(i, 1);\n }\n }\n // Remove all matches that don't match the Typed signature\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs;\n for (let j = 0; j < values.length; j++) {\n // Not a typed value\n if (!Typed.isTyped(values[j])) {\n continue;\n }\n // Make sure the value type matches the input type\n if (values[j].type !== inputs[j].baseType) {\n matching.splice(i, 1);\n break;\n }\n }\n }\n }\n if (matching.length === 0) {\n return null;\n }\n if (matching.length > 1 && forceUnique) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous event description (i.e. matches ${matchStr})`, \"key\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n const result = this.#events.get(EventFragment.from(key).format());\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Get the event name for %%key%%, which may be a topic hash,\n * event name or event signature that belongs to the ABI.\n */\n getEventName(key) {\n const fragment = this.#getEvent(key, null, false);\n assertArgument(fragment, \"no matching event\", \"key\", key);\n return fragment.name;\n }\n /**\n * Returns true if %%key%% (an event topic hash, event name or\n * event signature) is present in the ABI.\n *\n * In the case of an event name, the name may be ambiguous, so\n * accessing the [[EventFragment]] may require refinement.\n */\n hasEvent(key) {\n return !!this.#getEvent(key, null, false);\n }\n /**\n * Get the [[EventFragment]] for %%key%%, which may be a topic hash,\n * event name or event signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple events match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single event in\n * the ABI, this will throw.\n */\n getEvent(key, values) {\n return this.#getEvent(key, values || null, true);\n }\n /**\n * Iterate over all events, calling %%callback%%, sorted by their name.\n */\n forEachEvent(callback) {\n const names = Array.from(this.#events.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#events.get(name)), i);\n }\n }\n /**\n * Get the [[ErrorFragment]] for %%key%%, which may be an error\n * selector, error name or error signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple errors match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single error in\n * the ABI, this will throw.\n */\n getError(key, values) {\n if (isHexString(key)) {\n const selector = key.toLowerCase();\n if (BuiltinErrors[selector]) {\n return ErrorFragment.from(BuiltinErrors[selector].signature);\n }\n for (const fragment of this.#errors.values()) {\n if (selector === fragment.selector) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#errors) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (matching.length === 0) {\n if (key === \"Error\") {\n return ErrorFragment.from(\"error Error(string)\");\n }\n if (key === \"Panic\") {\n return ErrorFragment.from(\"error Panic(uint256)\");\n }\n return null;\n }\n else if (matching.length > 1) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous error description (i.e. ${matchStr})`, \"name\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n key = ErrorFragment.from(key).format();\n if (key === \"Error(string)\") {\n return ErrorFragment.from(\"error Error(string)\");\n }\n if (key === \"Panic(uint256)\") {\n return ErrorFragment.from(\"error Panic(uint256)\");\n }\n const result = this.#errors.get(key);\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Iterate over all errors, calling %%callback%%, sorted by their name.\n */\n forEachError(callback) {\n const names = Array.from(this.#errors.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#errors.get(name)), i);\n }\n }\n // Get the 4-byte selector used by Solidity to identify a function\n /*\ngetSelector(fragment: ErrorFragment | FunctionFragment): string {\n if (typeof(fragment) === \"string\") {\n const matches: Array = [ ];\n\n try { matches.push(this.getFunction(fragment)); } catch (error) { }\n try { matches.push(this.getError(fragment)); } catch (_) { }\n\n if (matches.length === 0) {\n logger.throwArgumentError(\"unknown fragment\", \"key\", fragment);\n } else if (matches.length > 1) {\n logger.throwArgumentError(\"ambiguous fragment matches function and error\", \"key\", fragment);\n }\n\n fragment = matches[0];\n }\n\n return dataSlice(id(fragment.format()), 0, 4);\n}\n */\n // Get the 32-byte topic hash used by Solidity to identify an event\n /*\n getEventTopic(fragment: EventFragment): string {\n //if (typeof(fragment) === \"string\") { fragment = this.getEvent(eventFragment); }\n return id(fragment.format());\n }\n */\n _decodeParams(params, data) {\n return this.#abiCoder.decode(params, data);\n }\n _encodeParams(params, values) {\n return this.#abiCoder.encode(params, values);\n }\n /**\n * Encodes a ``tx.data`` object for deploying the Contract with\n * the %%values%% as the constructor arguments.\n */\n encodeDeploy(values) {\n return this._encodeParams(this.deploy.inputs, values || []);\n }\n /**\n * Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n * specified error (see [[getError]] for valid values for\n * %%key%%).\n *\n * Most developers should prefer the [[parseCallResult]] method instead,\n * which will automatically detect a ``CALL_EXCEPTION`` and throw the\n * corresponding error.\n */\n decodeErrorResult(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getError(fragment);\n assertArgument(f, \"unknown error\", \"fragment\", fragment);\n fragment = f;\n }\n assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match error ${fragment.name}.`, \"data\", data);\n return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n }\n /**\n * Encodes the transaction revert data for a call result that\n * reverted from the the Contract with the sepcified %%error%%\n * (see [[getError]] for valid values for %%fragment%%) with the %%values%%.\n *\n * This is generally not used by most developers, unless trying to mock\n * a result from a Contract.\n */\n encodeErrorResult(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getError(fragment);\n assertArgument(f, \"unknown error\", \"fragment\", fragment);\n fragment = f;\n }\n return concat([\n fragment.selector,\n this._encodeParams(fragment.inputs, values || [])\n ]);\n }\n /**\n * Decodes the %%data%% from a transaction ``tx.data`` for\n * the function specified (see [[getFunction]] for valid values\n * for %%fragment%%).\n *\n * Most developers should prefer the [[parseTransaction]] method\n * instead, which will automatically detect the fragment.\n */\n decodeFunctionData(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match function ${fragment.name}.`, \"data\", data);\n return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n }\n /**\n * Encodes the ``tx.data`` for a transaction that calls the function\n * specified (see [[getFunction]] for valid values for %%fragment%%) with\n * the %%values%%.\n */\n encodeFunctionData(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n return concat([\n fragment.selector,\n this._encodeParams(fragment.inputs, values || [])\n ]);\n }\n /**\n * Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n * specified function (see [[getFunction]] for valid values for\n * %%key%%).\n *\n * Most developers should prefer the [[parseCallResult]] method instead,\n * which will automatically detect a ``CALL_EXCEPTION`` and throw the\n * corresponding error.\n */\n decodeFunctionResult(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n let message = \"invalid length for result data\";\n const bytes = getBytesCopy(data);\n if ((bytes.length % 32) === 0) {\n try {\n return this.#abiCoder.decode(fragment.outputs, bytes);\n }\n catch (error) {\n message = \"could not decode result data\";\n }\n }\n // Call returned data with no error, but the data is junk\n assert(false, message, \"BAD_DATA\", {\n value: hexlify(bytes),\n info: { method: fragment.name, signature: fragment.format() }\n });\n }\n makeError(_data, tx) {\n const data = getBytes(_data, \"data\");\n const error = AbiCoder.getBuiltinCallException(\"call\", tx, data);\n // Not a built-in error; try finding a custom error\n const customPrefix = \"execution reverted (unknown custom error)\";\n if (error.message.startsWith(customPrefix)) {\n const selector = hexlify(data.slice(0, 4));\n const ef = this.getError(selector);\n if (ef) {\n try {\n const args = this.#abiCoder.decode(ef.inputs, data.slice(4));\n error.revert = {\n name: ef.name, signature: ef.format(), args\n };\n error.reason = error.revert.signature;\n error.message = `execution reverted: ${error.reason}`;\n }\n catch (e) {\n error.message = `execution reverted (coult not decode custom error)`;\n }\n }\n }\n // Add the invocation, if available\n const parsed = this.parseTransaction(tx);\n if (parsed) {\n error.invocation = {\n method: parsed.name,\n signature: parsed.signature,\n args: parsed.args\n };\n }\n return error;\n }\n /**\n * Encodes the result data (e.g. from an ``eth_call``) for the\n * specified function (see [[getFunction]] for valid values\n * for %%fragment%%) with %%values%%.\n *\n * This is generally not used by most developers, unless trying to mock\n * a result from a Contract.\n */\n encodeFunctionResult(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n return hexlify(this.#abiCoder.encode(fragment.outputs, values || []));\n }\n /*\n spelunk(inputs: Array, values: ReadonlyArray, processfunc: (type: string, value: any) => Promise): Promise> {\n const promises: Array> = [ ];\n const process = function(type: ParamType, value: any): any {\n if (type.baseType === \"array\") {\n return descend(type.child\n }\n if (type. === \"address\") {\n }\n };\n \n const descend = function (inputs: Array, values: ReadonlyArray) {\n if (inputs.length !== values.length) { throw new Error(\"length mismatch\"); }\n \n };\n \n const result: Array = [ ];\n values.forEach((value, index) => {\n if (value == null) {\n topics.push(null);\n } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n logger.throwArgumentError(\"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n } else if (Array.isArray(value)) {\n topics.push(value.map((value) => encodeTopic(param, value)));\n } else {\n topics.push(encodeTopic(param, value));\n }\n });\n }\n */\n // Create the filter for the event with search criteria (e.g. for eth_filterLog)\n encodeFilterTopics(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n assert(values.length <= fragment.inputs.length, `too many arguments for ${fragment.format()}`, \"UNEXPECTED_ARGUMENT\", { count: values.length, expectedCount: fragment.inputs.length });\n const topics = [];\n if (!fragment.anonymous) {\n topics.push(fragment.topicHash);\n }\n // @TODO: Use the coders for this; to properly support tuples, etc.\n const encodeTopic = (param, value) => {\n if (param.type === \"string\") {\n return id(value);\n }\n else if (param.type === \"bytes\") {\n return keccak256(hexlify(value));\n }\n if (param.type === \"bool\" && typeof (value) === \"boolean\") {\n value = (value ? \"0x01\" : \"0x00\");\n }\n else if (param.type.match(/^u?int/)) {\n value = toBeHex(value); // @TODO: Should this toTwos??\n }\n else if (param.type.match(/^bytes/)) {\n value = zeroPadBytes(value, 32);\n }\n else if (param.type === \"address\") {\n // Check addresses are valid\n this.#abiCoder.encode([\"address\"], [value]);\n }\n return zeroPadValue(hexlify(value), 32);\n };\n values.forEach((value, index) => {\n const param = fragment.inputs[index];\n if (!param.indexed) {\n assertArgument(value == null, \"cannot filter non-indexed parameters; must be null\", (\"contract.\" + param.name), value);\n return;\n }\n if (value == null) {\n topics.push(null);\n }\n else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n assertArgument(false, \"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n }\n else if (Array.isArray(value)) {\n topics.push(value.map((value) => encodeTopic(param, value)));\n }\n else {\n topics.push(encodeTopic(param, value));\n }\n });\n // Trim off trailing nulls\n while (topics.length && topics[topics.length - 1] === null) {\n topics.pop();\n }\n return topics;\n }\n encodeEventLog(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n const topics = [];\n const dataTypes = [];\n const dataValues = [];\n if (!fragment.anonymous) {\n topics.push(fragment.topicHash);\n }\n assertArgument(values.length === fragment.inputs.length, \"event arguments/values mismatch\", \"values\", values);\n fragment.inputs.forEach((param, index) => {\n const value = values[index];\n if (param.indexed) {\n if (param.type === \"string\") {\n topics.push(id(value));\n }\n else if (param.type === \"bytes\") {\n topics.push(keccak256(value));\n }\n else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n // @TODO\n throw new Error(\"not implemented\");\n }\n else {\n topics.push(this.#abiCoder.encode([param.type], [value]));\n }\n }\n else {\n dataTypes.push(param);\n dataValues.push(value);\n }\n });\n return {\n data: this.#abiCoder.encode(dataTypes, dataValues),\n topics: topics\n };\n }\n // Decode a filter for the event and the search criteria\n decodeEventLog(fragment, data, topics) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n if (topics != null && !fragment.anonymous) {\n const eventTopic = fragment.topicHash;\n assertArgument(isHexString(topics[0], 32) && topics[0].toLowerCase() === eventTopic, \"fragment/topic mismatch\", \"topics[0]\", topics[0]);\n topics = topics.slice(1);\n }\n const indexed = [];\n const nonIndexed = [];\n const dynamic = [];\n fragment.inputs.forEach((param, index) => {\n if (param.indexed) {\n if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n indexed.push(ParamType.from({ type: \"bytes32\", name: param.name }));\n dynamic.push(true);\n }\n else {\n indexed.push(param);\n dynamic.push(false);\n }\n }\n else {\n nonIndexed.push(param);\n dynamic.push(false);\n }\n });\n const resultIndexed = (topics != null) ? this.#abiCoder.decode(indexed, concat(topics)) : null;\n const resultNonIndexed = this.#abiCoder.decode(nonIndexed, data, true);\n //const result: (Array & { [ key: string ]: any }) = [ ];\n const values = [];\n const keys = [];\n let nonIndexedIndex = 0, indexedIndex = 0;\n fragment.inputs.forEach((param, index) => {\n let value = null;\n if (param.indexed) {\n if (resultIndexed == null) {\n value = new Indexed(null);\n }\n else if (dynamic[index]) {\n value = new Indexed(resultIndexed[indexedIndex++]);\n }\n else {\n try {\n value = resultIndexed[indexedIndex++];\n }\n catch (error) {\n value = error;\n }\n }\n }\n else {\n try {\n value = resultNonIndexed[nonIndexedIndex++];\n }\n catch (error) {\n value = error;\n }\n }\n values.push(value);\n keys.push(param.name || null);\n });\n return Result.fromItems(values, keys);\n }\n /**\n * Parses a transaction, finding the matching function and extracts\n * the parameter values along with other useful function details.\n *\n * If the matching function cannot be found, return null.\n */\n parseTransaction(tx) {\n const data = getBytes(tx.data, \"tx.data\");\n const value = getBigInt((tx.value != null) ? tx.value : 0, \"tx.value\");\n const fragment = this.getFunction(hexlify(data.slice(0, 4)));\n if (!fragment) {\n return null;\n }\n const args = this.#abiCoder.decode(fragment.inputs, data.slice(4));\n return new TransactionDescription(fragment, fragment.selector, args, value);\n }\n parseCallResult(data) {\n throw new Error(\"@TODO\");\n }\n /**\n * Parses a receipt log, finding the matching event and extracts\n * the parameter values along with other useful event details.\n *\n * If the matching event cannot be found, returns null.\n */\n parseLog(log) {\n const fragment = this.getEvent(log.topics[0]);\n if (!fragment || fragment.anonymous) {\n return null;\n }\n // @TODO: If anonymous, and the only method, and the input count matches, should we parse?\n // Probably not, because just because it is the only event in the ABI does\n // not mean we have the full ABI; maybe just a fragment?\n return new LogDescription(fragment, fragment.topicHash, this.decodeEventLog(fragment, log.data, log.topics));\n }\n /**\n * Parses a revert data, finding the matching error and extracts\n * the parameter values along with other useful error details.\n *\n * If the matching error cannot be found, returns null.\n */\n parseError(data) {\n const hexData = hexlify(data);\n const fragment = this.getError(dataSlice(hexData, 0, 4));\n if (!fragment) {\n return null;\n }\n const args = this.#abiCoder.decode(fragment.inputs, dataSlice(hexData, 4));\n return new ErrorDescription(fragment, fragment.selector, args);\n }\n /**\n * Creates a new [[Interface]] from the ABI %%value%%.\n *\n * The %%value%% may be provided as an existing [[Interface]] object,\n * a JSON-encoded ABI or any Human-Readable ABI format.\n */\n static from(value) {\n // Already an Interface, which is immutable\n if (value instanceof Interface) {\n return value;\n }\n // JSON\n if (typeof (value) === \"string\") {\n return new Interface(JSON.parse(value));\n }\n // An Interface; possibly from another v6 instance\n if (typeof (value.formatJson) === \"function\") {\n return new Interface(value.formatJson());\n }\n // A legacy Interface; from an older version\n if (typeof (value.format) === \"function\") {\n return new Interface(value.format(\"json\"));\n }\n // Array of fragments\n return new Interface(value);\n }\n}\n//# sourceMappingURL=interface.js.map","//import { resolveAddress } from \"@ethersproject/address\";\nimport { defineProperties, getBigInt, getNumber, hexlify, isBytesLike, resolveProperties, assert, assertArgument, isError, makeError } from \"../utils/index.js\";\nimport { accessListify } from \"../transaction/index.js\";\nconst BN_0 = BigInt(0);\n// -----------------------\nfunction getValue(value) {\n if (value == null) {\n return null;\n }\n return value;\n}\nfunction toJson(value) {\n if (value == null) {\n return null;\n }\n return value.toString();\n}\n// @TODO? implements Required\n/**\n * A **FeeData** wraps all the fee-related values associated with\n * the network.\n */\nexport class FeeData {\n /**\n * The gas price for legacy networks.\n */\n gasPrice;\n /**\n * The maximum fee to pay per gas.\n *\n * The base fee per gas is defined by the network and based on\n * congestion, increasing the cost during times of heavy load\n * and lowering when less busy.\n *\n * The actual fee per gas will be the base fee for the block\n * and the priority fee, up to the max fee per gas.\n *\n * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n */\n maxFeePerGas;\n /**\n * The additional amout to pay per gas to encourage a validator\n * to include the transaction.\n *\n * The purpose of this is to compensate the validator for the\n * adjusted risk for including a given transaction.\n *\n * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n */\n maxPriorityFeePerGas;\n /**\n * Creates a new FeeData for %%gasPrice%%, %%maxFeePerGas%% and\n * %%maxPriorityFeePerGas%%.\n */\n constructor(gasPrice, maxFeePerGas, maxPriorityFeePerGas) {\n defineProperties(this, {\n gasPrice: getValue(gasPrice),\n maxFeePerGas: getValue(maxFeePerGas),\n maxPriorityFeePerGas: getValue(maxPriorityFeePerGas)\n });\n }\n /**\n * Returns a JSON-friendly value.\n */\n toJSON() {\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = this;\n return {\n _type: \"FeeData\",\n gasPrice: toJson(gasPrice),\n maxFeePerGas: toJson(maxFeePerGas),\n maxPriorityFeePerGas: toJson(maxPriorityFeePerGas),\n };\n }\n}\n;\n/**\n * Returns a copy of %%req%% with all properties coerced to their strict\n * types.\n */\nexport function copyRequest(req) {\n const result = {};\n // These could be addresses, ENS names or Addressables\n if (req.to) {\n result.to = req.to;\n }\n if (req.from) {\n result.from = req.from;\n }\n if (req.data) {\n result.data = hexlify(req.data);\n }\n const bigIntKeys = \"chainId,gasLimit,gasPrice,maxFeePerBlobGas,maxFeePerGas,maxPriorityFeePerGas,value\".split(/,/);\n for (const key of bigIntKeys) {\n if (!(key in req) || req[key] == null) {\n continue;\n }\n result[key] = getBigInt(req[key], `request.${key}`);\n }\n const numberKeys = \"type,nonce\".split(/,/);\n for (const key of numberKeys) {\n if (!(key in req) || req[key] == null) {\n continue;\n }\n result[key] = getNumber(req[key], `request.${key}`);\n }\n if (req.accessList) {\n result.accessList = accessListify(req.accessList);\n }\n if (req.authorizationList) {\n result.authorizationList = req.authorizationList.slice();\n }\n if (\"blockTag\" in req) {\n result.blockTag = req.blockTag;\n }\n if (\"enableCcipRead\" in req) {\n result.enableCcipRead = !!req.enableCcipRead;\n }\n if (\"customData\" in req) {\n result.customData = req.customData;\n }\n if (\"blobVersionedHashes\" in req && req.blobVersionedHashes) {\n result.blobVersionedHashes = req.blobVersionedHashes.slice();\n }\n if (\"kzg\" in req) {\n result.kzg = req.kzg;\n }\n if (\"blobs\" in req && req.blobs) {\n result.blobs = req.blobs.map((b) => {\n if (isBytesLike(b)) {\n return hexlify(b);\n }\n return Object.assign({}, b);\n });\n }\n return result;\n}\n/**\n * A **Block** represents the data associated with a full block on\n * Ethereum.\n */\nexport class Block {\n /**\n * The provider connected to the block used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The block number, sometimes called the block height. This is a\n * sequential number that is one higher than the parent block.\n */\n number;\n /**\n * The block hash.\n *\n * This hash includes all properties, so can be safely used to identify\n * an exact set of block properties.\n */\n hash;\n /**\n * The timestamp for this block, which is the number of seconds since\n * epoch that this block was included.\n */\n timestamp;\n /**\n * The block hash of the parent block.\n */\n parentHash;\n /**\n * The hash tree root of the parent beacon block for the given\n * execution block. See [[link-eip-4788]].\n */\n parentBeaconBlockRoot;\n /**\n * The nonce.\n *\n * On legacy networks, this is the random number inserted which\n * permitted the difficulty target to be reached.\n */\n nonce;\n /**\n * The difficulty target.\n *\n * On legacy networks, this is the proof-of-work target required\n * for a block to meet the protocol rules to be included.\n *\n * On modern networks, this is a random number arrived at using\n * randao. @TODO: Find links?\n */\n difficulty;\n /**\n * The total gas limit for this block.\n */\n gasLimit;\n /**\n * The total gas used in this block.\n */\n gasUsed;\n /**\n * The root hash for the global state after applying changes\n * in this block.\n */\n stateRoot;\n /**\n * The hash of the transaction receipts trie.\n */\n receiptsRoot;\n /**\n * The total amount of blob gas consumed by the transactions\n * within the block. See [[link-eip-4844]].\n */\n blobGasUsed;\n /**\n * The running total of blob gas consumed in excess of the\n * target, prior to the block. See [[link-eip-4844]].\n */\n excessBlobGas;\n /**\n * The miner coinbase address, wihch receives any subsidies for\n * including this block.\n */\n miner;\n /**\n * The latest RANDAO mix of the post beacon state of\n * the previous block.\n */\n prevRandao;\n /**\n * Any extra data the validator wished to include.\n */\n extraData;\n /**\n * The base fee per gas that all transactions in this block were\n * charged.\n *\n * This adjusts after each block, depending on how congested the network\n * is.\n */\n baseFeePerGas;\n #transactions;\n /**\n * Create a new **Block** object.\n *\n * This should generally not be necessary as the unless implementing a\n * low-level library.\n */\n constructor(block, provider) {\n this.#transactions = block.transactions.map((tx) => {\n if (typeof (tx) !== \"string\") {\n return new TransactionResponse(tx, provider);\n }\n return tx;\n });\n defineProperties(this, {\n provider,\n hash: getValue(block.hash),\n number: block.number,\n timestamp: block.timestamp,\n parentHash: block.parentHash,\n parentBeaconBlockRoot: block.parentBeaconBlockRoot,\n nonce: block.nonce,\n difficulty: block.difficulty,\n gasLimit: block.gasLimit,\n gasUsed: block.gasUsed,\n blobGasUsed: block.blobGasUsed,\n excessBlobGas: block.excessBlobGas,\n miner: block.miner,\n prevRandao: getValue(block.prevRandao),\n extraData: block.extraData,\n baseFeePerGas: getValue(block.baseFeePerGas),\n stateRoot: block.stateRoot,\n receiptsRoot: block.receiptsRoot,\n });\n }\n /**\n * Returns the list of transaction hashes, in the order\n * they were executed within the block.\n */\n get transactions() {\n return this.#transactions.map((tx) => {\n if (typeof (tx) === \"string\") {\n return tx;\n }\n return tx.hash;\n });\n }\n /**\n * Returns the complete transactions, in the order they\n * were executed within the block.\n *\n * This is only available for blocks which prefetched\n * transactions, by passing ``true`` to %%prefetchTxs%%\n * into [[Provider-getBlock]].\n */\n get prefetchedTransactions() {\n const txs = this.#transactions.slice();\n // Doesn't matter...\n if (txs.length === 0) {\n return [];\n }\n // Make sure we prefetched the transactions\n assert(typeof (txs[0]) === \"object\", \"transactions were not prefetched with block request\", \"UNSUPPORTED_OPERATION\", {\n operation: \"transactionResponses()\"\n });\n return txs;\n }\n /**\n * Returns a JSON-friendly value.\n */\n toJSON() {\n const { baseFeePerGas, difficulty, extraData, gasLimit, gasUsed, hash, miner, prevRandao, nonce, number, parentHash, parentBeaconBlockRoot, stateRoot, receiptsRoot, timestamp, transactions } = this;\n return {\n _type: \"Block\",\n baseFeePerGas: toJson(baseFeePerGas),\n difficulty: toJson(difficulty),\n extraData,\n gasLimit: toJson(gasLimit),\n gasUsed: toJson(gasUsed),\n blobGasUsed: toJson(this.blobGasUsed),\n excessBlobGas: toJson(this.excessBlobGas),\n hash, miner, prevRandao, nonce, number, parentHash, timestamp,\n parentBeaconBlockRoot, stateRoot, receiptsRoot,\n transactions,\n };\n }\n [Symbol.iterator]() {\n let index = 0;\n const txs = this.transactions;\n return {\n next: () => {\n if (index < this.length) {\n return {\n value: txs[index++], done: false\n };\n }\n return { value: undefined, done: true };\n }\n };\n }\n /**\n * The number of transactions in this block.\n */\n get length() { return this.#transactions.length; }\n /**\n * The [[link-js-date]] this block was included at.\n */\n get date() {\n if (this.timestamp == null) {\n return null;\n }\n return new Date(this.timestamp * 1000);\n }\n /**\n * Get the transaction at %%indexe%% within this block.\n */\n async getTransaction(indexOrHash) {\n // Find the internal value by its index or hash\n let tx = undefined;\n if (typeof (indexOrHash) === \"number\") {\n tx = this.#transactions[indexOrHash];\n }\n else {\n const hash = indexOrHash.toLowerCase();\n for (const v of this.#transactions) {\n if (typeof (v) === \"string\") {\n if (v !== hash) {\n continue;\n }\n tx = v;\n break;\n }\n else {\n if (v.hash !== hash) {\n continue;\n }\n tx = v;\n break;\n }\n }\n }\n if (tx == null) {\n throw new Error(\"no such tx\");\n }\n if (typeof (tx) === \"string\") {\n return (await this.provider.getTransaction(tx));\n }\n else {\n return tx;\n }\n }\n /**\n * If a **Block** was fetched with a request to include the transactions\n * this will allow synchronous access to those transactions.\n *\n * If the transactions were not prefetched, this will throw.\n */\n getPrefetchedTransaction(indexOrHash) {\n const txs = this.prefetchedTransactions;\n if (typeof (indexOrHash) === \"number\") {\n return txs[indexOrHash];\n }\n indexOrHash = indexOrHash.toLowerCase();\n for (const tx of txs) {\n if (tx.hash === indexOrHash) {\n return tx;\n }\n }\n assertArgument(false, \"no matching transaction\", \"indexOrHash\", indexOrHash);\n }\n /**\n * Returns true if this block been mined. This provides a type guard\n * for all properties on a [[MinedBlock]].\n */\n isMined() { return !!this.hash; }\n /**\n * Returns true if this block is an [[link-eip-2930]] block.\n */\n isLondon() {\n return !!this.baseFeePerGas;\n }\n /**\n * @_ignore:\n */\n orphanedEvent() {\n if (!this.isMined()) {\n throw new Error(\"\");\n }\n return createOrphanedBlockFilter(this);\n }\n}\n//////////////////////\n// Log\n/**\n * A **Log** in Ethereum represents an event that has been included in a\n * transaction using the ``LOG*`` opcodes, which are most commonly used by\n * Solidity's emit for announcing events.\n */\nexport class Log {\n /**\n * The provider connected to the log used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The transaction hash of the transaction this log occurred in. Use the\n * [[Log-getTransaction]] to get the [[TransactionResponse]].\n */\n transactionHash;\n /**\n * The block hash of the block this log occurred in. Use the\n * [[Log-getBlock]] to get the [[Block]].\n */\n blockHash;\n /**\n * The block number of the block this log occurred in. It is preferred\n * to use the [[Block-hash]] when fetching the related [[Block]],\n * since in the case of an orphaned block, the block at that height may\n * have changed.\n */\n blockNumber;\n /**\n * If the **Log** represents a block that was removed due to an orphaned\n * block, this will be true.\n *\n * This can only happen within an orphan event listener.\n */\n removed;\n /**\n * The address of the contract that emitted this log.\n */\n address;\n /**\n * The data included in this log when it was emitted.\n */\n data;\n /**\n * The indexed topics included in this log when it was emitted.\n *\n * All topics are included in the bloom filters, so they can be\n * efficiently filtered using the [[Provider-getLogs]] method.\n */\n topics;\n /**\n * The index within the block this log occurred at. This is generally\n * not useful to developers, but can be used with the various roots\n * to proof inclusion within a block.\n */\n index;\n /**\n * The index within the transaction of this log.\n */\n transactionIndex;\n /**\n * @_ignore:\n */\n constructor(log, provider) {\n this.provider = provider;\n const topics = Object.freeze(log.topics.slice());\n defineProperties(this, {\n transactionHash: log.transactionHash,\n blockHash: log.blockHash,\n blockNumber: log.blockNumber,\n removed: log.removed,\n address: log.address,\n data: log.data,\n topics,\n index: log.index,\n transactionIndex: log.transactionIndex,\n });\n }\n /**\n * Returns a JSON-compatible object.\n */\n toJSON() {\n const { address, blockHash, blockNumber, data, index, removed, topics, transactionHash, transactionIndex } = this;\n return {\n _type: \"log\",\n address, blockHash, blockNumber, data, index,\n removed, topics, transactionHash, transactionIndex\n };\n }\n /**\n * Returns the block that this log occurred in.\n */\n async getBlock() {\n const block = await this.provider.getBlock(this.blockHash);\n assert(!!block, \"failed to find transaction\", \"UNKNOWN_ERROR\", {});\n return block;\n }\n /**\n * Returns the transaction that this log occurred in.\n */\n async getTransaction() {\n const tx = await this.provider.getTransaction(this.transactionHash);\n assert(!!tx, \"failed to find transaction\", \"UNKNOWN_ERROR\", {});\n return tx;\n }\n /**\n * Returns the transaction receipt fot the transaction that this\n * log occurred in.\n */\n async getTransactionReceipt() {\n const receipt = await this.provider.getTransactionReceipt(this.transactionHash);\n assert(!!receipt, \"failed to find transaction receipt\", \"UNKNOWN_ERROR\", {});\n return receipt;\n }\n /**\n * @_ignore:\n */\n removedEvent() {\n return createRemovedLogFilter(this);\n }\n}\n//////////////////////\n// Transaction Receipt\n/*\nexport interface LegacyTransactionReceipt {\n byzantium: false;\n status: null;\n root: string;\n}\n\nexport interface ByzantiumTransactionReceipt {\n byzantium: true;\n status: number;\n root: null;\n}\n*/\n/**\n * A **TransactionReceipt** includes additional information about a\n * transaction that is only available after it has been mined.\n */\nexport class TransactionReceipt {\n /**\n * The provider connected to the log used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The address the transaction was sent to.\n */\n to;\n /**\n * The sender of the transaction.\n */\n from;\n /**\n * The address of the contract if the transaction was directly\n * responsible for deploying one.\n *\n * This is non-null **only** if the ``to`` is empty and the ``data``\n * was successfully executed as initcode.\n */\n contractAddress;\n /**\n * The transaction hash.\n */\n hash;\n /**\n * The index of this transaction within the block transactions.\n */\n index;\n /**\n * The block hash of the [[Block]] this transaction was included in.\n */\n blockHash;\n /**\n * The block number of the [[Block]] this transaction was included in.\n */\n blockNumber;\n /**\n * The bloom filter bytes that represent all logs that occurred within\n * this transaction. This is generally not useful for most developers,\n * but can be used to validate the included logs.\n */\n logsBloom;\n /**\n * The actual amount of gas used by this transaction.\n *\n * When creating a transaction, the amount of gas that will be used can\n * only be approximated, but the sender must pay the gas fee for the\n * entire gas limit. After the transaction, the difference is refunded.\n */\n gasUsed;\n /**\n * The gas used for BLObs. See [[link-eip-4844]].\n */\n blobGasUsed;\n /**\n * The amount of gas used by all transactions within the block for this\n * and all transactions with a lower ``index``.\n *\n * This is generally not useful for developers but can be used to\n * validate certain aspects of execution.\n */\n cumulativeGasUsed;\n /**\n * The actual gas price used during execution.\n *\n * Due to the complexity of [[link-eip-1559]] this value can only\n * be caluclated after the transaction has been mined, snce the base\n * fee is protocol-enforced.\n */\n gasPrice;\n /**\n * The price paid per BLOB in gas. See [[link-eip-4844]].\n */\n blobGasPrice;\n /**\n * The [[link-eip-2718]] transaction type.\n */\n type;\n //readonly byzantium!: boolean;\n /**\n * The status of this transaction, indicating success (i.e. ``1``) or\n * a revert (i.e. ``0``).\n *\n * This is available in post-byzantium blocks, but some backends may\n * backfill this value.\n */\n status;\n /**\n * The root hash of this transaction.\n *\n * This is no present and was only included in pre-byzantium blocks, but\n * could be used to validate certain parts of the receipt.\n */\n root;\n #logs;\n /**\n * @_ignore:\n */\n constructor(tx, provider) {\n this.#logs = Object.freeze(tx.logs.map((log) => {\n return new Log(log, provider);\n }));\n let gasPrice = BN_0;\n if (tx.effectiveGasPrice != null) {\n gasPrice = tx.effectiveGasPrice;\n }\n else if (tx.gasPrice != null) {\n gasPrice = tx.gasPrice;\n }\n defineProperties(this, {\n provider,\n to: tx.to,\n from: tx.from,\n contractAddress: tx.contractAddress,\n hash: tx.hash,\n index: tx.index,\n blockHash: tx.blockHash,\n blockNumber: tx.blockNumber,\n logsBloom: tx.logsBloom,\n gasUsed: tx.gasUsed,\n cumulativeGasUsed: tx.cumulativeGasUsed,\n blobGasUsed: tx.blobGasUsed,\n gasPrice,\n blobGasPrice: tx.blobGasPrice,\n type: tx.type,\n //byzantium: tx.byzantium,\n status: tx.status,\n root: tx.root\n });\n }\n /**\n * The logs for this transaction.\n */\n get logs() { return this.#logs; }\n /**\n * Returns a JSON-compatible representation.\n */\n toJSON() {\n const { to, from, contractAddress, hash, index, blockHash, blockNumber, logsBloom, logs, //byzantium, \n status, root } = this;\n return {\n _type: \"TransactionReceipt\",\n blockHash, blockNumber,\n //byzantium, \n contractAddress,\n cumulativeGasUsed: toJson(this.cumulativeGasUsed),\n from,\n gasPrice: toJson(this.gasPrice),\n blobGasUsed: toJson(this.blobGasUsed),\n blobGasPrice: toJson(this.blobGasPrice),\n gasUsed: toJson(this.gasUsed),\n hash, index, logs, logsBloom, root, status, to\n };\n }\n /**\n * @_ignore:\n */\n get length() { return this.logs.length; }\n [Symbol.iterator]() {\n let index = 0;\n return {\n next: () => {\n if (index < this.length) {\n return { value: this.logs[index++], done: false };\n }\n return { value: undefined, done: true };\n }\n };\n }\n /**\n * The total fee for this transaction, in wei.\n */\n get fee() {\n return this.gasUsed * this.gasPrice;\n }\n /**\n * Resolves to the block this transaction occurred in.\n */\n async getBlock() {\n const block = await this.provider.getBlock(this.blockHash);\n if (block == null) {\n throw new Error(\"TODO\");\n }\n return block;\n }\n /**\n * Resolves to the transaction this transaction occurred in.\n */\n async getTransaction() {\n const tx = await this.provider.getTransaction(this.hash);\n if (tx == null) {\n throw new Error(\"TODO\");\n }\n return tx;\n }\n /**\n * Resolves to the return value of the execution of this transaction.\n *\n * Support for this feature is limited, as it requires an archive node\n * with the ``debug_`` or ``trace_`` API enabled.\n */\n async getResult() {\n return (await this.provider.getTransactionResult(this.hash));\n }\n /**\n * Resolves to the number of confirmations this transaction has.\n */\n async confirmations() {\n return (await this.provider.getBlockNumber()) - this.blockNumber + 1;\n }\n /**\n * @_ignore:\n */\n removedEvent() {\n return createRemovedTransactionFilter(this);\n }\n /**\n * @_ignore:\n */\n reorderedEvent(other) {\n assert(!other || other.isMined(), \"unmined 'other' transction cannot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"reorderedEvent(other)\" });\n return createReorderedTransactionFilter(this, other);\n }\n}\n/**\n * A **TransactionResponse** includes all properties about a transaction\n * that was sent to the network, which may or may not be included in a\n * block.\n *\n * The [[TransactionResponse-isMined]] can be used to check if the\n * transaction has been mined as well as type guard that the otherwise\n * possibly ``null`` properties are defined.\n */\nexport class TransactionResponse {\n /**\n * The provider this is connected to, which will influence how its\n * methods will resolve its async inspection methods.\n */\n provider;\n /**\n * The block number of the block that this transaction was included in.\n *\n * This is ``null`` for pending transactions.\n */\n blockNumber;\n /**\n * The blockHash of the block that this transaction was included in.\n *\n * This is ``null`` for pending transactions.\n */\n blockHash;\n /**\n * The index within the block that this transaction resides at.\n */\n index;\n /**\n * The transaction hash.\n */\n hash;\n /**\n * The [[link-eip-2718]] transaction envelope type. This is\n * ``0`` for legacy transactions types.\n */\n type;\n /**\n * The receiver of this transaction.\n *\n * If ``null``, then the transaction is an initcode transaction.\n * This means the result of executing the [[data]] will be deployed\n * as a new contract on chain (assuming it does not revert) and the\n * address may be computed using [[getCreateAddress]].\n */\n to;\n /**\n * The sender of this transaction. It is implicitly computed\n * from the transaction pre-image hash (as the digest) and the\n * [[signature]] using ecrecover.\n */\n from;\n /**\n * The nonce, which is used to prevent replay attacks and offer\n * a method to ensure transactions from a given sender are explicitly\n * ordered.\n *\n * When sending a transaction, this must be equal to the number of\n * transactions ever sent by [[from]].\n */\n nonce;\n /**\n * The maximum units of gas this transaction can consume. If execution\n * exceeds this, the entries transaction is reverted and the sender\n * is charged for the full amount, despite not state changes being made.\n */\n gasLimit;\n /**\n * The gas price can have various values, depending on the network.\n *\n * In modern networks, for transactions that are included this is\n * the //effective gas price// (the fee per gas that was actually\n * charged), while for transactions that have not been included yet\n * is the [[maxFeePerGas]].\n *\n * For legacy transactions, or transactions on legacy networks, this\n * is the fee that will be charged per unit of gas the transaction\n * consumes.\n */\n gasPrice;\n /**\n * The maximum priority fee (per unit of gas) to allow a\n * validator to charge the sender. This is inclusive of the\n * [[maxFeeFeePerGas]].\n */\n maxPriorityFeePerGas;\n /**\n * The maximum fee (per unit of gas) to allow this transaction\n * to charge the sender.\n */\n maxFeePerGas;\n /**\n * The [[link-eip-4844]] max fee per BLOb gas.\n */\n maxFeePerBlobGas;\n /**\n * The data.\n */\n data;\n /**\n * The value, in wei. Use [[formatEther]] to format this value\n * as ether.\n */\n value;\n /**\n * The chain ID.\n */\n chainId;\n /**\n * The signature.\n */\n signature;\n /**\n * The [[link-eip-2930]] access list for transaction types that\n * support it, otherwise ``null``.\n */\n accessList;\n /**\n * The [[link-eip-4844]] BLOb versioned hashes.\n */\n blobVersionedHashes;\n /**\n * The [[link-eip-7702]] authorizations (if any).\n */\n authorizationList;\n #startBlock;\n /**\n * @_ignore:\n */\n constructor(tx, provider) {\n this.provider = provider;\n this.blockNumber = (tx.blockNumber != null) ? tx.blockNumber : null;\n this.blockHash = (tx.blockHash != null) ? tx.blockHash : null;\n this.hash = tx.hash;\n this.index = tx.index;\n this.type = tx.type;\n this.from = tx.from;\n this.to = tx.to || null;\n this.gasLimit = tx.gasLimit;\n this.nonce = tx.nonce;\n this.data = tx.data;\n this.value = tx.value;\n this.gasPrice = tx.gasPrice;\n this.maxPriorityFeePerGas = (tx.maxPriorityFeePerGas != null) ? tx.maxPriorityFeePerGas : null;\n this.maxFeePerGas = (tx.maxFeePerGas != null) ? tx.maxFeePerGas : null;\n this.maxFeePerBlobGas = (tx.maxFeePerBlobGas != null) ? tx.maxFeePerBlobGas : null;\n this.chainId = tx.chainId;\n this.signature = tx.signature;\n this.accessList = (tx.accessList != null) ? tx.accessList : null;\n this.blobVersionedHashes = (tx.blobVersionedHashes != null) ? tx.blobVersionedHashes : null;\n this.authorizationList = (tx.authorizationList != null) ? tx.authorizationList : null;\n this.#startBlock = -1;\n }\n /**\n * Returns a JSON-compatible representation of this transaction.\n */\n toJSON() {\n const { blockNumber, blockHash, index, hash, type, to, from, nonce, data, signature, accessList, blobVersionedHashes } = this;\n return {\n _type: \"TransactionResponse\",\n accessList, blockNumber, blockHash,\n blobVersionedHashes,\n chainId: toJson(this.chainId),\n data, from,\n gasLimit: toJson(this.gasLimit),\n gasPrice: toJson(this.gasPrice),\n hash,\n maxFeePerGas: toJson(this.maxFeePerGas),\n maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas),\n maxFeePerBlobGas: toJson(this.maxFeePerBlobGas),\n nonce, signature, to, index, type,\n value: toJson(this.value),\n };\n }\n /**\n * Resolves to the Block that this transaction was included in.\n *\n * This will return null if the transaction has not been included yet.\n */\n async getBlock() {\n let blockNumber = this.blockNumber;\n if (blockNumber == null) {\n const tx = await this.getTransaction();\n if (tx) {\n blockNumber = tx.blockNumber;\n }\n }\n if (blockNumber == null) {\n return null;\n }\n const block = this.provider.getBlock(blockNumber);\n if (block == null) {\n throw new Error(\"TODO\");\n }\n return block;\n }\n /**\n * Resolves to this transaction being re-requested from the\n * provider. This can be used if you have an unmined transaction\n * and wish to get an up-to-date populated instance.\n */\n async getTransaction() {\n return this.provider.getTransaction(this.hash);\n }\n /**\n * Resolve to the number of confirmations this transaction has.\n */\n async confirmations() {\n if (this.blockNumber == null) {\n const { tx, blockNumber } = await resolveProperties({\n tx: this.getTransaction(),\n blockNumber: this.provider.getBlockNumber()\n });\n // Not mined yet...\n if (tx == null || tx.blockNumber == null) {\n return 0;\n }\n return blockNumber - tx.blockNumber + 1;\n }\n const blockNumber = await this.provider.getBlockNumber();\n return blockNumber - this.blockNumber + 1;\n }\n /**\n * Resolves once this transaction has been mined and has\n * %%confirms%% blocks including it (default: ``1``) with an\n * optional %%timeout%%.\n *\n * This can resolve to ``null`` only if %%confirms%% is ``0``\n * and the transaction has not been mined, otherwise this will\n * wait until enough confirmations have completed.\n */\n async wait(_confirms, _timeout) {\n const confirms = (_confirms == null) ? 1 : _confirms;\n const timeout = (_timeout == null) ? 0 : _timeout;\n let startBlock = this.#startBlock;\n let nextScan = -1;\n let stopScanning = (startBlock === -1) ? true : false;\n const checkReplacement = async () => {\n // Get the current transaction count for this sender\n if (stopScanning) {\n return null;\n }\n const { blockNumber, nonce } = await resolveProperties({\n blockNumber: this.provider.getBlockNumber(),\n nonce: this.provider.getTransactionCount(this.from)\n });\n // No transaction or our nonce has not been mined yet; but we\n // can start scanning later when we do start\n if (nonce < this.nonce) {\n startBlock = blockNumber;\n return;\n }\n // We were mined; no replacement\n if (stopScanning) {\n return null;\n }\n const mined = await this.getTransaction();\n if (mined && mined.blockNumber != null) {\n return;\n }\n // We were replaced; start scanning for that transaction\n // Starting to scan; look back a few extra blocks for safety\n if (nextScan === -1) {\n nextScan = startBlock - 3;\n if (nextScan < this.#startBlock) {\n nextScan = this.#startBlock;\n }\n }\n while (nextScan <= blockNumber) {\n // Get the next block to scan\n if (stopScanning) {\n return null;\n }\n const block = await this.provider.getBlock(nextScan, true);\n // This should not happen; but we'll try again shortly\n if (block == null) {\n return;\n }\n // We were mined; no replacement\n for (const hash of block) {\n if (hash === this.hash) {\n return;\n }\n }\n // Search for the transaction that replaced us\n for (let i = 0; i < block.length; i++) {\n const tx = await block.getTransaction(i);\n if (tx.from === this.from && tx.nonce === this.nonce) {\n // Get the receipt\n if (stopScanning) {\n return null;\n }\n const receipt = await this.provider.getTransactionReceipt(tx.hash);\n // This should not happen; but we'll try again shortly\n if (receipt == null) {\n return;\n }\n // We will retry this on the next block (this case could be optimized)\n if ((blockNumber - receipt.blockNumber + 1) < confirms) {\n return;\n }\n // The reason we were replaced\n let reason = \"replaced\";\n if (tx.data === this.data && tx.to === this.to && tx.value === this.value) {\n reason = \"repriced\";\n }\n else if (tx.data === \"0x\" && tx.from === tx.to && tx.value === BN_0) {\n reason = \"cancelled\";\n }\n assert(false, \"transaction was replaced\", \"TRANSACTION_REPLACED\", {\n cancelled: (reason === \"replaced\" || reason === \"cancelled\"),\n reason,\n replacement: tx.replaceableTransaction(startBlock),\n hash: tx.hash,\n receipt\n });\n }\n }\n nextScan++;\n }\n return;\n };\n const checkReceipt = (receipt) => {\n if (receipt == null || receipt.status !== 0) {\n return receipt;\n }\n assert(false, \"transaction execution reverted\", \"CALL_EXCEPTION\", {\n action: \"sendTransaction\",\n data: null, reason: null, invocation: null, revert: null,\n transaction: {\n to: receipt.to,\n from: receipt.from,\n data: \"\" // @TODO: in v7, split out sendTransaction properties\n }, receipt\n });\n };\n const receipt = await this.provider.getTransactionReceipt(this.hash);\n if (confirms === 0) {\n return checkReceipt(receipt);\n }\n if (receipt) {\n if (confirms === 1 || (await receipt.confirmations()) >= confirms) {\n return checkReceipt(receipt);\n }\n }\n else {\n // Check for a replacement; throws if a replacement was found\n await checkReplacement();\n // Allow null only when the confirms is 0\n if (confirms === 0) {\n return null;\n }\n }\n const waiter = new Promise((resolve, reject) => {\n // List of things to cancel when we have a result (one way or the other)\n const cancellers = [];\n const cancel = () => { cancellers.forEach((c) => c()); };\n // On cancel, stop scanning for replacements\n cancellers.push(() => { stopScanning = true; });\n // Set up any timeout requested\n if (timeout > 0) {\n const timer = setTimeout(() => {\n cancel();\n reject(makeError(\"wait for transaction timeout\", \"TIMEOUT\"));\n }, timeout);\n cancellers.push(() => { clearTimeout(timer); });\n }\n const txListener = async (receipt) => {\n // Done; return it!\n if ((await receipt.confirmations()) >= confirms) {\n cancel();\n try {\n resolve(checkReceipt(receipt));\n }\n catch (error) {\n reject(error);\n }\n }\n };\n cancellers.push(() => { this.provider.off(this.hash, txListener); });\n this.provider.on(this.hash, txListener);\n // We support replacement detection; start checking\n if (startBlock >= 0) {\n const replaceListener = async () => {\n try {\n // Check for a replacement; this throws only if one is found\n await checkReplacement();\n }\n catch (error) {\n // We were replaced (with enough confirms); re-throw the error\n if (isError(error, \"TRANSACTION_REPLACED\")) {\n cancel();\n reject(error);\n return;\n }\n }\n // Rescheudle a check on the next block\n if (!stopScanning) {\n this.provider.once(\"block\", replaceListener);\n }\n };\n cancellers.push(() => { this.provider.off(\"block\", replaceListener); });\n this.provider.once(\"block\", replaceListener);\n }\n });\n return await waiter;\n }\n /**\n * Returns ``true`` if this transaction has been included.\n *\n * This is effective only as of the time the TransactionResponse\n * was instantiated. To get up-to-date information, use\n * [[getTransaction]].\n *\n * This provides a Type Guard that this transaction will have\n * non-null property values for properties that are null for\n * unmined transactions.\n */\n isMined() {\n return (this.blockHash != null);\n }\n /**\n * Returns true if the transaction is a legacy (i.e. ``type == 0``)\n * transaction.\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isLegacy() {\n return (this.type === 0);\n }\n /**\n * Returns true if the transaction is a Berlin (i.e. ``type == 1``)\n * transaction. See [[link-eip-2070]].\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isBerlin() {\n return (this.type === 1);\n }\n /**\n * Returns true if the transaction is a London (i.e. ``type == 2``)\n * transaction. See [[link-eip-1559]].\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isLondon() {\n return (this.type === 2);\n }\n /**\n * Returns true if hte transaction is a Cancun (i.e. ``type == 3``)\n * transaction. See [[link-eip-4844]].\n */\n isCancun() {\n return (this.type === 3);\n }\n /**\n * Returns a filter which can be used to listen for orphan events\n * that evict this transaction.\n */\n removedEvent() {\n assert(this.isMined(), \"unmined transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n return createRemovedTransactionFilter(this);\n }\n /**\n * Returns a filter which can be used to listen for orphan events\n * that re-order this event against %%other%%.\n */\n reorderedEvent(other) {\n assert(this.isMined(), \"unmined transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n assert(!other || other.isMined(), \"unmined 'other' transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n return createReorderedTransactionFilter(this, other);\n }\n /**\n * Returns a new TransactionResponse instance which has the ability to\n * detect (and throw an error) if the transaction is replaced, which\n * will begin scanning at %%startBlock%%.\n *\n * This should generally not be used by developers and is intended\n * primarily for internal use. Setting an incorrect %%startBlock%% can\n * have devastating performance consequences if used incorrectly.\n */\n replaceableTransaction(startBlock) {\n assertArgument(Number.isInteger(startBlock) && startBlock >= 0, \"invalid startBlock\", \"startBlock\", startBlock);\n const tx = new TransactionResponse(this, this.provider);\n tx.#startBlock = startBlock;\n return tx;\n }\n}\nfunction createOrphanedBlockFilter(block) {\n return { orphan: \"drop-block\", hash: block.hash, number: block.number };\n}\nfunction createReorderedTransactionFilter(tx, other) {\n return { orphan: \"reorder-transaction\", tx, other };\n}\nfunction createRemovedTransactionFilter(tx) {\n return { orphan: \"drop-transaction\", tx };\n}\nfunction createRemovedLogFilter(log) {\n return { orphan: \"drop-log\", log: {\n transactionHash: log.transactionHash,\n blockHash: log.blockHash,\n blockNumber: log.blockNumber,\n address: log.address,\n data: log.data,\n topics: Object.freeze(log.topics.slice()),\n index: log.index\n } };\n}\n//# sourceMappingURL=provider.js.map","// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport { Log, TransactionReceipt, TransactionResponse } from \"../providers/provider.js\";\nimport { defineProperties, EventPayload } from \"../utils/index.js\";\n/**\n * An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class EventLog extends Log {\n /**\n * The Contract Interface.\n */\n interface;\n /**\n * The matching event.\n */\n fragment;\n /**\n * The parsed arguments passed to the event by ``emit``.\n */\n args;\n /**\n * @_ignore:\n */\n constructor(log, iface, fragment) {\n super(log, log.provider);\n const args = iface.decodeEventLog(fragment, log.data, log.topics);\n defineProperties(this, { args, fragment, interface: iface });\n }\n /**\n * The name of the event.\n */\n get eventName() { return this.fragment.name; }\n /**\n * The signature of the event.\n */\n get eventSignature() { return this.fragment.format(); }\n}\n/**\n * An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class UndecodedEventLog extends Log {\n /**\n * The error encounted when trying to decode the log.\n */\n error;\n /**\n * @_ignore:\n */\n constructor(log, error) {\n super(log, log.provider);\n defineProperties(this, { error });\n }\n}\n/**\n * A **ContractTransactionReceipt** includes the parsed logs from a\n * [[TransactionReceipt]].\n */\nexport class ContractTransactionReceipt extends TransactionReceipt {\n #iface;\n /**\n * @_ignore:\n */\n constructor(iface, provider, tx) {\n super(tx, provider);\n this.#iface = iface;\n }\n /**\n * The parsed logs for any [[Log]] which has a matching event in the\n * Contract ABI.\n */\n get logs() {\n return super.logs.map((log) => {\n const fragment = log.topics.length ? this.#iface.getEvent(log.topics[0]) : null;\n if (fragment) {\n try {\n return new EventLog(log, this.#iface, fragment);\n }\n catch (error) {\n return new UndecodedEventLog(log, error);\n }\n }\n return log;\n });\n }\n}\n/**\n * A **ContractTransactionResponse** will return a\n * [[ContractTransactionReceipt]] when waited on.\n */\nexport class ContractTransactionResponse extends TransactionResponse {\n #iface;\n /**\n * @_ignore:\n */\n constructor(iface, provider, tx) {\n super(tx, provider);\n this.#iface = iface;\n }\n /**\n * Resolves once this transaction has been mined and has\n * %%confirms%% blocks including it (default: ``1``) with an\n * optional %%timeout%%.\n *\n * This can resolve to ``null`` only if %%confirms%% is ``0``\n * and the transaction has not been mined, otherwise this will\n * wait until enough confirmations have completed.\n */\n async wait(confirms, timeout) {\n const receipt = await super.wait(confirms, timeout);\n if (receipt == null) {\n return null;\n }\n return new ContractTransactionReceipt(this.#iface, this.provider, receipt);\n }\n}\n/**\n * A **ContractUnknownEventPayload** is included as the last parameter to\n * Contract Events when the event does not match any events in the ABI.\n */\nexport class ContractUnknownEventPayload extends EventPayload {\n /**\n * The log with no matching events.\n */\n log;\n /**\n * @_event:\n */\n constructor(contract, listener, filter, log) {\n super(contract, listener, filter);\n defineProperties(this, { log });\n }\n /**\n * Resolves to the block the event occured in.\n */\n async getBlock() {\n return await this.log.getBlock();\n }\n /**\n * Resolves to the transaction the event occured in.\n */\n async getTransaction() {\n return await this.log.getTransaction();\n }\n /**\n * Resolves to the transaction receipt the event occured in.\n */\n async getTransactionReceipt() {\n return await this.log.getTransactionReceipt();\n }\n}\n/**\n * A **ContractEventPayload** is included as the last parameter to\n * Contract Events when the event is known.\n */\nexport class ContractEventPayload extends ContractUnknownEventPayload {\n /**\n * @_ignore:\n */\n constructor(contract, listener, filter, fragment, _log) {\n super(contract, listener, filter, new EventLog(_log, contract.interface, fragment));\n const args = contract.interface.decodeEventLog(fragment, this.log.data, this.log.topics);\n defineProperties(this, { args, fragment });\n }\n /**\n * The event name.\n */\n get eventName() {\n return this.fragment.name;\n }\n /**\n * The event signature.\n */\n get eventSignature() {\n return this.fragment.format();\n }\n}\n//# sourceMappingURL=wrappers.js.map","import { Interface, Typed } from \"../abi/index.js\";\nimport { isAddressable, resolveAddress } from \"../address/index.js\";\n// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport { copyRequest, Log } from \"../providers/provider.js\";\nimport { defineProperties, getBigInt, isCallException, isHexString, resolveProperties, isError, makeError, assert, assertArgument } from \"../utils/index.js\";\nimport { ContractEventPayload, ContractUnknownEventPayload, ContractTransactionResponse, EventLog, UndecodedEventLog } from \"./wrappers.js\";\nconst BN_0 = BigInt(0);\nfunction canCall(value) {\n return (value && typeof (value.call) === \"function\");\n}\nfunction canEstimate(value) {\n return (value && typeof (value.estimateGas) === \"function\");\n}\nfunction canResolve(value) {\n return (value && typeof (value.resolveName) === \"function\");\n}\nfunction canSend(value) {\n return (value && typeof (value.sendTransaction) === \"function\");\n}\nfunction getResolver(value) {\n if (value != null) {\n if (canResolve(value)) {\n return value;\n }\n if (value.provider) {\n return value.provider;\n }\n }\n return undefined;\n}\nclass PreparedTopicFilter {\n #filter;\n fragment;\n constructor(contract, fragment, args) {\n defineProperties(this, { fragment });\n if (fragment.inputs.length < args.length) {\n throw new Error(\"too many arguments\");\n }\n // Recursively descend into args and resolve any addresses\n const runner = getRunner(contract.runner, \"resolveName\");\n const resolver = canResolve(runner) ? runner : null;\n this.#filter = (async function () {\n const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => {\n const arg = args[index];\n if (arg == null) {\n return null;\n }\n return param.walkAsync(args[index], (type, value) => {\n if (type === \"address\") {\n if (Array.isArray(value)) {\n return Promise.all(value.map((v) => resolveAddress(v, resolver)));\n }\n return resolveAddress(value, resolver);\n }\n return value;\n });\n }));\n return contract.interface.encodeFilterTopics(fragment, resolvedArgs);\n })();\n }\n getTopicFilter() {\n return this.#filter;\n }\n}\n// A = Arguments passed in as a tuple\n// R = The result type of the call (i.e. if only one return type,\n// the qualified type, otherwise Result)\n// D = The type the default call will return (i.e. R for view/pure,\n// TransactionResponse otherwise)\n//export interface ContractMethod = Array, R = any, D extends R | ContractTransactionResponse = ContractTransactionResponse> {\nfunction getRunner(value, feature) {\n if (value == null) {\n return null;\n }\n if (typeof (value[feature]) === \"function\") {\n return value;\n }\n if (value.provider && typeof (value.provider[feature]) === \"function\") {\n return value.provider;\n }\n return null;\n}\nfunction getProvider(value) {\n if (value == null) {\n return null;\n }\n return value.provider || null;\n}\n/**\n * @_ignore:\n */\nexport async function copyOverrides(arg, allowed) {\n // Make sure the overrides passed in are a valid overrides object\n const _overrides = Typed.dereference(arg, \"overrides\");\n assertArgument(typeof (_overrides) === \"object\", \"invalid overrides parameter\", \"overrides\", arg);\n // Create a shallow copy (we'll deep-ify anything needed during normalizing)\n const overrides = copyRequest(_overrides);\n assertArgument(overrides.to == null || (allowed || []).indexOf(\"to\") >= 0, \"cannot override to\", \"overrides.to\", overrides.to);\n assertArgument(overrides.data == null || (allowed || []).indexOf(\"data\") >= 0, \"cannot override data\", \"overrides.data\", overrides.data);\n // Resolve any from\n if (overrides.from) {\n overrides.from = overrides.from;\n }\n return overrides;\n}\n/**\n * @_ignore:\n */\nexport async function resolveArgs(_runner, inputs, args) {\n // Recursively descend into args and resolve any addresses\n const runner = getRunner(_runner, \"resolveName\");\n const resolver = canResolve(runner) ? runner : null;\n return await Promise.all(inputs.map((param, index) => {\n return param.walkAsync(args[index], (type, value) => {\n value = Typed.dereference(value, type);\n if (type === \"address\") {\n return resolveAddress(value, resolver);\n }\n return value;\n });\n }));\n}\nfunction buildWrappedFallback(contract) {\n const populateTransaction = async function (overrides) {\n // If an overrides was passed in, copy it and normalize the values\n const tx = (await copyOverrides(overrides, [\"data\"]));\n tx.to = await contract.getAddress();\n if (tx.from) {\n tx.from = await resolveAddress(tx.from, getResolver(contract.runner));\n }\n const iface = contract.interface;\n const noValue = (getBigInt((tx.value || BN_0), \"overrides.value\") === BN_0);\n const noData = ((tx.data || \"0x\") === \"0x\");\n if (iface.fallback && !iface.fallback.payable && iface.receive && !noData && !noValue) {\n assertArgument(false, \"cannot send data to receive or send value to non-payable fallback\", \"overrides\", overrides);\n }\n assertArgument(iface.fallback || noData, \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n // Only allow payable contracts to set non-zero value\n const payable = iface.receive || (iface.fallback && iface.fallback.payable);\n assertArgument(payable || noValue, \"cannot send value to non-payable fallback\", \"overrides.value\", tx.value);\n // Only allow fallback contracts to set non-empty data\n assertArgument(iface.fallback || noData, \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n return tx;\n };\n const staticCall = async function (overrides) {\n const runner = getRunner(contract.runner, \"call\");\n assert(canCall(runner), \"contract runner does not support calling\", \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n const tx = await populateTransaction(overrides);\n try {\n return await runner.call(tx);\n }\n catch (error) {\n if (isCallException(error) && error.data) {\n throw contract.interface.makeError(error.data, tx);\n }\n throw error;\n }\n };\n const send = async function (overrides) {\n const runner = contract.runner;\n assert(canSend(runner), \"contract runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n const tx = await runner.sendTransaction(await populateTransaction(overrides));\n const provider = getProvider(contract.runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n return new ContractTransactionResponse(contract.interface, provider, tx);\n };\n const estimateGas = async function (overrides) {\n const runner = getRunner(contract.runner, \"estimateGas\");\n assert(canEstimate(runner), \"contract runner does not support gas estimation\", \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n return await runner.estimateGas(await populateTransaction(overrides));\n };\n const method = async (overrides) => {\n return await send(overrides);\n };\n defineProperties(method, {\n _contract: contract,\n estimateGas,\n populateTransaction,\n send, staticCall\n });\n return method;\n}\nfunction buildWrappedMethod(contract, key) {\n const getFragment = function (...args) {\n const fragment = contract.interface.getFunction(key, args);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key, args }\n });\n return fragment;\n };\n const populateTransaction = async function (...args) {\n const fragment = getFragment(...args);\n // If an overrides was passed in, copy it and normalize the values\n let overrides = {};\n if (fragment.inputs.length + 1 === args.length) {\n overrides = await copyOverrides(args.pop());\n if (overrides.from) {\n overrides.from = await resolveAddress(overrides.from, getResolver(contract.runner));\n }\n }\n if (fragment.inputs.length !== args.length) {\n throw new Error(\"internal error: fragment inputs doesn't match arguments; should not happen\");\n }\n const resolvedArgs = await resolveArgs(contract.runner, fragment.inputs, args);\n return Object.assign({}, overrides, await resolveProperties({\n to: contract.getAddress(),\n data: contract.interface.encodeFunctionData(fragment, resolvedArgs)\n }));\n };\n const staticCall = async function (...args) {\n const result = await staticCallResult(...args);\n if (result.length === 1) {\n return result[0];\n }\n return result;\n };\n const send = async function (...args) {\n const runner = contract.runner;\n assert(canSend(runner), \"contract runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n const tx = await runner.sendTransaction(await populateTransaction(...args));\n const provider = getProvider(contract.runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n return new ContractTransactionResponse(contract.interface, provider, tx);\n };\n const estimateGas = async function (...args) {\n const runner = getRunner(contract.runner, \"estimateGas\");\n assert(canEstimate(runner), \"contract runner does not support gas estimation\", \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n return await runner.estimateGas(await populateTransaction(...args));\n };\n const staticCallResult = async function (...args) {\n const runner = getRunner(contract.runner, \"call\");\n assert(canCall(runner), \"contract runner does not support calling\", \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n const tx = await populateTransaction(...args);\n let result = \"0x\";\n try {\n result = await runner.call(tx);\n }\n catch (error) {\n if (isCallException(error) && error.data) {\n throw contract.interface.makeError(error.data, tx);\n }\n throw error;\n }\n const fragment = getFragment(...args);\n return contract.interface.decodeFunctionResult(fragment, result);\n };\n const method = async (...args) => {\n const fragment = getFragment(...args);\n if (fragment.constant) {\n return await staticCall(...args);\n }\n return await send(...args);\n };\n defineProperties(method, {\n name: contract.interface.getFunctionName(key),\n _contract: contract, _key: key,\n getFragment,\n estimateGas,\n populateTransaction,\n send, staticCall, staticCallResult,\n });\n // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n Object.defineProperty(method, \"fragment\", {\n configurable: false,\n enumerable: true,\n get: () => {\n const fragment = contract.interface.getFunction(key);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key }\n });\n return fragment;\n }\n });\n return method;\n}\nfunction buildWrappedEvent(contract, key) {\n const getFragment = function (...args) {\n const fragment = contract.interface.getEvent(key, args);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key, args }\n });\n return fragment;\n };\n const method = function (...args) {\n return new PreparedTopicFilter(contract, getFragment(...args), args);\n };\n defineProperties(method, {\n name: contract.interface.getEventName(key),\n _contract: contract, _key: key,\n getFragment\n });\n // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n Object.defineProperty(method, \"fragment\", {\n configurable: false,\n enumerable: true,\n get: () => {\n const fragment = contract.interface.getEvent(key);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key }\n });\n return fragment;\n }\n });\n return method;\n}\n// The combination of TypeScrype, Private Fields and Proxies makes\n// the world go boom; so we hide variables with some trickery keeping\n// a symbol attached to each BaseContract which its sub-class (even\n// via a Proxy) can reach and use to look up its internal values.\nconst internal = Symbol.for(\"_ethersInternal_contract\");\nconst internalValues = new WeakMap();\nfunction setInternal(contract, values) {\n internalValues.set(contract[internal], values);\n}\nfunction getInternal(contract) {\n return internalValues.get(contract[internal]);\n}\nfunction isDeferred(value) {\n return (value && typeof (value) === \"object\" && (\"getTopicFilter\" in value) &&\n (typeof (value.getTopicFilter) === \"function\") && value.fragment);\n}\nasync function getSubInfo(contract, event) {\n let topics;\n let fragment = null;\n // Convert named events to topicHash and get the fragment for\n // events which need deconstructing.\n if (Array.isArray(event)) {\n const topicHashify = function (name) {\n if (isHexString(name, 32)) {\n return name;\n }\n const fragment = contract.interface.getEvent(name);\n assertArgument(fragment, \"unknown fragment\", \"name\", name);\n return fragment.topicHash;\n };\n // Array of Topics and Names; e.g. `[ \"0x1234...89ab\", \"Transfer(address)\" ]`\n topics = event.map((e) => {\n if (e == null) {\n return null;\n }\n if (Array.isArray(e)) {\n return e.map(topicHashify);\n }\n return topicHashify(e);\n });\n }\n else if (event === \"*\") {\n topics = [null];\n }\n else if (typeof (event) === \"string\") {\n if (isHexString(event, 32)) {\n // Topic Hash\n topics = [event];\n }\n else {\n // Name or Signature; e.g. `\"Transfer\", `\"Transfer(address)\"`\n fragment = contract.interface.getEvent(event);\n assertArgument(fragment, \"unknown fragment\", \"event\", event);\n topics = [fragment.topicHash];\n }\n }\n else if (isDeferred(event)) {\n // Deferred Topic Filter; e.g. `contract.filter.Transfer(from)`\n topics = await event.getTopicFilter();\n }\n else if (\"fragment\" in event) {\n // ContractEvent; e.g. `contract.filter.Transfer`\n fragment = event.fragment;\n topics = [fragment.topicHash];\n }\n else {\n assertArgument(false, \"unknown event name\", \"event\", event);\n }\n // Normalize topics and sort TopicSets\n topics = topics.map((t) => {\n if (t == null) {\n return null;\n }\n if (Array.isArray(t)) {\n const items = Array.from(new Set(t.map((t) => t.toLowerCase())).values());\n if (items.length === 1) {\n return items[0];\n }\n items.sort();\n return items;\n }\n return t.toLowerCase();\n });\n const tag = topics.map((t) => {\n if (t == null) {\n return \"null\";\n }\n if (Array.isArray(t)) {\n return t.join(\"|\");\n }\n return t;\n }).join(\"&\");\n return { fragment, tag, topics };\n}\nasync function hasSub(contract, event) {\n const { subs } = getInternal(contract);\n return subs.get((await getSubInfo(contract, event)).tag) || null;\n}\nasync function getSub(contract, operation, event) {\n // Make sure our runner can actually subscribe to events\n const provider = getProvider(contract.runner);\n assert(provider, \"contract runner does not support subscribing\", \"UNSUPPORTED_OPERATION\", { operation });\n const { fragment, tag, topics } = await getSubInfo(contract, event);\n const { addr, subs } = getInternal(contract);\n let sub = subs.get(tag);\n if (!sub) {\n const address = (addr ? addr : contract);\n const filter = { address, topics };\n const listener = (log) => {\n let foundFragment = fragment;\n if (foundFragment == null) {\n try {\n foundFragment = contract.interface.getEvent(log.topics[0]);\n }\n catch (error) { }\n }\n // If fragment is null, we do not deconstruct the args to emit\n if (foundFragment) {\n const _foundFragment = foundFragment;\n const args = fragment ? contract.interface.decodeEventLog(fragment, log.data, log.topics) : [];\n emit(contract, event, args, (listener) => {\n return new ContractEventPayload(contract, listener, event, _foundFragment, log);\n });\n }\n else {\n emit(contract, event, [], (listener) => {\n return new ContractUnknownEventPayload(contract, listener, event, log);\n });\n }\n };\n let starting = [];\n const start = () => {\n if (starting.length) {\n return;\n }\n starting.push(provider.on(filter, listener));\n };\n const stop = async () => {\n if (starting.length == 0) {\n return;\n }\n let started = starting;\n starting = [];\n await Promise.all(started);\n provider.off(filter, listener);\n };\n sub = { tag, listeners: [], start, stop };\n subs.set(tag, sub);\n }\n return sub;\n}\n// We use this to ensure one emit resolves before firing the next to\n// ensure correct ordering (note this cannot throw and just adds the\n// notice to the event queu using setTimeout).\nlet lastEmit = Promise.resolve();\nasync function _emit(contract, event, args, payloadFunc) {\n await lastEmit;\n const sub = await hasSub(contract, event);\n if (!sub) {\n return false;\n }\n const count = sub.listeners.length;\n sub.listeners = sub.listeners.filter(({ listener, once }) => {\n const passArgs = Array.from(args);\n if (payloadFunc) {\n passArgs.push(payloadFunc(once ? null : listener));\n }\n try {\n listener.call(contract, ...passArgs);\n }\n catch (error) { }\n return !once;\n });\n if (sub.listeners.length === 0) {\n sub.stop();\n getInternal(contract).subs.delete(sub.tag);\n }\n return (count > 0);\n}\nasync function emit(contract, event, args, payloadFunc) {\n try {\n await lastEmit;\n }\n catch (error) { }\n const resultPromise = _emit(contract, event, args, payloadFunc);\n lastEmit = resultPromise;\n return await resultPromise;\n}\nconst passProperties = [\"then\"];\nexport class BaseContract {\n /**\n * The target to connect to.\n *\n * This can be an address, ENS name or any [[Addressable]], such as\n * another contract. To get the resovled address, use the ``getAddress``\n * method.\n */\n target;\n /**\n * The contract Interface.\n */\n interface;\n /**\n * The connected runner. This is generally a [[Provider]] or a\n * [[Signer]], which dictates what operations are supported.\n *\n * For example, a **Contract** connected to a [[Provider]] may\n * only execute read-only operations.\n */\n runner;\n /**\n * All the Events available on this contract.\n */\n filters;\n /**\n * @_ignore:\n */\n [internal];\n /**\n * The fallback or receive function if any.\n */\n fallback;\n /**\n * Creates a new contract connected to %%target%% with the %%abi%% and\n * optionally connected to a %%runner%% to perform operations on behalf\n * of.\n */\n constructor(target, abi, runner, _deployTx) {\n assertArgument(typeof (target) === \"string\" || isAddressable(target), \"invalid value for Contract target\", \"target\", target);\n if (runner == null) {\n runner = null;\n }\n const iface = Interface.from(abi);\n defineProperties(this, { target, runner, interface: iface });\n Object.defineProperty(this, internal, { value: {} });\n let addrPromise;\n let addr = null;\n let deployTx = null;\n if (_deployTx) {\n const provider = getProvider(runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n deployTx = new ContractTransactionResponse(this.interface, provider, _deployTx);\n }\n let subs = new Map();\n // Resolve the target as the address\n if (typeof (target) === \"string\") {\n if (isHexString(target)) {\n addr = target;\n addrPromise = Promise.resolve(target);\n }\n else {\n const resolver = getRunner(runner, \"resolveName\");\n if (!canResolve(resolver)) {\n throw makeError(\"contract runner does not support name resolution\", \"UNSUPPORTED_OPERATION\", {\n operation: \"resolveName\"\n });\n }\n addrPromise = resolver.resolveName(target).then((addr) => {\n if (addr == null) {\n throw makeError(\"an ENS name used for a contract target must be correctly configured\", \"UNCONFIGURED_NAME\", {\n value: target\n });\n }\n getInternal(this).addr = addr;\n return addr;\n });\n }\n }\n else {\n addrPromise = target.getAddress().then((addr) => {\n if (addr == null) {\n throw new Error(\"TODO\");\n }\n getInternal(this).addr = addr;\n return addr;\n });\n }\n // Set our private values\n setInternal(this, { addrPromise, addr, deployTx, subs });\n // Add the event filters\n const filters = new Proxy({}, {\n get: (target, prop, receiver) => {\n // Pass important checks (like `then` for Promise) through\n if (typeof (prop) === \"symbol\" || passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n try {\n return this.getEvent(prop);\n }\n catch (error) {\n if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n throw error;\n }\n }\n return undefined;\n },\n has: (target, prop) => {\n // Pass important checks (like `then` for Promise) through\n if (passProperties.indexOf(prop) >= 0) {\n return Reflect.has(target, prop);\n }\n return Reflect.has(target, prop) || this.interface.hasEvent(String(prop));\n }\n });\n defineProperties(this, { filters });\n defineProperties(this, {\n fallback: ((iface.receive || iface.fallback) ? (buildWrappedFallback(this)) : null)\n });\n // Return a Proxy that will respond to functions\n return new Proxy(this, {\n get: (target, prop, receiver) => {\n if (typeof (prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n // Undefined properties should return undefined\n try {\n return target.getFunction(prop);\n }\n catch (error) {\n if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n throw error;\n }\n }\n return undefined;\n },\n has: (target, prop) => {\n if (typeof (prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n return Reflect.has(target, prop);\n }\n return target.interface.hasFunction(prop);\n }\n });\n }\n /**\n * Return a new Contract instance with the same target and ABI, but\n * a different %%runner%%.\n */\n connect(runner) {\n return new BaseContract(this.target, this.interface, runner);\n }\n /**\n * Return a new Contract instance with the same ABI and runner, but\n * a different %%target%%.\n */\n attach(target) {\n return new BaseContract(target, this.interface, this.runner);\n }\n /**\n * Return the resolved address of this Contract.\n */\n async getAddress() { return await getInternal(this).addrPromise; }\n /**\n * Return the deployed bytecode or null if no bytecode is found.\n */\n async getDeployedCode() {\n const provider = getProvider(this.runner);\n assert(provider, \"runner does not support .provider\", \"UNSUPPORTED_OPERATION\", { operation: \"getDeployedCode\" });\n const code = await provider.getCode(await this.getAddress());\n if (code === \"0x\") {\n return null;\n }\n return code;\n }\n /**\n * Resolve to this Contract once the bytecode has been deployed, or\n * resolve immediately if already deployed.\n */\n async waitForDeployment() {\n // We have the deployement transaction; just use that (throws if deployement fails)\n const deployTx = this.deploymentTransaction();\n if (deployTx) {\n await deployTx.wait();\n return this;\n }\n // Check for code\n const code = await this.getDeployedCode();\n if (code != null) {\n return this;\n }\n // Make sure we can subscribe to a provider event\n const provider = getProvider(this.runner);\n assert(provider != null, \"contract runner does not support .provider\", \"UNSUPPORTED_OPERATION\", { operation: \"waitForDeployment\" });\n return new Promise((resolve, reject) => {\n const checkCode = async () => {\n try {\n const code = await this.getDeployedCode();\n if (code != null) {\n return resolve(this);\n }\n provider.once(\"block\", checkCode);\n }\n catch (error) {\n reject(error);\n }\n };\n checkCode();\n });\n }\n /**\n * Return the transaction used to deploy this contract.\n *\n * This is only available if this instance was returned from a\n * [[ContractFactory]].\n */\n deploymentTransaction() {\n return getInternal(this).deployTx;\n }\n /**\n * Return the function for a given name. This is useful when a contract\n * method name conflicts with a JavaScript name such as ``prototype`` or\n * when using a Contract programatically.\n */\n getFunction(key) {\n if (typeof (key) !== \"string\") {\n key = key.format();\n }\n const func = buildWrappedMethod(this, key);\n return func;\n }\n /**\n * Return the event for a given name. This is useful when a contract\n * event name conflicts with a JavaScript name such as ``prototype`` or\n * when using a Contract programatically.\n */\n getEvent(key) {\n if (typeof (key) !== \"string\") {\n key = key.format();\n }\n return buildWrappedEvent(this, key);\n }\n /**\n * @_ignore:\n */\n async queryTransaction(hash) {\n throw new Error(\"@TODO\");\n }\n /*\n // @TODO: this is a non-backwards compatible change, but will be added\n // in v7 and in a potential SmartContract class in an upcoming\n // v6 release\n async getTransactionReceipt(hash: string): Promise {\n const provider = getProvider(this.runner);\n assert(provider, \"contract runner does not have a provider\",\n \"UNSUPPORTED_OPERATION\", { operation: \"queryTransaction\" });\n\n const receipt = await provider.getTransactionReceipt(hash);\n if (receipt == null) { return null; }\n\n return new ContractTransactionReceipt(this.interface, provider, receipt);\n }\n */\n /**\n * Provide historic access to event data for %%event%% in the range\n * %%fromBlock%% (default: ``0``) to %%toBlock%% (default: ``\"latest\"``)\n * inclusive.\n */\n async queryFilter(event, fromBlock, toBlock) {\n if (fromBlock == null) {\n fromBlock = 0;\n }\n if (toBlock == null) {\n toBlock = \"latest\";\n }\n const { addr, addrPromise } = getInternal(this);\n const address = (addr ? addr : (await addrPromise));\n const { fragment, topics } = await getSubInfo(this, event);\n const filter = { address, topics, fromBlock, toBlock };\n const provider = getProvider(this.runner);\n assert(provider, \"contract runner does not have a provider\", \"UNSUPPORTED_OPERATION\", { operation: \"queryFilter\" });\n return (await provider.getLogs(filter)).map((log) => {\n let foundFragment = fragment;\n if (foundFragment == null) {\n try {\n foundFragment = this.interface.getEvent(log.topics[0]);\n }\n catch (error) { }\n }\n if (foundFragment) {\n try {\n return new EventLog(log, this.interface, foundFragment);\n }\n catch (error) {\n return new UndecodedEventLog(log, error);\n }\n }\n return new Log(log, provider);\n });\n }\n /**\n * Add an event %%listener%% for the %%event%%.\n */\n async on(event, listener) {\n const sub = await getSub(this, \"on\", event);\n sub.listeners.push({ listener, once: false });\n sub.start();\n return this;\n }\n /**\n * Add an event %%listener%% for the %%event%%, but remove the listener\n * after it is fired once.\n */\n async once(event, listener) {\n const sub = await getSub(this, \"once\", event);\n sub.listeners.push({ listener, once: true });\n sub.start();\n return this;\n }\n /**\n * Emit an %%event%% calling all listeners with %%args%%.\n *\n * Resolves to ``true`` if any listeners were called.\n */\n async emit(event, ...args) {\n return await emit(this, event, args, null);\n }\n /**\n * Resolves to the number of listeners of %%event%% or the total number\n * of listeners if unspecified.\n */\n async listenerCount(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return 0;\n }\n return sub.listeners.length;\n }\n const { subs } = getInternal(this);\n let total = 0;\n for (const { listeners } of subs.values()) {\n total += listeners.length;\n }\n return total;\n }\n /**\n * Resolves to the listeners subscribed to %%event%% or all listeners\n * if unspecified.\n */\n async listeners(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return [];\n }\n return sub.listeners.map(({ listener }) => listener);\n }\n const { subs } = getInternal(this);\n let result = [];\n for (const { listeners } of subs.values()) {\n result = result.concat(listeners.map(({ listener }) => listener));\n }\n return result;\n }\n /**\n * Remove the %%listener%% from the listeners for %%event%% or remove\n * all listeners if unspecified.\n */\n async off(event, listener) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return this;\n }\n if (listener) {\n const index = sub.listeners.map(({ listener }) => listener).indexOf(listener);\n if (index >= 0) {\n sub.listeners.splice(index, 1);\n }\n }\n if (listener == null || sub.listeners.length === 0) {\n sub.stop();\n getInternal(this).subs.delete(sub.tag);\n }\n return this;\n }\n /**\n * Remove all the listeners for %%event%% or remove all listeners if\n * unspecified.\n */\n async removeAllListeners(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return this;\n }\n sub.stop();\n getInternal(this).subs.delete(sub.tag);\n }\n else {\n const { subs } = getInternal(this);\n for (const { tag, stop } of subs.values()) {\n stop();\n subs.delete(tag);\n }\n }\n return this;\n }\n /**\n * Alias for [on].\n */\n async addListener(event, listener) {\n return await this.on(event, listener);\n }\n /**\n * Alias for [off].\n */\n async removeListener(event, listener) {\n return await this.off(event, listener);\n }\n /**\n * Create a new Class for the %%abi%%.\n */\n static buildClass(abi) {\n class CustomContract extends BaseContract {\n constructor(address, runner = null) {\n super(address, abi, runner);\n }\n }\n return CustomContract;\n }\n ;\n /**\n * Create a new BaseContract with a specified Interface.\n */\n static from(target, abi, runner) {\n if (runner == null) {\n runner = null;\n }\n const contract = new this(target, abi, runner);\n return contract;\n }\n}\nfunction _ContractBase() {\n return BaseContract;\n}\n/**\n * A [[BaseContract]] with no type guards on its methods or events.\n */\nexport class Contract extends _ContractBase() {\n}\n//# sourceMappingURL=contract.js.map","import { Interface } from \"../abi/index.js\";\nimport { getCreateAddress } from \"../address/index.js\";\nimport { concat, defineProperties, getBytes, hexlify, assert, assertArgument } from \"../utils/index.js\";\nimport { BaseContract, copyOverrides, resolveArgs } from \"./contract.js\";\n// A = Arguments to the constructor\n// I = Interface of deployed contracts\n/**\n * A **ContractFactory** is used to deploy a Contract to the blockchain.\n */\nexport class ContractFactory {\n /**\n * The Contract Interface.\n */\n interface;\n /**\n * The Contract deployment bytecode. Often called the initcode.\n */\n bytecode;\n /**\n * The ContractRunner to deploy the Contract as.\n */\n runner;\n /**\n * Create a new **ContractFactory** with %%abi%% and %%bytecode%%,\n * optionally connected to %%runner%%.\n *\n * The %%bytecode%% may be the ``bytecode`` property within the\n * standard Solidity JSON output.\n */\n constructor(abi, bytecode, runner) {\n const iface = Interface.from(abi);\n // Dereference Solidity bytecode objects and allow a missing `0x`-prefix\n if (bytecode instanceof Uint8Array) {\n bytecode = hexlify(getBytes(bytecode));\n }\n else {\n if (typeof (bytecode) === \"object\") {\n bytecode = bytecode.object;\n }\n if (!bytecode.startsWith(\"0x\")) {\n bytecode = \"0x\" + bytecode;\n }\n bytecode = hexlify(getBytes(bytecode));\n }\n defineProperties(this, {\n bytecode, interface: iface, runner: (runner || null)\n });\n }\n attach(target) {\n return new BaseContract(target, this.interface, this.runner);\n }\n /**\n * Resolves to the transaction to deploy the contract, passing %%args%%\n * into the constructor.\n */\n async getDeployTransaction(...args) {\n let overrides = {};\n const fragment = this.interface.deploy;\n if (fragment.inputs.length + 1 === args.length) {\n overrides = await copyOverrides(args.pop());\n }\n if (fragment.inputs.length !== args.length) {\n throw new Error(\"incorrect number of arguments to constructor\");\n }\n const resolvedArgs = await resolveArgs(this.runner, fragment.inputs, args);\n const data = concat([this.bytecode, this.interface.encodeDeploy(resolvedArgs)]);\n return Object.assign({}, overrides, { data });\n }\n /**\n * Resolves to the Contract deployed by passing %%args%% into the\n * constructor.\n *\n * This will resolve to the Contract before it has been deployed to the\n * network, so the [[BaseContract-waitForDeployment]] should be used before\n * sending any transactions to it.\n */\n async deploy(...args) {\n const tx = await this.getDeployTransaction(...args);\n assert(this.runner && typeof (this.runner.sendTransaction) === \"function\", \"factory runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", {\n operation: \"sendTransaction\"\n });\n const sentTx = await this.runner.sendTransaction(tx);\n const address = getCreateAddress(sentTx);\n return new BaseContract(address, this.interface, this.runner, sentTx);\n }\n /**\n * Return a new **ContractFactory** with the same ABI and bytecode,\n * but connected to %%runner%%.\n */\n connect(runner) {\n return new ContractFactory(this.interface, this.bytecode, runner);\n }\n /**\n * Create a new **ContractFactory** from the standard Solidity JSON output.\n */\n static fromSolidity(output, runner) {\n assertArgument(output != null, \"bad compiler output\", \"output\", output);\n if (typeof (output) === \"string\") {\n output = JSON.parse(output);\n }\n const abi = output.abi;\n let bytecode = \"\";\n if (output.bytecode) {\n bytecode = output.bytecode;\n }\n else if (output.evm && output.evm.bytecode) {\n bytecode = output.evm.bytecode;\n }\n return new this(abi, bytecode, runner);\n }\n}\n//# sourceMappingURL=factory.js.map","/**\n * ENS is a service which allows easy-to-remember names to map to\n * network addresses.\n *\n * @_section: api/providers/ens-resolver:ENS Resolver [about-ens-rsolver]\n */\nimport { getAddress } from \"../address/index.js\";\nimport { ZeroAddress } from \"../constants/index.js\";\nimport { Contract } from \"../contract/index.js\";\nimport { dnsEncode, namehash } from \"../hash/index.js\";\nimport { hexlify, isHexString, toBeHex, defineProperties, encodeBase58, assert, assertArgument, isError, FetchRequest } from \"../utils/index.js\";\n// @TODO: This should use the fetch-data:ipfs gateway\n// Trim off the ipfs:// prefix and return the default gateway URL\nfunction getIpfsLink(link) {\n if (link.match(/^ipfs:\\/\\/ipfs\\//i)) {\n link = link.substring(12);\n }\n else if (link.match(/^ipfs:\\/\\//i)) {\n link = link.substring(7);\n }\n else {\n assertArgument(false, \"unsupported IPFS format\", \"link\", link);\n }\n return `https:/\\/gateway.ipfs.io/ipfs/${link}`;\n}\n;\n;\n/**\n * A provider plugin super-class for processing multicoin address types.\n */\nexport class MulticoinProviderPlugin {\n /**\n * The name.\n */\n name;\n /**\n * Creates a new **MulticoinProviderPluing** for %%name%%.\n */\n constructor(name) {\n defineProperties(this, { name });\n }\n connect(proivder) {\n return this;\n }\n /**\n * Returns ``true`` if %%coinType%% is supported by this plugin.\n */\n supportsCoinType(coinType) {\n return false;\n }\n /**\n * Resolves to the encoded %%address%% for %%coinType%%.\n */\n async encodeAddress(coinType, address) {\n throw new Error(\"unsupported coin\");\n }\n /**\n * Resolves to the decoded %%data%% for %%coinType%%.\n */\n async decodeAddress(coinType, data) {\n throw new Error(\"unsupported coin\");\n }\n}\nconst BasicMulticoinPluginId = \"org.ethers.plugins.provider.BasicMulticoin\";\n/**\n * A **BasicMulticoinProviderPlugin** provides service for common\n * coin types, which do not require additional libraries to encode or\n * decode.\n */\nexport class BasicMulticoinProviderPlugin extends MulticoinProviderPlugin {\n /**\n * Creates a new **BasicMulticoinProviderPlugin**.\n */\n constructor() {\n super(BasicMulticoinPluginId);\n }\n}\nconst matcherIpfs = new RegExp(\"^(ipfs):/\\/(.*)$\", \"i\");\nconst matchers = [\n new RegExp(\"^(https):/\\/(.*)$\", \"i\"),\n new RegExp(\"^(data):(.*)$\", \"i\"),\n matcherIpfs,\n new RegExp(\"^eip155:[0-9]+/(erc[0-9]+):(.*)$\", \"i\"),\n];\n/**\n * A connected object to a resolved ENS name resolver, which can be\n * used to query additional details.\n */\nexport class EnsResolver {\n /**\n * The connected provider.\n */\n provider;\n /**\n * The address of the resolver.\n */\n address;\n /**\n * The name this resolver was resolved against.\n */\n name;\n // For EIP-2544 names, the ancestor that provided the resolver\n #supports2544;\n #resolver;\n constructor(provider, address, name) {\n defineProperties(this, { provider, address, name });\n this.#supports2544 = null;\n this.#resolver = new Contract(address, [\n \"function supportsInterface(bytes4) view returns (bool)\",\n \"function resolve(bytes, bytes) view returns (bytes)\",\n \"function addr(bytes32) view returns (address)\",\n \"function addr(bytes32, uint) view returns (bytes)\",\n \"function text(bytes32, string) view returns (string)\",\n \"function contenthash(bytes32) view returns (bytes)\",\n ], provider);\n }\n /**\n * Resolves to true if the resolver supports wildcard resolution.\n */\n async supportsWildcard() {\n if (this.#supports2544 == null) {\n this.#supports2544 = (async () => {\n try {\n return await this.#resolver.supportsInterface(\"0x9061b923\");\n }\n catch (error) {\n // Wildcard resolvers must understand supportsInterface\n // and return true.\n if (isError(error, \"CALL_EXCEPTION\")) {\n return false;\n }\n // Let future attempts try again...\n this.#supports2544 = null;\n throw error;\n }\n })();\n }\n return await this.#supports2544;\n }\n async #fetch(funcName, params) {\n params = (params || []).slice();\n const iface = this.#resolver.interface;\n // The first parameters is always the nodehash\n params.unshift(namehash(this.name));\n let fragment = null;\n if (await this.supportsWildcard()) {\n fragment = iface.getFunction(funcName);\n assert(fragment, \"missing fragment\", \"UNKNOWN_ERROR\", {\n info: { funcName }\n });\n params = [\n dnsEncode(this.name, 255),\n iface.encodeFunctionData(fragment, params)\n ];\n funcName = \"resolve(bytes,bytes)\";\n }\n params.push({\n enableCcipRead: true\n });\n try {\n const result = await this.#resolver[funcName](...params);\n if (fragment) {\n return iface.decodeFunctionResult(fragment, result)[0];\n }\n return result;\n }\n catch (error) {\n if (!isError(error, \"CALL_EXCEPTION\")) {\n throw error;\n }\n }\n return null;\n }\n /**\n * Resolves to the address for %%coinType%% or null if the\n * provided %%coinType%% has not been configured.\n */\n async getAddress(coinType) {\n if (coinType == null) {\n coinType = 60;\n }\n if (coinType === 60) {\n try {\n const result = await this.#fetch(\"addr(bytes32)\");\n // No address\n if (result == null || result === ZeroAddress) {\n return null;\n }\n return result;\n }\n catch (error) {\n if (isError(error, \"CALL_EXCEPTION\")) {\n return null;\n }\n throw error;\n }\n }\n // Try decoding its EVM canonical chain as an EVM chain address first\n if (coinType >= 0 && coinType < 0x80000000) {\n let ethCoinType = coinType + 0x80000000;\n const data = await this.#fetch(\"addr(bytes32,uint)\", [ethCoinType]);\n if (isHexString(data, 20)) {\n return getAddress(data);\n }\n }\n let coinPlugin = null;\n for (const plugin of this.provider.plugins) {\n if (!(plugin instanceof MulticoinProviderPlugin)) {\n continue;\n }\n if (plugin.supportsCoinType(coinType)) {\n coinPlugin = plugin;\n break;\n }\n }\n if (coinPlugin == null) {\n return null;\n }\n // keccak256(\"addr(bytes32,uint256\")\n const data = await this.#fetch(\"addr(bytes32,uint)\", [coinType]);\n // No address\n if (data == null || data === \"0x\") {\n return null;\n }\n // Compute the address\n const address = await coinPlugin.decodeAddress(coinType, data);\n if (address != null) {\n return address;\n }\n assert(false, `invalid coin data`, \"UNSUPPORTED_OPERATION\", {\n operation: `getAddress(${coinType})`,\n info: { coinType, data }\n });\n }\n /**\n * Resolves to the EIP-634 text record for %%key%%, or ``null``\n * if unconfigured.\n */\n async getText(key) {\n const data = await this.#fetch(\"text(bytes32,string)\", [key]);\n if (data == null || data === \"0x\") {\n return null;\n }\n return data;\n }\n /**\n * Rsolves to the content-hash or ``null`` if unconfigured.\n */\n async getContentHash() {\n // keccak256(\"contenthash()\")\n const data = await this.#fetch(\"contenthash(bytes32)\");\n // No contenthash\n if (data == null || data === \"0x\") {\n return null;\n }\n // IPFS (CID: 1, Type: 70=DAG-PB, 72=libp2p-key)\n const ipfs = data.match(/^0x(e3010170|e5010172)(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);\n if (ipfs) {\n const scheme = (ipfs[1] === \"e3010170\") ? \"ipfs\" : \"ipns\";\n const length = parseInt(ipfs[4], 16);\n if (ipfs[5].length === length * 2) {\n return `${scheme}:/\\/${encodeBase58(\"0x\" + ipfs[2])}`;\n }\n }\n // Swarm (CID: 1, Type: swarm-manifest; hash/length hard-coded to keccak256/32)\n const swarm = data.match(/^0xe40101fa011b20([0-9a-f]*)$/);\n if (swarm && swarm[1].length === 64) {\n return `bzz:/\\/${swarm[1]}`;\n }\n assert(false, `invalid or unsupported content hash data`, \"UNSUPPORTED_OPERATION\", {\n operation: \"getContentHash()\",\n info: { data }\n });\n }\n /**\n * Resolves to the avatar url or ``null`` if the avatar is either\n * unconfigured or incorrectly configured (e.g. references an NFT\n * not owned by the address).\n *\n * If diagnosing issues with configurations, the [[_getAvatar]]\n * method may be useful.\n */\n async getAvatar() {\n const avatar = await this._getAvatar();\n return avatar.url;\n }\n /**\n * When resolving an avatar, there are many steps involved, such\n * fetching metadata and possibly validating ownership of an\n * NFT.\n *\n * This method can be used to examine each step and the value it\n * was working from.\n */\n async _getAvatar() {\n const linkage = [{ type: \"name\", value: this.name }];\n try {\n // test data for ricmoo.eth\n //const avatar = \"eip155:1/erc721:0x265385c7f4132228A0d54EB1A9e7460b91c0cC68/29233\";\n const avatar = await this.getText(\"avatar\");\n if (avatar == null) {\n linkage.push({ type: \"!avatar\", value: \"\" });\n return { url: null, linkage };\n }\n linkage.push({ type: \"avatar\", value: avatar });\n for (let i = 0; i < matchers.length; i++) {\n const match = avatar.match(matchers[i]);\n if (match == null) {\n continue;\n }\n const scheme = match[1].toLowerCase();\n switch (scheme) {\n case \"https\":\n case \"data\":\n linkage.push({ type: \"url\", value: avatar });\n return { linkage, url: avatar };\n case \"ipfs\": {\n const url = getIpfsLink(avatar);\n linkage.push({ type: \"ipfs\", value: avatar });\n linkage.push({ type: \"url\", value: url });\n return { linkage, url };\n }\n case \"erc721\":\n case \"erc1155\": {\n // Depending on the ERC type, use tokenURI(uint256) or url(uint256)\n const selector = (scheme === \"erc721\") ? \"tokenURI(uint256)\" : \"uri(uint256)\";\n linkage.push({ type: scheme, value: avatar });\n // The owner of this name\n const owner = await this.getAddress();\n if (owner == null) {\n linkage.push({ type: \"!owner\", value: \"\" });\n return { url: null, linkage };\n }\n const comps = (match[2] || \"\").split(\"/\");\n if (comps.length !== 2) {\n linkage.push({ type: `!${scheme}caip`, value: (match[2] || \"\") });\n return { url: null, linkage };\n }\n const tokenId = comps[1];\n const contract = new Contract(comps[0], [\n // ERC-721\n \"function tokenURI(uint) view returns (string)\",\n \"function ownerOf(uint) view returns (address)\",\n // ERC-1155\n \"function uri(uint) view returns (string)\",\n \"function balanceOf(address, uint256) view returns (uint)\"\n ], this.provider);\n // Check that this account owns the token\n if (scheme === \"erc721\") {\n const tokenOwner = await contract.ownerOf(tokenId);\n if (owner !== tokenOwner) {\n linkage.push({ type: \"!owner\", value: tokenOwner });\n return { url: null, linkage };\n }\n linkage.push({ type: \"owner\", value: tokenOwner });\n }\n else if (scheme === \"erc1155\") {\n const balance = await contract.balanceOf(owner, tokenId);\n if (!balance) {\n linkage.push({ type: \"!balance\", value: \"0\" });\n return { url: null, linkage };\n }\n linkage.push({ type: \"balance\", value: balance.toString() });\n }\n // Call the token contract for the metadata URL\n let metadataUrl = await contract[selector](tokenId);\n if (metadataUrl == null || metadataUrl === \"0x\") {\n linkage.push({ type: \"!metadata-url\", value: \"\" });\n return { url: null, linkage };\n }\n linkage.push({ type: \"metadata-url-base\", value: metadataUrl });\n // ERC-1155 allows a generic {id} in the URL\n if (scheme === \"erc1155\") {\n metadataUrl = metadataUrl.replace(\"{id}\", toBeHex(tokenId, 32).substring(2));\n linkage.push({ type: \"metadata-url-expanded\", value: metadataUrl });\n }\n // Transform IPFS metadata links\n if (metadataUrl.match(/^ipfs:/i)) {\n metadataUrl = getIpfsLink(metadataUrl);\n }\n linkage.push({ type: \"metadata-url\", value: metadataUrl });\n // Get the token metadata\n let metadata = {};\n const response = await (new FetchRequest(metadataUrl)).send();\n response.assertOk();\n try {\n metadata = response.bodyJson;\n }\n catch (error) {\n try {\n linkage.push({ type: \"!metadata\", value: response.bodyText });\n }\n catch (error) {\n const bytes = response.body;\n if (bytes) {\n linkage.push({ type: \"!metadata\", value: hexlify(bytes) });\n }\n return { url: null, linkage };\n }\n return { url: null, linkage };\n }\n if (!metadata) {\n linkage.push({ type: \"!metadata\", value: \"\" });\n return { url: null, linkage };\n }\n linkage.push({ type: \"metadata\", value: JSON.stringify(metadata) });\n // Pull the image URL out\n let imageUrl = metadata.image;\n if (typeof (imageUrl) !== \"string\") {\n linkage.push({ type: \"!imageUrl\", value: \"\" });\n return { url: null, linkage };\n }\n if (imageUrl.match(/^(https:\\/\\/|data:)/i)) {\n // Allow\n }\n else {\n // Transform IPFS link to gateway\n const ipfs = imageUrl.match(matcherIpfs);\n if (ipfs == null) {\n linkage.push({ type: \"!imageUrl-ipfs\", value: imageUrl });\n return { url: null, linkage };\n }\n linkage.push({ type: \"imageUrl-ipfs\", value: imageUrl });\n imageUrl = getIpfsLink(imageUrl);\n }\n linkage.push({ type: \"url\", value: imageUrl });\n return { linkage, url: imageUrl };\n }\n }\n }\n }\n catch (error) { }\n return { linkage, url: null };\n }\n static async getEnsAddress(provider) {\n const network = await provider.getNetwork();\n const ensPlugin = network.getPlugin(\"org.ethers.plugins.network.Ens\");\n // No ENS...\n assert(ensPlugin, \"network does not support ENS\", \"UNSUPPORTED_OPERATION\", {\n operation: \"getEnsAddress\", info: { network }\n });\n return ensPlugin.address;\n }\n static async #getResolver(provider, name) {\n const ensAddr = await EnsResolver.getEnsAddress(provider);\n try {\n const contract = new Contract(ensAddr, [\n \"function resolver(bytes32) view returns (address)\"\n ], provider);\n const addr = await contract.resolver(namehash(name), {\n enableCcipRead: true\n });\n if (addr === ZeroAddress) {\n return null;\n }\n return addr;\n }\n catch (error) {\n // ENS registry cannot throw errors on resolver(bytes32),\n // so probably a link error\n throw error;\n }\n return null;\n }\n /**\n * Resolve to the ENS resolver for %%name%% using %%provider%% or\n * ``null`` if unconfigured.\n */\n static async fromName(provider, name) {\n let currentName = name;\n while (true) {\n if (currentName === \"\" || currentName === \".\") {\n return null;\n }\n // Optimization since the eth node cannot change and does\n // not have a wildcard resolver\n if (name !== \"eth\" && currentName === \"eth\") {\n return null;\n }\n // Check the current node for a resolver\n const addr = await EnsResolver.#getResolver(provider, currentName);\n // Found a resolver!\n if (addr != null) {\n const resolver = new EnsResolver(provider, addr, name);\n // Legacy resolver found, using EIP-2544 so it isn't safe to use\n if (currentName !== name && !(await resolver.supportsWildcard())) {\n return null;\n }\n return resolver;\n }\n // Get the parent node\n currentName = currentName.split(\".\").slice(1).join(\".\");\n }\n }\n}\n//# sourceMappingURL=ens-resolver.js.map","/**\n * @_ignore\n */\nimport { getAddress, getCreateAddress } from \"../address/index.js\";\nimport { Signature } from \"../crypto/index.js\";\nimport { accessListify } from \"../transaction/index.js\";\nimport { getBigInt, getNumber, hexlify, isHexString, zeroPadValue, assert, assertArgument } from \"../utils/index.js\";\nconst BN_0 = BigInt(0);\nexport function allowNull(format, nullValue) {\n return (function (value) {\n if (value == null) {\n return nullValue;\n }\n return format(value);\n });\n}\nexport function arrayOf(format, allowNull) {\n return ((array) => {\n if (allowNull && array == null) {\n return null;\n }\n if (!Array.isArray(array)) {\n throw new Error(\"not an array\");\n }\n return array.map((i) => format(i));\n });\n}\n// Requires an object which matches a fleet of other formatters\n// Any FormatFunc may return `undefined` to have the value omitted\n// from the result object. Calls preserve `this`.\nexport function object(format, altNames) {\n return ((value) => {\n const result = {};\n for (const key in format) {\n let srcKey = key;\n if (altNames && key in altNames && !(srcKey in value)) {\n for (const altKey of altNames[key]) {\n if (altKey in value) {\n srcKey = altKey;\n break;\n }\n }\n }\n try {\n const nv = format[key](value[srcKey]);\n if (nv !== undefined) {\n result[key] = nv;\n }\n }\n catch (error) {\n const message = (error instanceof Error) ? error.message : \"not-an-error\";\n assert(false, `invalid value for value.${key} (${message})`, \"BAD_DATA\", { value });\n }\n }\n return result;\n });\n}\nexport function formatBoolean(value) {\n switch (value) {\n case true:\n case \"true\":\n return true;\n case false:\n case \"false\":\n return false;\n }\n assertArgument(false, `invalid boolean; ${JSON.stringify(value)}`, \"value\", value);\n}\nexport function formatData(value) {\n assertArgument(isHexString(value, true), \"invalid data\", \"value\", value);\n return value;\n}\nexport function formatHash(value) {\n assertArgument(isHexString(value, 32), \"invalid hash\", \"value\", value);\n return value;\n}\nexport function formatUint256(value) {\n if (!isHexString(value)) {\n throw new Error(\"invalid uint256\");\n }\n return zeroPadValue(value, 32);\n}\nconst _formatLog = object({\n address: getAddress,\n blockHash: formatHash,\n blockNumber: getNumber,\n data: formatData,\n index: getNumber,\n removed: allowNull(formatBoolean, false),\n topics: arrayOf(formatHash),\n transactionHash: formatHash,\n transactionIndex: getNumber,\n}, {\n index: [\"logIndex\"]\n});\nexport function formatLog(value) {\n return _formatLog(value);\n}\nconst _formatBlock = object({\n hash: allowNull(formatHash),\n parentHash: formatHash,\n parentBeaconBlockRoot: allowNull(formatHash, null),\n number: getNumber,\n timestamp: getNumber,\n nonce: allowNull(formatData),\n difficulty: getBigInt,\n gasLimit: getBigInt,\n gasUsed: getBigInt,\n stateRoot: allowNull(formatHash, null),\n receiptsRoot: allowNull(formatHash, null),\n blobGasUsed: allowNull(getBigInt, null),\n excessBlobGas: allowNull(getBigInt, null),\n miner: allowNull(getAddress),\n prevRandao: allowNull(formatHash, null),\n extraData: formatData,\n baseFeePerGas: allowNull(getBigInt)\n}, {\n prevRandao: [\"mixHash\"]\n});\nexport function formatBlock(value) {\n const result = _formatBlock(value);\n result.transactions = value.transactions.map((tx) => {\n if (typeof (tx) === \"string\") {\n return tx;\n }\n return formatTransactionResponse(tx);\n });\n return result;\n}\nconst _formatReceiptLog = object({\n transactionIndex: getNumber,\n blockNumber: getNumber,\n transactionHash: formatHash,\n address: getAddress,\n topics: arrayOf(formatHash),\n data: formatData,\n index: getNumber,\n blockHash: formatHash,\n}, {\n index: [\"logIndex\"]\n});\nexport function formatReceiptLog(value) {\n return _formatReceiptLog(value);\n}\nconst _formatTransactionReceipt = object({\n to: allowNull(getAddress, null),\n from: allowNull(getAddress, null),\n contractAddress: allowNull(getAddress, null),\n // should be allowNull(hash), but broken-EIP-658 support is handled in receipt\n index: getNumber,\n root: allowNull(hexlify),\n gasUsed: getBigInt,\n blobGasUsed: allowNull(getBigInt, null),\n logsBloom: allowNull(formatData),\n blockHash: formatHash,\n hash: formatHash,\n logs: arrayOf(formatReceiptLog),\n blockNumber: getNumber,\n //confirmations: allowNull(getNumber, null),\n cumulativeGasUsed: getBigInt,\n effectiveGasPrice: allowNull(getBigInt),\n blobGasPrice: allowNull(getBigInt, null),\n status: allowNull(getNumber),\n type: allowNull(getNumber, 0)\n}, {\n effectiveGasPrice: [\"gasPrice\"],\n hash: [\"transactionHash\"],\n index: [\"transactionIndex\"],\n});\nexport function formatTransactionReceipt(value) {\n return _formatTransactionReceipt(value);\n}\nexport function formatTransactionResponse(value) {\n // Some clients (TestRPC) do strange things like return 0x0 for the\n // 0 address; correct this to be a real address\n if (value.to && getBigInt(value.to) === BN_0) {\n value.to = \"0x0000000000000000000000000000000000000000\";\n }\n const result = object({\n hash: formatHash,\n // Some nodes do not return this, usually test nodes (like Ganache)\n index: allowNull(getNumber, undefined),\n type: (value) => {\n if (value === \"0x\" || value == null) {\n return 0;\n }\n return getNumber(value);\n },\n accessList: allowNull(accessListify, null),\n blobVersionedHashes: allowNull(arrayOf(formatHash, true), null),\n authorizationList: allowNull(arrayOf((v) => {\n let sig;\n if (v.signature) {\n sig = v.signature;\n }\n else {\n let yParity = v.yParity;\n if (yParity === \"0x1b\") {\n yParity = 0;\n }\n else if (yParity === \"0x1c\") {\n yParity = 1;\n }\n sig = Object.assign({}, v, { yParity });\n }\n return {\n address: getAddress(v.address),\n chainId: getBigInt(v.chainId),\n nonce: getBigInt(v.nonce),\n signature: Signature.from(sig)\n };\n }, false), null),\n blockHash: allowNull(formatHash, null),\n blockNumber: allowNull(getNumber, null),\n transactionIndex: allowNull(getNumber, null),\n from: getAddress,\n // either (gasPrice) or (maxPriorityFeePerGas + maxFeePerGas) must be set\n gasPrice: allowNull(getBigInt),\n maxPriorityFeePerGas: allowNull(getBigInt),\n maxFeePerGas: allowNull(getBigInt),\n maxFeePerBlobGas: allowNull(getBigInt, null),\n gasLimit: getBigInt,\n to: allowNull(getAddress, null),\n value: getBigInt,\n nonce: getNumber,\n data: formatData,\n creates: allowNull(getAddress, null),\n chainId: allowNull(getBigInt, null)\n }, {\n data: [\"input\"],\n gasLimit: [\"gas\"],\n index: [\"transactionIndex\"]\n })(value);\n // If to and creates are empty, populate the creates from the value\n if (result.to == null && result.creates == null) {\n result.creates = getCreateAddress(result);\n }\n // @TODO: Check fee data\n // Add an access list to supported transaction types\n if ((value.type === 1 || value.type === 2) && value.accessList == null) {\n result.accessList = [];\n }\n // Compute the signature\n if (value.signature) {\n result.signature = Signature.from(value.signature);\n }\n else {\n result.signature = Signature.from(value);\n }\n // Some backends omit ChainId on legacy transactions, but we can compute it\n if (result.chainId == null) {\n const chainId = result.signature.legacyChainId;\n if (chainId != null) {\n result.chainId = chainId;\n }\n }\n // @TODO: check chainID\n /*\n if (value.chainId != null) {\n let chainId = value.chainId;\n\n if (isHexString(chainId)) {\n chainId = BigNumber.from(chainId).toNumber();\n }\n\n result.chainId = chainId;\n\n } else {\n let chainId = value.networkId;\n\n // geth-etc returns chainId\n if (chainId == null && result.v == null) {\n chainId = value.chainId;\n }\n\n if (isHexString(chainId)) {\n chainId = BigNumber.from(chainId).toNumber();\n }\n\n if (typeof(chainId) !== \"number\" && result.v != null) {\n chainId = (result.v - 35) / 2;\n if (chainId < 0) { chainId = 0; }\n chainId = parseInt(chainId);\n }\n\n if (typeof(chainId) !== \"number\") { chainId = 0; }\n\n result.chainId = chainId;\n }\n */\n // 0x0000... should actually be null\n if (result.blockHash && getBigInt(result.blockHash) === BN_0) {\n result.blockHash = null;\n }\n return result;\n}\n//# sourceMappingURL=format.js.map","import { defineProperties } from \"../utils/properties.js\";\nimport { assertArgument } from \"../utils/index.js\";\nconst EnsAddress = \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\";\n/**\n * A **NetworkPlugin** provides additional functionality on a [[Network]].\n */\nexport class NetworkPlugin {\n /**\n * The name of the plugin.\n *\n * It is recommended to use reverse-domain-notation, which permits\n * unique names with a known authority as well as hierarchal entries.\n */\n name;\n /**\n * Creates a new **NetworkPlugin**.\n */\n constructor(name) {\n defineProperties(this, { name });\n }\n /**\n * Creates a copy of this plugin.\n */\n clone() {\n return new NetworkPlugin(this.name);\n }\n}\n/**\n * A **GasCostPlugin** allows a network to provide alternative values when\n * computing the intrinsic gas required for a transaction.\n */\nexport class GasCostPlugin extends NetworkPlugin {\n /**\n * The block number to treat these values as valid from.\n *\n * This allows a hardfork to have updated values included as well as\n * mulutiple hardforks to be supported.\n */\n effectiveBlock;\n /**\n * The transactions base fee.\n */\n txBase;\n /**\n * The fee for creating a new account.\n */\n txCreate;\n /**\n * The fee per zero-byte in the data.\n */\n txDataZero;\n /**\n * The fee per non-zero-byte in the data.\n */\n txDataNonzero;\n /**\n * The fee per storage key in the [[link-eip-2930]] access list.\n */\n txAccessListStorageKey;\n /**\n * The fee per address in the [[link-eip-2930]] access list.\n */\n txAccessListAddress;\n /**\n * Creates a new GasCostPlugin from %%effectiveBlock%% until the\n * latest block or another GasCostPlugin supercedes that block number,\n * with the associated %%costs%%.\n */\n constructor(effectiveBlock, costs) {\n if (effectiveBlock == null) {\n effectiveBlock = 0;\n }\n super(`org.ethers.network.plugins.GasCost#${(effectiveBlock || 0)}`);\n const props = { effectiveBlock };\n function set(name, nullish) {\n let value = (costs || {})[name];\n if (value == null) {\n value = nullish;\n }\n assertArgument(typeof (value) === \"number\", `invalud value for ${name}`, \"costs\", costs);\n props[name] = value;\n }\n set(\"txBase\", 21000);\n set(\"txCreate\", 32000);\n set(\"txDataZero\", 4);\n set(\"txDataNonzero\", 16);\n set(\"txAccessListStorageKey\", 1900);\n set(\"txAccessListAddress\", 2400);\n defineProperties(this, props);\n }\n clone() {\n return new GasCostPlugin(this.effectiveBlock, this);\n }\n}\n/**\n * An **EnsPlugin** allows a [[Network]] to specify the ENS Registry\n * Contract address and the target network to use when using that\n * contract.\n *\n * Various testnets have their own instance of the contract to use, but\n * in general, the mainnet instance supports multi-chain addresses and\n * should be used.\n */\nexport class EnsPlugin extends NetworkPlugin {\n /**\n * The ENS Registrty Contract address.\n */\n address;\n /**\n * The chain ID that the ENS contract lives on.\n */\n targetNetwork;\n /**\n * Creates a new **EnsPlugin** connected to %%address%% on the\n * %%targetNetwork%%. The default ENS address and mainnet is used\n * if unspecified.\n */\n constructor(address, targetNetwork) {\n super(\"org.ethers.plugins.network.Ens\");\n defineProperties(this, {\n address: (address || EnsAddress),\n targetNetwork: ((targetNetwork == null) ? 1 : targetNetwork)\n });\n }\n clone() {\n return new EnsPlugin(this.address, this.targetNetwork);\n }\n}\n/**\n * A **FeeDataNetworkPlugin** allows a network to provide and alternate\n * means to specify its fee data.\n *\n * For example, a network which does not support [[link-eip-1559]] may\n * choose to use a Gas Station site to approximate the gas price.\n */\nexport class FeeDataNetworkPlugin extends NetworkPlugin {\n #feeDataFunc;\n /**\n * The fee data function provided to the constructor.\n */\n get feeDataFunc() {\n return this.#feeDataFunc;\n }\n /**\n * Creates a new **FeeDataNetworkPlugin**.\n */\n constructor(feeDataFunc) {\n super(\"org.ethers.plugins.network.FeeData\");\n this.#feeDataFunc = feeDataFunc;\n }\n /**\n * Resolves to the fee data.\n */\n async getFeeData(provider) {\n return await this.#feeDataFunc(provider);\n }\n clone() {\n return new FeeDataNetworkPlugin(this.#feeDataFunc);\n }\n}\nexport class FetchUrlFeeDataNetworkPlugin extends NetworkPlugin {\n #url;\n #processFunc;\n /**\n * The URL to initialize the FetchRequest with in %%processFunc%%.\n */\n get url() { return this.#url; }\n /**\n * The callback to use when computing the FeeData.\n */\n get processFunc() { return this.#processFunc; }\n /**\n * Creates a new **FetchUrlFeeDataNetworkPlugin** which will\n * be used when computing the fee data for the network.\n */\n constructor(url, processFunc) {\n super(\"org.ethers.plugins.network.FetchUrlFeeDataPlugin\");\n this.#url = url;\n this.#processFunc = processFunc;\n }\n // We are immutable, so we can serve as our own clone\n clone() { return this; }\n}\n/*\nexport class CustomBlockNetworkPlugin extends NetworkPlugin {\n readonly #blockFunc: (provider: Provider, block: BlockParams) => Block;\n readonly #blockWithTxsFunc: (provider: Provider, block: BlockParams) => Block;\n\n constructor(blockFunc: (provider: Provider, block: BlockParams) => Block, blockWithTxsFunc: (provider: Provider, block: BlockParams) => Block) {\n super(\"org.ethers.network-plugins.custom-block\");\n this.#blockFunc = blockFunc;\n this.#blockWithTxsFunc = blockWithTxsFunc;\n }\n\n async getBlock(provider: Provider, block: BlockParams): Promise> {\n return await this.#blockFunc(provider, block);\n }\n\n async getBlockions(provider: Provider, block: BlockParams): Promise> {\n return await this.#blockWithTxsFunc(provider, block);\n }\n\n clone(): CustomBlockNetworkPlugin {\n return new CustomBlockNetworkPlugin(this.#blockFunc, this.#blockWithTxsFunc);\n }\n}\n*/\n//# sourceMappingURL=plugins-network.js.map","/**\n * A **Network** encapsulates the various properties required to\n * interact with a specific chain.\n *\n * @_subsection: api/providers:Networks [networks]\n */\nimport { accessListify } from \"../transaction/index.js\";\nimport { getBigInt, assert, assertArgument } from \"../utils/index.js\";\nimport { EnsPlugin, FetchUrlFeeDataNetworkPlugin, GasCostPlugin } from \"./plugins-network.js\";\n/* * * *\n// Networks which operation against an L2 can use this plugin to\n// specify how to access L1, for the purpose of resolving ENS,\n// for example.\nexport class LayerOneConnectionPlugin extends NetworkPlugin {\n readonly provider!: Provider;\n// @TODO: Rename to ChainAccess and allow for connecting to any chain\n constructor(provider: Provider) {\n super(\"org.ethers.plugins.layer-one-connection\");\n defineProperties(this, { provider });\n }\n\n clone(): LayerOneConnectionPlugin {\n return new LayerOneConnectionPlugin(this.provider);\n }\n}\n*/\nconst Networks = new Map();\n/**\n * A **Network** provides access to a chain's properties and allows\n * for plug-ins to extend functionality.\n */\nexport class Network {\n #name;\n #chainId;\n #plugins;\n /**\n * Creates a new **Network** for %%name%% and %%chainId%%.\n */\n constructor(name, chainId) {\n this.#name = name;\n this.#chainId = getBigInt(chainId);\n this.#plugins = new Map();\n }\n /**\n * Returns a JSON-compatible representation of a Network.\n */\n toJSON() {\n return { name: this.name, chainId: String(this.chainId) };\n }\n /**\n * The network common name.\n *\n * This is the canonical name, as networks migh have multiple\n * names.\n */\n get name() { return this.#name; }\n set name(value) { this.#name = value; }\n /**\n * The network chain ID.\n */\n get chainId() { return this.#chainId; }\n set chainId(value) { this.#chainId = getBigInt(value, \"chainId\"); }\n /**\n * Returns true if %%other%% matches this network. Any chain ID\n * must match, and if no chain ID is present, the name must match.\n *\n * This method does not currently check for additional properties,\n * such as ENS address or plug-in compatibility.\n */\n matches(other) {\n if (other == null) {\n return false;\n }\n if (typeof (other) === \"string\") {\n try {\n return (this.chainId === getBigInt(other));\n }\n catch (error) { }\n return (this.name === other);\n }\n if (typeof (other) === \"number\" || typeof (other) === \"bigint\") {\n try {\n return (this.chainId === getBigInt(other));\n }\n catch (error) { }\n return false;\n }\n if (typeof (other) === \"object\") {\n if (other.chainId != null) {\n try {\n return (this.chainId === getBigInt(other.chainId));\n }\n catch (error) { }\n return false;\n }\n if (other.name != null) {\n return (this.name === other.name);\n }\n return false;\n }\n return false;\n }\n /**\n * Returns the list of plugins currently attached to this Network.\n */\n get plugins() {\n return Array.from(this.#plugins.values());\n }\n /**\n * Attach a new %%plugin%% to this Network. The network name\n * must be unique, excluding any fragment.\n */\n attachPlugin(plugin) {\n if (this.#plugins.get(plugin.name)) {\n throw new Error(`cannot replace existing plugin: ${plugin.name} `);\n }\n this.#plugins.set(plugin.name, plugin.clone());\n return this;\n }\n /**\n * Return the plugin, if any, matching %%name%% exactly. Plugins\n * with fragments will not be returned unless %%name%% includes\n * a fragment.\n */\n getPlugin(name) {\n return (this.#plugins.get(name)) || null;\n }\n /**\n * Gets a list of all plugins that match %%name%%, with otr without\n * a fragment.\n */\n getPlugins(basename) {\n return (this.plugins.filter((p) => (p.name.split(\"#\")[0] === basename)));\n }\n /**\n * Create a copy of this Network.\n */\n clone() {\n const clone = new Network(this.name, this.chainId);\n this.plugins.forEach((plugin) => {\n clone.attachPlugin(plugin.clone());\n });\n return clone;\n }\n /**\n * Compute the intrinsic gas required for a transaction.\n *\n * A GasCostPlugin can be attached to override the default\n * values.\n */\n computeIntrinsicGas(tx) {\n const costs = this.getPlugin(\"org.ethers.plugins.network.GasCost\") || (new GasCostPlugin());\n let gas = costs.txBase;\n if (tx.to == null) {\n gas += costs.txCreate;\n }\n if (tx.data) {\n for (let i = 2; i < tx.data.length; i += 2) {\n if (tx.data.substring(i, i + 2) === \"00\") {\n gas += costs.txDataZero;\n }\n else {\n gas += costs.txDataNonzero;\n }\n }\n }\n if (tx.accessList) {\n const accessList = accessListify(tx.accessList);\n for (const addr in accessList) {\n gas += costs.txAccessListAddress + costs.txAccessListStorageKey * accessList[addr].storageKeys.length;\n }\n }\n return gas;\n }\n /**\n * Returns a new Network for the %%network%% name or chainId.\n */\n static from(network) {\n injectCommonNetworks();\n // Default network\n if (network == null) {\n return Network.from(\"mainnet\");\n }\n // Canonical name or chain ID\n if (typeof (network) === \"number\") {\n network = BigInt(network);\n }\n if (typeof (network) === \"string\" || typeof (network) === \"bigint\") {\n const networkFunc = Networks.get(network);\n if (networkFunc) {\n return networkFunc();\n }\n if (typeof (network) === \"bigint\") {\n return new Network(\"unknown\", network);\n }\n assertArgument(false, \"unknown network\", \"network\", network);\n }\n // Clonable with network-like abilities\n if (typeof (network.clone) === \"function\") {\n const clone = network.clone();\n //if (typeof(network.name) !== \"string\" || typeof(network.chainId) !== \"number\") {\n //}\n return clone;\n }\n // Networkish\n if (typeof (network) === \"object\") {\n assertArgument(typeof (network.name) === \"string\" && typeof (network.chainId) === \"number\", \"invalid network object name or chainId\", \"network\", network);\n const custom = new Network((network.name), (network.chainId));\n if (network.ensAddress || network.ensNetwork != null) {\n custom.attachPlugin(new EnsPlugin(network.ensAddress, network.ensNetwork));\n }\n //if ((network).layerOneConnection) {\n // custom.attachPlugin(new LayerOneConnectionPlugin((network).layerOneConnection));\n //}\n return custom;\n }\n assertArgument(false, \"invalid network\", \"network\", network);\n }\n /**\n * Register %%nameOrChainId%% with a function which returns\n * an instance of a Network representing that chain.\n */\n static register(nameOrChainId, networkFunc) {\n if (typeof (nameOrChainId) === \"number\") {\n nameOrChainId = BigInt(nameOrChainId);\n }\n const existing = Networks.get(nameOrChainId);\n if (existing) {\n assertArgument(false, `conflicting network for ${JSON.stringify(existing.name)}`, \"nameOrChainId\", nameOrChainId);\n }\n Networks.set(nameOrChainId, networkFunc);\n }\n}\n// We don't want to bring in formatUnits because it is backed by\n// FixedNumber and we want to keep Networks tiny. The values\n// included by the Gas Stations are also IEEE 754 with lots of\n// rounding issues and exceed the strict checks formatUnits has.\nfunction parseUnits(_value, decimals) {\n const value = String(_value);\n if (!value.match(/^[0-9.]+$/)) {\n throw new Error(`invalid gwei value: ${_value}`);\n }\n // Break into [ whole, fraction ]\n const comps = value.split(\".\");\n if (comps.length === 1) {\n comps.push(\"\");\n }\n // More than 1 decimal point or too many fractional positions\n if (comps.length !== 2) {\n throw new Error(`invalid gwei value: ${_value}`);\n }\n // Pad the fraction to 9 decimalplaces\n while (comps[1].length < decimals) {\n comps[1] += \"0\";\n }\n // Too many decimals and some non-zero ending, take the ceiling\n if (comps[1].length > 9) {\n let frac = BigInt(comps[1].substring(0, 9));\n if (!comps[1].substring(9).match(/^0+$/)) {\n frac++;\n }\n comps[1] = frac.toString();\n }\n return BigInt(comps[0] + comps[1]);\n}\n// Used by Polygon to use a gas station for fee data\nfunction getGasStationPlugin(url) {\n return new FetchUrlFeeDataNetworkPlugin(url, async (fetchFeeData, provider, request) => {\n // Prevent Cloudflare from blocking our request in node.js\n request.setHeader(\"User-Agent\", \"ethers\");\n let response;\n try {\n const [_response, _feeData] = await Promise.all([\n request.send(), fetchFeeData()\n ]);\n response = _response;\n const payload = response.bodyJson.standard;\n const feeData = {\n gasPrice: _feeData.gasPrice,\n maxFeePerGas: parseUnits(payload.maxFee, 9),\n maxPriorityFeePerGas: parseUnits(payload.maxPriorityFee, 9),\n };\n return feeData;\n }\n catch (error) {\n assert(false, `error encountered with polygon gas station (${JSON.stringify(request.url)})`, \"SERVER_ERROR\", { request, response, error });\n }\n });\n}\n// See: https://chainlist.org\nlet injected = false;\nfunction injectCommonNetworks() {\n if (injected) {\n return;\n }\n injected = true;\n /// Register popular Ethereum networks\n function registerEth(name, chainId, options) {\n const func = function () {\n const network = new Network(name, chainId);\n // We use 0 to disable ENS\n if (options.ensNetwork != null) {\n network.attachPlugin(new EnsPlugin(null, options.ensNetwork));\n }\n network.attachPlugin(new GasCostPlugin());\n (options.plugins || []).forEach((plugin) => {\n network.attachPlugin(plugin);\n });\n return network;\n };\n // Register the network by name and chain ID\n Network.register(name, func);\n Network.register(chainId, func);\n if (options.altNames) {\n options.altNames.forEach((name) => {\n Network.register(name, func);\n });\n }\n }\n registerEth(\"mainnet\", 1, { ensNetwork: 1, altNames: [\"homestead\"] });\n registerEth(\"ropsten\", 3, { ensNetwork: 3 });\n registerEth(\"rinkeby\", 4, { ensNetwork: 4 });\n registerEth(\"goerli\", 5, { ensNetwork: 5 });\n registerEth(\"kovan\", 42, { ensNetwork: 42 });\n registerEth(\"sepolia\", 11155111, { ensNetwork: 11155111 });\n registerEth(\"holesky\", 17000, { ensNetwork: 17000 });\n registerEth(\"classic\", 61, {});\n registerEth(\"classicKotti\", 6, {});\n registerEth(\"arbitrum\", 42161, {\n ensNetwork: 1,\n });\n registerEth(\"arbitrum-goerli\", 421613, {});\n registerEth(\"arbitrum-sepolia\", 421614, {});\n registerEth(\"base\", 8453, { ensNetwork: 1 });\n registerEth(\"base-goerli\", 84531, {});\n registerEth(\"base-sepolia\", 84532, {});\n registerEth(\"bnb\", 56, { ensNetwork: 1 });\n registerEth(\"bnbt\", 97, {});\n registerEth(\"linea\", 59144, { ensNetwork: 1 });\n registerEth(\"linea-goerli\", 59140, {});\n registerEth(\"linea-sepolia\", 59141, {});\n registerEth(\"matic\", 137, {\n ensNetwork: 1,\n plugins: [\n getGasStationPlugin(\"https:/\\/gasstation.polygon.technology/v2\")\n ]\n });\n registerEth(\"matic-amoy\", 80002, {});\n registerEth(\"matic-mumbai\", 80001, {\n altNames: [\"maticMumbai\", \"maticmum\"],\n plugins: [\n getGasStationPlugin(\"https:/\\/gasstation-testnet.polygon.technology/v2\")\n ]\n });\n registerEth(\"optimism\", 10, {\n ensNetwork: 1,\n plugins: []\n });\n registerEth(\"optimism-goerli\", 420, {});\n registerEth(\"optimism-sepolia\", 11155420, {});\n registerEth(\"xdai\", 100, { ensNetwork: 1 });\n}\n//# sourceMappingURL=network.js.map","import { assert, isHexString } from \"../utils/index.js\";\nfunction copy(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n/**\n * Return the polling subscriber for common events.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport function getPollingSubscriber(provider, event) {\n if (event === \"block\") {\n return new PollingBlockSubscriber(provider);\n }\n if (isHexString(event, 32)) {\n return new PollingTransactionSubscriber(provider, event);\n }\n assert(false, \"unsupported polling event\", \"UNSUPPORTED_OPERATION\", {\n operation: \"getPollingSubscriber\", info: { event }\n });\n}\n// @TODO: refactor this\n/**\n * A **PollingBlockSubscriber** polls at a regular interval for a change\n * in the block number.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class PollingBlockSubscriber {\n #provider;\n #poller;\n #interval;\n // The most recent block we have scanned for events. The value -2\n // indicates we still need to fetch an initial block number\n #blockNumber;\n /**\n * Create a new **PollingBlockSubscriber** attached to %%provider%%.\n */\n constructor(provider) {\n this.#provider = provider;\n this.#poller = null;\n this.#interval = 4000;\n this.#blockNumber = -2;\n }\n /**\n * The polling interval.\n */\n get pollingInterval() { return this.#interval; }\n set pollingInterval(value) { this.#interval = value; }\n async #poll() {\n try {\n const blockNumber = await this.#provider.getBlockNumber();\n // Bootstrap poll to setup our initial block number\n if (this.#blockNumber === -2) {\n this.#blockNumber = blockNumber;\n return;\n }\n // @TODO: Put a cap on the maximum number of events per loop?\n if (blockNumber !== this.#blockNumber) {\n for (let b = this.#blockNumber + 1; b <= blockNumber; b++) {\n // We have been stopped\n if (this.#poller == null) {\n return;\n }\n await this.#provider.emit(\"block\", b);\n }\n this.#blockNumber = blockNumber;\n }\n }\n catch (error) {\n // @TODO: Minor bump, add an \"error\" event to let subscribers\n // know things went awry.\n //console.log(error);\n }\n // We have been stopped\n if (this.#poller == null) {\n return;\n }\n this.#poller = this.#provider._setTimeout(this.#poll.bind(this), this.#interval);\n }\n start() {\n if (this.#poller) {\n return;\n }\n this.#poller = this.#provider._setTimeout(this.#poll.bind(this), this.#interval);\n this.#poll();\n }\n stop() {\n if (!this.#poller) {\n return;\n }\n this.#provider._clearTimeout(this.#poller);\n this.#poller = null;\n }\n pause(dropWhilePaused) {\n this.stop();\n if (dropWhilePaused) {\n this.#blockNumber = -2;\n }\n }\n resume() {\n this.start();\n }\n}\n/**\n * An **OnBlockSubscriber** can be sub-classed, with a [[_poll]]\n * implmentation which will be called on every new block.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class OnBlockSubscriber {\n #provider;\n #poll;\n #running;\n /**\n * Create a new **OnBlockSubscriber** attached to %%provider%%.\n */\n constructor(provider) {\n this.#provider = provider;\n this.#running = false;\n this.#poll = (blockNumber) => {\n this._poll(blockNumber, this.#provider);\n };\n }\n /**\n * Called on every new block.\n */\n async _poll(blockNumber, provider) {\n throw new Error(\"sub-classes must override this\");\n }\n start() {\n if (this.#running) {\n return;\n }\n this.#running = true;\n this.#poll(-2);\n this.#provider.on(\"block\", this.#poll);\n }\n stop() {\n if (!this.#running) {\n return;\n }\n this.#running = false;\n this.#provider.off(\"block\", this.#poll);\n }\n pause(dropWhilePaused) { this.stop(); }\n resume() { this.start(); }\n}\nexport class PollingBlockTagSubscriber extends OnBlockSubscriber {\n #tag;\n #lastBlock;\n constructor(provider, tag) {\n super(provider);\n this.#tag = tag;\n this.#lastBlock = -2;\n }\n pause(dropWhilePaused) {\n if (dropWhilePaused) {\n this.#lastBlock = -2;\n }\n super.pause(dropWhilePaused);\n }\n async _poll(blockNumber, provider) {\n const block = await provider.getBlock(this.#tag);\n if (block == null) {\n return;\n }\n if (this.#lastBlock === -2) {\n this.#lastBlock = block.number;\n }\n else if (block.number > this.#lastBlock) {\n provider.emit(this.#tag, block.number);\n this.#lastBlock = block.number;\n }\n }\n}\n/**\n * @_ignore:\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class PollingOrphanSubscriber extends OnBlockSubscriber {\n #filter;\n constructor(provider, filter) {\n super(provider);\n this.#filter = copy(filter);\n }\n async _poll(blockNumber, provider) {\n throw new Error(\"@TODO\");\n console.log(this.#filter);\n }\n}\n/**\n * A **PollingTransactionSubscriber** will poll for a given transaction\n * hash for its receipt.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class PollingTransactionSubscriber extends OnBlockSubscriber {\n #hash;\n /**\n * Create a new **PollingTransactionSubscriber** attached to\n * %%provider%%, listening for %%hash%%.\n */\n constructor(provider, hash) {\n super(provider);\n this.#hash = hash;\n }\n async _poll(blockNumber, provider) {\n const tx = await provider.getTransactionReceipt(this.#hash);\n if (tx) {\n provider.emit(this.#hash, tx);\n }\n }\n}\n/**\n * A **PollingEventSubscriber** will poll for a given filter for its logs.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class PollingEventSubscriber {\n #provider;\n #filter;\n #poller;\n #running;\n // The most recent block we have scanned for events. The value -2\n // indicates we still need to fetch an initial block number\n #blockNumber;\n /**\n * Create a new **PollingTransactionSubscriber** attached to\n * %%provider%%, listening for %%filter%%.\n */\n constructor(provider, filter) {\n this.#provider = provider;\n this.#filter = copy(filter);\n this.#poller = this.#poll.bind(this);\n this.#running = false;\n this.#blockNumber = -2;\n }\n async #poll(blockNumber) {\n // The initial block hasn't been determined yet\n if (this.#blockNumber === -2) {\n return;\n }\n const filter = copy(this.#filter);\n filter.fromBlock = this.#blockNumber + 1;\n filter.toBlock = blockNumber;\n const logs = await this.#provider.getLogs(filter);\n // No logs could just mean the node has not indexed them yet,\n // so we keep a sliding window of 60 blocks to keep scanning\n if (logs.length === 0) {\n if (this.#blockNumber < blockNumber - 60) {\n this.#blockNumber = blockNumber - 60;\n }\n return;\n }\n for (const log of logs) {\n this.#provider.emit(this.#filter, log);\n // Only advance the block number when logs were found to\n // account for networks (like BNB and Polygon) which may\n // sacrifice event consistency for block event speed\n this.#blockNumber = log.blockNumber;\n }\n }\n start() {\n if (this.#running) {\n return;\n }\n this.#running = true;\n if (this.#blockNumber === -2) {\n this.#provider.getBlockNumber().then((blockNumber) => {\n this.#blockNumber = blockNumber;\n });\n }\n this.#provider.on(\"block\", this.#poller);\n }\n stop() {\n if (!this.#running) {\n return;\n }\n this.#running = false;\n this.#provider.off(\"block\", this.#poller);\n }\n pause(dropWhilePaused) {\n this.stop();\n if (dropWhilePaused) {\n this.#blockNumber = -2;\n }\n }\n resume() {\n this.start();\n }\n}\n//# sourceMappingURL=subscriber-polling.js.map","/**\n * The available providers should suffice for most developers purposes,\n * but the [[AbstractProvider]] class has many features which enable\n * sub-classing it for specific purposes.\n *\n * @_section: api/providers/abstract-provider: Subclassing Provider [abstract-provider]\n */\n// @TODO\n// Event coalescence\n// When we register an event with an async value (e.g. address is a Signer\n// or ENS name), we need to add it immeidately for the Event API, but also\n// need time to resolve the address. Upon resolving the address, we need to\n// migrate the listener to the static event. We also need to maintain a map\n// of Signer/ENS name to address so we can sync respond to listenerCount.\nimport { getAddress, resolveAddress } from \"../address/index.js\";\nimport { ZeroAddress } from \"../constants/index.js\";\nimport { Contract } from \"../contract/index.js\";\nimport { namehash } from \"../hash/index.js\";\nimport { Transaction } from \"../transaction/index.js\";\nimport { concat, dataLength, dataSlice, hexlify, isHexString, getBigInt, getBytes, getNumber, isCallException, isError, makeError, assert, assertArgument, FetchRequest, toBeArray, toQuantity, defineProperties, EventPayload, resolveProperties, toUtf8String } from \"../utils/index.js\";\nimport { EnsResolver } from \"./ens-resolver.js\";\nimport { formatBlock, formatLog, formatTransactionReceipt, formatTransactionResponse } from \"./format.js\";\nimport { Network } from \"./network.js\";\nimport { copyRequest, Block, FeeData, Log, TransactionReceipt, TransactionResponse } from \"./provider.js\";\nimport { PollingBlockSubscriber, PollingBlockTagSubscriber, PollingEventSubscriber, PollingOrphanSubscriber, PollingTransactionSubscriber } from \"./subscriber-polling.js\";\n// Constants\nconst BN_2 = BigInt(2);\nconst MAX_CCIP_REDIRECTS = 10;\nfunction isPromise(value) {\n return (value && typeof (value.then) === \"function\");\n}\nfunction getTag(prefix, value) {\n return prefix + \":\" + JSON.stringify(value, (k, v) => {\n if (v == null) {\n return \"null\";\n }\n if (typeof (v) === \"bigint\") {\n return `bigint:${v.toString()}`;\n }\n if (typeof (v) === \"string\") {\n return v.toLowerCase();\n }\n // Sort object keys\n if (typeof (v) === \"object\" && !Array.isArray(v)) {\n const keys = Object.keys(v);\n keys.sort();\n return keys.reduce((accum, key) => {\n accum[key] = v[key];\n return accum;\n }, {});\n }\n return v;\n });\n}\n/**\n * An **UnmanagedSubscriber** is useful for events which do not require\n * any additional management, such as ``\"debug\"`` which only requires\n * emit in synchronous event loop triggered calls.\n */\nexport class UnmanagedSubscriber {\n /**\n * The name fof the event.\n */\n name;\n /**\n * Create a new UnmanagedSubscriber with %%name%%.\n */\n constructor(name) { defineProperties(this, { name }); }\n start() { }\n stop() { }\n pause(dropWhilePaused) { }\n resume() { }\n}\nfunction copy(value) {\n return JSON.parse(JSON.stringify(value));\n}\nfunction concisify(items) {\n items = Array.from((new Set(items)).values());\n items.sort();\n return items;\n}\nasync function getSubscription(_event, provider) {\n if (_event == null) {\n throw new Error(\"invalid event\");\n }\n // Normalize topic array info an EventFilter\n if (Array.isArray(_event)) {\n _event = { topics: _event };\n }\n if (typeof (_event) === \"string\") {\n switch (_event) {\n case \"block\":\n case \"debug\":\n case \"error\":\n case \"finalized\":\n case \"network\":\n case \"pending\":\n case \"safe\": {\n return { type: _event, tag: _event };\n }\n }\n }\n if (isHexString(_event, 32)) {\n const hash = _event.toLowerCase();\n return { type: \"transaction\", tag: getTag(\"tx\", { hash }), hash };\n }\n if (_event.orphan) {\n const event = _event;\n // @TODO: Should lowercase and whatnot things here instead of copy...\n return { type: \"orphan\", tag: getTag(\"orphan\", event), filter: copy(event) };\n }\n if ((_event.address || _event.topics)) {\n const event = _event;\n const filter = {\n topics: ((event.topics || []).map((t) => {\n if (t == null) {\n return null;\n }\n if (Array.isArray(t)) {\n return concisify(t.map((t) => t.toLowerCase()));\n }\n return t.toLowerCase();\n }))\n };\n if (event.address) {\n const addresses = [];\n const promises = [];\n const addAddress = (addr) => {\n if (isHexString(addr)) {\n addresses.push(addr);\n }\n else {\n promises.push((async () => {\n addresses.push(await resolveAddress(addr, provider));\n })());\n }\n };\n if (Array.isArray(event.address)) {\n event.address.forEach(addAddress);\n }\n else {\n addAddress(event.address);\n }\n if (promises.length) {\n await Promise.all(promises);\n }\n filter.address = concisify(addresses.map((a) => a.toLowerCase()));\n }\n return { filter, tag: getTag(\"event\", filter), type: \"event\" };\n }\n assertArgument(false, \"unknown ProviderEvent\", \"event\", _event);\n}\nfunction getTime() { return (new Date()).getTime(); }\nconst defaultOptions = {\n cacheTimeout: 250,\n pollingInterval: 4000\n};\n/**\n * An **AbstractProvider** provides a base class for other sub-classes to\n * implement the [[Provider]] API by normalizing input arguments and\n * formatting output results as well as tracking events for consistent\n * behaviour on an eventually-consistent network.\n */\nexport class AbstractProvider {\n #subs;\n #plugins;\n // null=unpaused, true=paused+dropWhilePaused, false=paused\n #pausedState;\n #destroyed;\n #networkPromise;\n #anyNetwork;\n #performCache;\n // The most recent block number if running an event or -1 if no \"block\" event\n #lastBlockNumber;\n #nextTimer;\n #timers;\n #disableCcipRead;\n #options;\n /**\n * Create a new **AbstractProvider** connected to %%network%%, or\n * use the various network detection capabilities to discover the\n * [[Network]] if necessary.\n */\n constructor(_network, options) {\n this.#options = Object.assign({}, defaultOptions, options || {});\n if (_network === \"any\") {\n this.#anyNetwork = true;\n this.#networkPromise = null;\n }\n else if (_network) {\n const network = Network.from(_network);\n this.#anyNetwork = false;\n this.#networkPromise = Promise.resolve(network);\n setTimeout(() => { this.emit(\"network\", network, null); }, 0);\n }\n else {\n this.#anyNetwork = false;\n this.#networkPromise = null;\n }\n this.#lastBlockNumber = -1;\n this.#performCache = new Map();\n this.#subs = new Map();\n this.#plugins = new Map();\n this.#pausedState = null;\n this.#destroyed = false;\n this.#nextTimer = 1;\n this.#timers = new Map();\n this.#disableCcipRead = false;\n }\n get pollingInterval() { return this.#options.pollingInterval; }\n /**\n * Returns ``this``, to allow an **AbstractProvider** to implement\n * the [[ContractRunner]] interface.\n */\n get provider() { return this; }\n /**\n * Returns all the registered plug-ins.\n */\n get plugins() {\n return Array.from(this.#plugins.values());\n }\n /**\n * Attach a new plug-in.\n */\n attachPlugin(plugin) {\n if (this.#plugins.get(plugin.name)) {\n throw new Error(`cannot replace existing plugin: ${plugin.name} `);\n }\n this.#plugins.set(plugin.name, plugin.connect(this));\n return this;\n }\n /**\n * Get a plugin by name.\n */\n getPlugin(name) {\n return (this.#plugins.get(name)) || null;\n }\n /**\n * Prevent any CCIP-read operation, regardless of whether requested\n * in a [[call]] using ``enableCcipRead``.\n */\n get disableCcipRead() { return this.#disableCcipRead; }\n set disableCcipRead(value) { this.#disableCcipRead = !!value; }\n // Shares multiple identical requests made during the same 250ms\n async #perform(req) {\n const timeout = this.#options.cacheTimeout;\n // Caching disabled\n if (timeout < 0) {\n return await this._perform(req);\n }\n // Create a tag\n const tag = getTag(req.method, req);\n let perform = this.#performCache.get(tag);\n if (!perform) {\n perform = this._perform(req);\n this.#performCache.set(tag, perform);\n setTimeout(() => {\n if (this.#performCache.get(tag) === perform) {\n this.#performCache.delete(tag);\n }\n }, timeout);\n }\n return await perform;\n }\n /**\n * Resolves to the data for executing the CCIP-read operations.\n */\n async ccipReadFetch(tx, calldata, urls) {\n if (this.disableCcipRead || urls.length === 0 || tx.to == null) {\n return null;\n }\n const sender = tx.to.toLowerCase();\n const data = calldata.toLowerCase();\n const errorMessages = [];\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i];\n // URL expansion\n const href = url.replace(\"{sender}\", sender).replace(\"{data}\", data);\n // If no {data} is present, use POST; otherwise GET\n //const json: string | null = (url.indexOf(\"{data}\") >= 0) ? null: JSON.stringify({ data, sender });\n //const result = await fetchJson({ url: href, errorPassThrough: true }, json, (value, response) => {\n // value.status = response.statusCode;\n // return value;\n //});\n const request = new FetchRequest(href);\n if (url.indexOf(\"{data}\") === -1) {\n request.body = { data, sender };\n }\n this.emit(\"debug\", { action: \"sendCcipReadFetchRequest\", request, index: i, urls });\n let errorMessage = \"unknown error\";\n // Fetch the resource...\n let resp;\n try {\n resp = await request.send();\n }\n catch (error) {\n // ...low-level fetch error (missing host, bad SSL, etc.),\n // so try next URL\n errorMessages.push(error.message);\n this.emit(\"debug\", { action: \"receiveCcipReadFetchError\", request, result: { error } });\n continue;\n }\n try {\n const result = resp.bodyJson;\n if (result.data) {\n this.emit(\"debug\", { action: \"receiveCcipReadFetchResult\", request, result });\n return result.data;\n }\n if (result.message) {\n errorMessage = result.message;\n }\n this.emit(\"debug\", { action: \"receiveCcipReadFetchError\", request, result });\n }\n catch (error) { }\n // 4xx indicates the result is not present; stop\n assert(resp.statusCode < 400 || resp.statusCode >= 500, `response not found during CCIP fetch: ${errorMessage}`, \"OFFCHAIN_FAULT\", { reason: \"404_MISSING_RESOURCE\", transaction: tx, info: { url, errorMessage } });\n // 5xx indicates server issue; try the next url\n errorMessages.push(errorMessage);\n }\n assert(false, `error encountered during CCIP fetch: ${errorMessages.map((m) => JSON.stringify(m)).join(\", \")}`, \"OFFCHAIN_FAULT\", {\n reason: \"500_SERVER_ERROR\",\n transaction: tx, info: { urls, errorMessages }\n });\n }\n /**\n * Provides the opportunity for a sub-class to wrap a block before\n * returning it, to add additional properties or an alternate\n * sub-class of [[Block]].\n */\n _wrapBlock(value, network) {\n return new Block(formatBlock(value), this);\n }\n /**\n * Provides the opportunity for a sub-class to wrap a log before\n * returning it, to add additional properties or an alternate\n * sub-class of [[Log]].\n */\n _wrapLog(value, network) {\n return new Log(formatLog(value), this);\n }\n /**\n * Provides the opportunity for a sub-class to wrap a transaction\n * receipt before returning it, to add additional properties or an\n * alternate sub-class of [[TransactionReceipt]].\n */\n _wrapTransactionReceipt(value, network) {\n return new TransactionReceipt(formatTransactionReceipt(value), this);\n }\n /**\n * Provides the opportunity for a sub-class to wrap a transaction\n * response before returning it, to add additional properties or an\n * alternate sub-class of [[TransactionResponse]].\n */\n _wrapTransactionResponse(tx, network) {\n return new TransactionResponse(formatTransactionResponse(tx), this);\n }\n /**\n * Resolves to the Network, forcing a network detection using whatever\n * technique the sub-class requires.\n *\n * Sub-classes **must** override this.\n */\n _detectNetwork() {\n assert(false, \"sub-classes must implement this\", \"UNSUPPORTED_OPERATION\", {\n operation: \"_detectNetwork\"\n });\n }\n /**\n * Sub-classes should use this to perform all built-in operations. All\n * methods sanitizes and normalizes the values passed into this.\n *\n * Sub-classes **must** override this.\n */\n async _perform(req) {\n assert(false, `unsupported method: ${req.method}`, \"UNSUPPORTED_OPERATION\", {\n operation: req.method,\n info: req\n });\n }\n // State\n async getBlockNumber() {\n const blockNumber = getNumber(await this.#perform({ method: \"getBlockNumber\" }), \"%response\");\n if (this.#lastBlockNumber >= 0) {\n this.#lastBlockNumber = blockNumber;\n }\n return blockNumber;\n }\n /**\n * Returns or resolves to the address for %%address%%, resolving ENS\n * names and [[Addressable]] objects and returning if already an\n * address.\n */\n _getAddress(address) {\n return resolveAddress(address, this);\n }\n /**\n * Returns or resolves to a valid block tag for %%blockTag%%, resolving\n * negative values and returning if already a valid block tag.\n */\n _getBlockTag(blockTag) {\n if (blockTag == null) {\n return \"latest\";\n }\n switch (blockTag) {\n case \"earliest\":\n return \"0x0\";\n case \"finalized\":\n case \"latest\":\n case \"pending\":\n case \"safe\":\n return blockTag;\n }\n if (isHexString(blockTag)) {\n if (isHexString(blockTag, 32)) {\n return blockTag;\n }\n return toQuantity(blockTag);\n }\n if (typeof (blockTag) === \"bigint\") {\n blockTag = getNumber(blockTag, \"blockTag\");\n }\n if (typeof (blockTag) === \"number\") {\n if (blockTag >= 0) {\n return toQuantity(blockTag);\n }\n if (this.#lastBlockNumber >= 0) {\n return toQuantity(this.#lastBlockNumber + blockTag);\n }\n return this.getBlockNumber().then((b) => toQuantity(b + blockTag));\n }\n assertArgument(false, \"invalid blockTag\", \"blockTag\", blockTag);\n }\n /**\n * Returns or resolves to a filter for %%filter%%, resolving any ENS\n * names or [[Addressable]] object and returning if already a valid\n * filter.\n */\n _getFilter(filter) {\n // Create a canonical representation of the topics\n const topics = (filter.topics || []).map((t) => {\n if (t == null) {\n return null;\n }\n if (Array.isArray(t)) {\n return concisify(t.map((t) => t.toLowerCase()));\n }\n return t.toLowerCase();\n });\n const blockHash = (\"blockHash\" in filter) ? filter.blockHash : undefined;\n const resolve = (_address, fromBlock, toBlock) => {\n let address = undefined;\n switch (_address.length) {\n case 0: break;\n case 1:\n address = _address[0];\n break;\n default:\n _address.sort();\n address = _address;\n }\n if (blockHash) {\n if (fromBlock != null || toBlock != null) {\n throw new Error(\"invalid filter\");\n }\n }\n const filter = {};\n if (address) {\n filter.address = address;\n }\n if (topics.length) {\n filter.topics = topics;\n }\n if (fromBlock) {\n filter.fromBlock = fromBlock;\n }\n if (toBlock) {\n filter.toBlock = toBlock;\n }\n if (blockHash) {\n filter.blockHash = blockHash;\n }\n return filter;\n };\n // Addresses could be async (ENS names or Addressables)\n let address = [];\n if (filter.address) {\n if (Array.isArray(filter.address)) {\n for (const addr of filter.address) {\n address.push(this._getAddress(addr));\n }\n }\n else {\n address.push(this._getAddress(filter.address));\n }\n }\n let fromBlock = undefined;\n if (\"fromBlock\" in filter) {\n fromBlock = this._getBlockTag(filter.fromBlock);\n }\n let toBlock = undefined;\n if (\"toBlock\" in filter) {\n toBlock = this._getBlockTag(filter.toBlock);\n }\n if (address.filter((a) => (typeof (a) !== \"string\")).length ||\n (fromBlock != null && typeof (fromBlock) !== \"string\") ||\n (toBlock != null && typeof (toBlock) !== \"string\")) {\n return Promise.all([Promise.all(address), fromBlock, toBlock]).then((result) => {\n return resolve(result[0], result[1], result[2]);\n });\n }\n return resolve(address, fromBlock, toBlock);\n }\n /**\n * Returns or resolves to a transaction for %%request%%, resolving\n * any ENS names or [[Addressable]] and returning if already a valid\n * transaction.\n */\n _getTransactionRequest(_request) {\n const request = copyRequest(_request);\n const promises = [];\n [\"to\", \"from\"].forEach((key) => {\n if (request[key] == null) {\n return;\n }\n const addr = resolveAddress(request[key], this);\n if (isPromise(addr)) {\n promises.push((async function () { request[key] = await addr; })());\n }\n else {\n request[key] = addr;\n }\n });\n if (request.blockTag != null) {\n const blockTag = this._getBlockTag(request.blockTag);\n if (isPromise(blockTag)) {\n promises.push((async function () { request.blockTag = await blockTag; })());\n }\n else {\n request.blockTag = blockTag;\n }\n }\n if (promises.length) {\n return (async function () {\n await Promise.all(promises);\n return request;\n })();\n }\n return request;\n }\n async getNetwork() {\n // No explicit network was set and this is our first time\n if (this.#networkPromise == null) {\n // Detect the current network (shared with all calls)\n const detectNetwork = (async () => {\n try {\n const network = await this._detectNetwork();\n this.emit(\"network\", network, null);\n return network;\n }\n catch (error) {\n if (this.#networkPromise === detectNetwork) {\n this.#networkPromise = null;\n }\n throw error;\n }\n })();\n this.#networkPromise = detectNetwork;\n return (await detectNetwork).clone();\n }\n const networkPromise = this.#networkPromise;\n const [expected, actual] = await Promise.all([\n networkPromise,\n this._detectNetwork() // The actual connected network\n ]);\n if (expected.chainId !== actual.chainId) {\n if (this.#anyNetwork) {\n // The \"any\" network can change, so notify listeners\n this.emit(\"network\", actual, expected);\n // Update the network if something else hasn't already changed it\n if (this.#networkPromise === networkPromise) {\n this.#networkPromise = Promise.resolve(actual);\n }\n }\n else {\n // Otherwise, we do not allow changes to the underlying network\n assert(false, `network changed: ${expected.chainId} => ${actual.chainId} `, \"NETWORK_ERROR\", {\n event: \"changed\"\n });\n }\n }\n return expected.clone();\n }\n async getFeeData() {\n const network = await this.getNetwork();\n const getFeeDataFunc = async () => {\n const { _block, gasPrice, priorityFee } = await resolveProperties({\n _block: this.#getBlock(\"latest\", false),\n gasPrice: ((async () => {\n try {\n const value = await this.#perform({ method: \"getGasPrice\" });\n return getBigInt(value, \"%response\");\n }\n catch (error) { }\n return null;\n })()),\n priorityFee: ((async () => {\n try {\n const value = await this.#perform({ method: \"getPriorityFee\" });\n return getBigInt(value, \"%response\");\n }\n catch (error) { }\n return null;\n })())\n });\n let maxFeePerGas = null;\n let maxPriorityFeePerGas = null;\n // These are the recommended EIP-1559 heuristics for fee data\n const block = this._wrapBlock(_block, network);\n if (block && block.baseFeePerGas) {\n maxPriorityFeePerGas = (priorityFee != null) ? priorityFee : BigInt(\"1000000000\");\n maxFeePerGas = (block.baseFeePerGas * BN_2) + maxPriorityFeePerGas;\n }\n return new FeeData(gasPrice, maxFeePerGas, maxPriorityFeePerGas);\n };\n // Check for a FeeDataNetWorkPlugin\n const plugin = network.getPlugin(\"org.ethers.plugins.network.FetchUrlFeeDataPlugin\");\n if (plugin) {\n const req = new FetchRequest(plugin.url);\n const feeData = await plugin.processFunc(getFeeDataFunc, this, req);\n return new FeeData(feeData.gasPrice, feeData.maxFeePerGas, feeData.maxPriorityFeePerGas);\n }\n return await getFeeDataFunc();\n }\n async estimateGas(_tx) {\n let tx = this._getTransactionRequest(_tx);\n if (isPromise(tx)) {\n tx = await tx;\n }\n return getBigInt(await this.#perform({\n method: \"estimateGas\", transaction: tx\n }), \"%response\");\n }\n async #call(tx, blockTag, attempt) {\n assert(attempt < MAX_CCIP_REDIRECTS, \"CCIP read exceeded maximum redirections\", \"OFFCHAIN_FAULT\", {\n reason: \"TOO_MANY_REDIRECTS\",\n transaction: Object.assign({}, tx, { blockTag, enableCcipRead: true })\n });\n // This came in as a PerformActionTransaction, so to/from are safe; we can cast\n const transaction = copyRequest(tx);\n try {\n return hexlify(await this._perform({ method: \"call\", transaction, blockTag }));\n }\n catch (error) {\n // CCIP Read OffchainLookup\n if (!this.disableCcipRead && isCallException(error) && error.data && attempt >= 0 && blockTag === \"latest\" && transaction.to != null && dataSlice(error.data, 0, 4) === \"0x556f1830\") {\n const data = error.data;\n const txSender = await resolveAddress(transaction.to, this);\n // Parse the CCIP Read Arguments\n let ccipArgs;\n try {\n ccipArgs = parseOffchainLookup(dataSlice(error.data, 4));\n }\n catch (error) {\n assert(false, error.message, \"OFFCHAIN_FAULT\", {\n reason: \"BAD_DATA\", transaction, info: { data }\n });\n }\n // Check the sender of the OffchainLookup matches the transaction\n assert(ccipArgs.sender.toLowerCase() === txSender.toLowerCase(), \"CCIP Read sender mismatch\", \"CALL_EXCEPTION\", {\n action: \"call\",\n data,\n reason: \"OffchainLookup\",\n transaction: transaction,\n invocation: null,\n revert: {\n signature: \"OffchainLookup(address,string[],bytes,bytes4,bytes)\",\n name: \"OffchainLookup\",\n args: ccipArgs.errorArgs\n }\n });\n const ccipResult = await this.ccipReadFetch(transaction, ccipArgs.calldata, ccipArgs.urls);\n assert(ccipResult != null, \"CCIP Read failed to fetch data\", \"OFFCHAIN_FAULT\", {\n reason: \"FETCH_FAILED\", transaction, info: { data: error.data, errorArgs: ccipArgs.errorArgs }\n });\n const tx = {\n to: txSender,\n data: concat([ccipArgs.selector, encodeBytes([ccipResult, ccipArgs.extraData])])\n };\n this.emit(\"debug\", { action: \"sendCcipReadCall\", transaction: tx });\n try {\n const result = await this.#call(tx, blockTag, attempt + 1);\n this.emit(\"debug\", { action: \"receiveCcipReadCallResult\", transaction: Object.assign({}, tx), result });\n return result;\n }\n catch (error) {\n this.emit(\"debug\", { action: \"receiveCcipReadCallError\", transaction: Object.assign({}, tx), error });\n throw error;\n }\n }\n throw error;\n }\n }\n async #checkNetwork(promise) {\n const { value } = await resolveProperties({\n network: this.getNetwork(),\n value: promise\n });\n return value;\n }\n async call(_tx) {\n const { tx, blockTag } = await resolveProperties({\n tx: this._getTransactionRequest(_tx),\n blockTag: this._getBlockTag(_tx.blockTag)\n });\n return await this.#checkNetwork(this.#call(tx, blockTag, _tx.enableCcipRead ? 0 : -1));\n }\n // Account\n async #getAccountValue(request, _address, _blockTag) {\n let address = this._getAddress(_address);\n let blockTag = this._getBlockTag(_blockTag);\n if (typeof (address) !== \"string\" || typeof (blockTag) !== \"string\") {\n [address, blockTag] = await Promise.all([address, blockTag]);\n }\n return await this.#checkNetwork(this.#perform(Object.assign(request, { address, blockTag })));\n }\n async getBalance(address, blockTag) {\n return getBigInt(await this.#getAccountValue({ method: \"getBalance\" }, address, blockTag), \"%response\");\n }\n async getTransactionCount(address, blockTag) {\n return getNumber(await this.#getAccountValue({ method: \"getTransactionCount\" }, address, blockTag), \"%response\");\n }\n async getCode(address, blockTag) {\n return hexlify(await this.#getAccountValue({ method: \"getCode\" }, address, blockTag));\n }\n async getStorage(address, _position, blockTag) {\n const position = getBigInt(_position, \"position\");\n return hexlify(await this.#getAccountValue({ method: \"getStorage\", position }, address, blockTag));\n }\n // Write\n async broadcastTransaction(signedTx) {\n const { blockNumber, hash, network } = await resolveProperties({\n blockNumber: this.getBlockNumber(),\n hash: this._perform({\n method: \"broadcastTransaction\",\n signedTransaction: signedTx\n }),\n network: this.getNetwork()\n });\n const tx = Transaction.from(signedTx);\n if (tx.hash !== hash) {\n throw new Error(\"@TODO: the returned hash did not match\");\n }\n return this._wrapTransactionResponse(tx, network).replaceableTransaction(blockNumber);\n }\n async #getBlock(block, includeTransactions) {\n // @TODO: Add CustomBlockPlugin check\n if (isHexString(block, 32)) {\n return await this.#perform({\n method: \"getBlock\", blockHash: block, includeTransactions\n });\n }\n let blockTag = this._getBlockTag(block);\n if (typeof (blockTag) !== \"string\") {\n blockTag = await blockTag;\n }\n return await this.#perform({\n method: \"getBlock\", blockTag, includeTransactions\n });\n }\n // Queries\n async getBlock(block, prefetchTxs) {\n const { network, params } = await resolveProperties({\n network: this.getNetwork(),\n params: this.#getBlock(block, !!prefetchTxs)\n });\n if (params == null) {\n return null;\n }\n return this._wrapBlock(params, network);\n }\n async getTransaction(hash) {\n const { network, params } = await resolveProperties({\n network: this.getNetwork(),\n params: this.#perform({ method: \"getTransaction\", hash })\n });\n if (params == null) {\n return null;\n }\n return this._wrapTransactionResponse(params, network);\n }\n async getTransactionReceipt(hash) {\n const { network, params } = await resolveProperties({\n network: this.getNetwork(),\n params: this.#perform({ method: \"getTransactionReceipt\", hash })\n });\n if (params == null) {\n return null;\n }\n // Some backends did not backfill the effectiveGasPrice into old transactions\n // in the receipt, so we look it up manually and inject it.\n if (params.gasPrice == null && params.effectiveGasPrice == null) {\n const tx = await this.#perform({ method: \"getTransaction\", hash });\n if (tx == null) {\n throw new Error(\"report this; could not find tx or effectiveGasPrice\");\n }\n params.effectiveGasPrice = tx.gasPrice;\n }\n return this._wrapTransactionReceipt(params, network);\n }\n async getTransactionResult(hash) {\n const { result } = await resolveProperties({\n network: this.getNetwork(),\n result: this.#perform({ method: \"getTransactionResult\", hash })\n });\n if (result == null) {\n return null;\n }\n return hexlify(result);\n }\n // Bloom-filter Queries\n async getLogs(_filter) {\n let filter = this._getFilter(_filter);\n if (isPromise(filter)) {\n filter = await filter;\n }\n const { network, params } = await resolveProperties({\n network: this.getNetwork(),\n params: this.#perform({ method: \"getLogs\", filter })\n });\n return params.map((p) => this._wrapLog(p, network));\n }\n // ENS\n _getProvider(chainId) {\n assert(false, \"provider cannot connect to target network\", \"UNSUPPORTED_OPERATION\", {\n operation: \"_getProvider()\"\n });\n }\n async getResolver(name) {\n return await EnsResolver.fromName(this, name);\n }\n async getAvatar(name) {\n const resolver = await this.getResolver(name);\n if (resolver) {\n return await resolver.getAvatar();\n }\n return null;\n }\n async resolveName(name) {\n const resolver = await this.getResolver(name);\n if (resolver) {\n return await resolver.getAddress();\n }\n return null;\n }\n async lookupAddress(address) {\n address = getAddress(address);\n const node = namehash(address.substring(2).toLowerCase() + \".addr.reverse\");\n try {\n const ensAddr = await EnsResolver.getEnsAddress(this);\n const ensContract = new Contract(ensAddr, [\n \"function resolver(bytes32) view returns (address)\"\n ], this);\n const resolver = await ensContract.resolver(node);\n if (resolver == null || resolver === ZeroAddress) {\n return null;\n }\n const resolverContract = new Contract(resolver, [\n \"function name(bytes32) view returns (string)\"\n ], this);\n const name = await resolverContract.name(node);\n // Failed forward resolution\n const check = await this.resolveName(name);\n if (check !== address) {\n return null;\n }\n return name;\n }\n catch (error) {\n // No data was returned from the resolver\n if (isError(error, \"BAD_DATA\") && error.value === \"0x\") {\n return null;\n }\n // Something reerted\n if (isError(error, \"CALL_EXCEPTION\")) {\n return null;\n }\n throw error;\n }\n return null;\n }\n async waitForTransaction(hash, _confirms, timeout) {\n const confirms = (_confirms != null) ? _confirms : 1;\n if (confirms === 0) {\n return this.getTransactionReceipt(hash);\n }\n return new Promise(async (resolve, reject) => {\n let timer = null;\n const listener = (async (blockNumber) => {\n try {\n const receipt = await this.getTransactionReceipt(hash);\n if (receipt != null) {\n if (blockNumber - receipt.blockNumber + 1 >= confirms) {\n resolve(receipt);\n //this.off(\"block\", listener);\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n return;\n }\n }\n }\n catch (error) {\n console.log(\"EEE\", error);\n }\n this.once(\"block\", listener);\n });\n if (timeout != null) {\n timer = setTimeout(() => {\n if (timer == null) {\n return;\n }\n timer = null;\n this.off(\"block\", listener);\n reject(makeError(\"timeout\", \"TIMEOUT\", { reason: \"timeout\" }));\n }, timeout);\n }\n listener(await this.getBlockNumber());\n });\n }\n async waitForBlock(blockTag) {\n assert(false, \"not implemented yet\", \"NOT_IMPLEMENTED\", {\n operation: \"waitForBlock\"\n });\n }\n /**\n * Clear a timer created using the [[_setTimeout]] method.\n */\n _clearTimeout(timerId) {\n const timer = this.#timers.get(timerId);\n if (!timer) {\n return;\n }\n if (timer.timer) {\n clearTimeout(timer.timer);\n }\n this.#timers.delete(timerId);\n }\n /**\n * Create a timer that will execute %%func%% after at least %%timeout%%\n * (in ms). If %%timeout%% is unspecified, then %%func%% will execute\n * in the next event loop.\n *\n * [Pausing](AbstractProvider-paused) the provider will pause any\n * associated timers.\n */\n _setTimeout(_func, timeout) {\n if (timeout == null) {\n timeout = 0;\n }\n const timerId = this.#nextTimer++;\n const func = () => {\n this.#timers.delete(timerId);\n _func();\n };\n if (this.paused) {\n this.#timers.set(timerId, { timer: null, func, time: timeout });\n }\n else {\n const timer = setTimeout(func, timeout);\n this.#timers.set(timerId, { timer, func, time: getTime() });\n }\n return timerId;\n }\n /**\n * Perform %%func%% on each subscriber.\n */\n _forEachSubscriber(func) {\n for (const sub of this.#subs.values()) {\n func(sub.subscriber);\n }\n }\n /**\n * Sub-classes may override this to customize subscription\n * implementations.\n */\n _getSubscriber(sub) {\n switch (sub.type) {\n case \"debug\":\n case \"error\":\n case \"network\":\n return new UnmanagedSubscriber(sub.type);\n case \"block\": {\n const subscriber = new PollingBlockSubscriber(this);\n subscriber.pollingInterval = this.pollingInterval;\n return subscriber;\n }\n case \"safe\":\n case \"finalized\":\n return new PollingBlockTagSubscriber(this, sub.type);\n case \"event\":\n return new PollingEventSubscriber(this, sub.filter);\n case \"transaction\":\n return new PollingTransactionSubscriber(this, sub.hash);\n case \"orphan\":\n return new PollingOrphanSubscriber(this, sub.filter);\n }\n throw new Error(`unsupported event: ${sub.type}`);\n }\n /**\n * If a [[Subscriber]] fails and needs to replace itself, this\n * method may be used.\n *\n * For example, this is used for providers when using the\n * ``eth_getFilterChanges`` method, which can return null if state\n * filters are not supported by the backend, allowing the Subscriber\n * to swap in a [[PollingEventSubscriber]].\n */\n _recoverSubscriber(oldSub, newSub) {\n for (const sub of this.#subs.values()) {\n if (sub.subscriber === oldSub) {\n if (sub.started) {\n sub.subscriber.stop();\n }\n sub.subscriber = newSub;\n if (sub.started) {\n newSub.start();\n }\n if (this.#pausedState != null) {\n newSub.pause(this.#pausedState);\n }\n break;\n }\n }\n }\n async #hasSub(event, emitArgs) {\n let sub = await getSubscription(event, this);\n // This is a log that is removing an existing log; we actually want\n // to emit an orphan event for the removed log\n if (sub.type === \"event\" && emitArgs && emitArgs.length > 0 && emitArgs[0].removed === true) {\n sub = await getSubscription({ orphan: \"drop-log\", log: emitArgs[0] }, this);\n }\n return this.#subs.get(sub.tag) || null;\n }\n async #getSub(event) {\n const subscription = await getSubscription(event, this);\n // Prevent tampering with our tag in any subclass' _getSubscriber\n const tag = subscription.tag;\n let sub = this.#subs.get(tag);\n if (!sub) {\n const subscriber = this._getSubscriber(subscription);\n const addressableMap = new WeakMap();\n const nameMap = new Map();\n sub = { subscriber, tag, addressableMap, nameMap, started: false, listeners: [] };\n this.#subs.set(tag, sub);\n }\n return sub;\n }\n async on(event, listener) {\n const sub = await this.#getSub(event);\n sub.listeners.push({ listener, once: false });\n if (!sub.started) {\n sub.subscriber.start();\n sub.started = true;\n if (this.#pausedState != null) {\n sub.subscriber.pause(this.#pausedState);\n }\n }\n return this;\n }\n async once(event, listener) {\n const sub = await this.#getSub(event);\n sub.listeners.push({ listener, once: true });\n if (!sub.started) {\n sub.subscriber.start();\n sub.started = true;\n if (this.#pausedState != null) {\n sub.subscriber.pause(this.#pausedState);\n }\n }\n return this;\n }\n async emit(event, ...args) {\n const sub = await this.#hasSub(event, args);\n // If there is not subscription or if a recent emit removed\n // the last of them (which also deleted the sub) do nothing\n if (!sub || sub.listeners.length === 0) {\n return false;\n }\n ;\n const count = sub.listeners.length;\n sub.listeners = sub.listeners.filter(({ listener, once }) => {\n const payload = new EventPayload(this, (once ? null : listener), event);\n try {\n listener.call(this, ...args, payload);\n }\n catch (error) { }\n return !once;\n });\n if (sub.listeners.length === 0) {\n if (sub.started) {\n sub.subscriber.stop();\n }\n this.#subs.delete(sub.tag);\n }\n return (count > 0);\n }\n async listenerCount(event) {\n if (event) {\n const sub = await this.#hasSub(event);\n if (!sub) {\n return 0;\n }\n return sub.listeners.length;\n }\n let total = 0;\n for (const { listeners } of this.#subs.values()) {\n total += listeners.length;\n }\n return total;\n }\n async listeners(event) {\n if (event) {\n const sub = await this.#hasSub(event);\n if (!sub) {\n return [];\n }\n return sub.listeners.map(({ listener }) => listener);\n }\n let result = [];\n for (const { listeners } of this.#subs.values()) {\n result = result.concat(listeners.map(({ listener }) => listener));\n }\n return result;\n }\n async off(event, listener) {\n const sub = await this.#hasSub(event);\n if (!sub) {\n return this;\n }\n if (listener) {\n const index = sub.listeners.map(({ listener }) => listener).indexOf(listener);\n if (index >= 0) {\n sub.listeners.splice(index, 1);\n }\n }\n if (!listener || sub.listeners.length === 0) {\n if (sub.started) {\n sub.subscriber.stop();\n }\n this.#subs.delete(sub.tag);\n }\n return this;\n }\n async removeAllListeners(event) {\n if (event) {\n const { tag, started, subscriber } = await this.#getSub(event);\n if (started) {\n subscriber.stop();\n }\n this.#subs.delete(tag);\n }\n else {\n for (const [tag, { started, subscriber }] of this.#subs) {\n if (started) {\n subscriber.stop();\n }\n this.#subs.delete(tag);\n }\n }\n return this;\n }\n // Alias for \"on\"\n async addListener(event, listener) {\n return await this.on(event, listener);\n }\n // Alias for \"off\"\n async removeListener(event, listener) {\n return this.off(event, listener);\n }\n /**\n * If this provider has been destroyed using the [[destroy]] method.\n *\n * Once destroyed, all resources are reclaimed, internal event loops\n * and timers are cleaned up and no further requests may be sent to\n * the provider.\n */\n get destroyed() {\n return this.#destroyed;\n }\n /**\n * Sub-classes may use this to shutdown any sockets or release their\n * resources and reject any pending requests.\n *\n * Sub-classes **must** call ``super.destroy()``.\n */\n destroy() {\n // Stop all listeners\n this.removeAllListeners();\n // Shut down all tiemrs\n for (const timerId of this.#timers.keys()) {\n this._clearTimeout(timerId);\n }\n this.#destroyed = true;\n }\n /**\n * Whether the provider is currently paused.\n *\n * A paused provider will not emit any events, and generally should\n * not make any requests to the network, but that is up to sub-classes\n * to manage.\n *\n * Setting ``paused = true`` is identical to calling ``.pause(false)``,\n * which will buffer any events that occur while paused until the\n * provider is unpaused.\n */\n get paused() { return (this.#pausedState != null); }\n set paused(pause) {\n if (!!pause === this.paused) {\n return;\n }\n if (this.paused) {\n this.resume();\n }\n else {\n this.pause(false);\n }\n }\n /**\n * Pause the provider. If %%dropWhilePaused%%, any events that occur\n * while paused are dropped, otherwise all events will be emitted once\n * the provider is unpaused.\n */\n pause(dropWhilePaused) {\n this.#lastBlockNumber = -1;\n if (this.#pausedState != null) {\n if (this.#pausedState == !!dropWhilePaused) {\n return;\n }\n assert(false, \"cannot change pause type; resume first\", \"UNSUPPORTED_OPERATION\", {\n operation: \"pause\"\n });\n }\n this._forEachSubscriber((s) => s.pause(dropWhilePaused));\n this.#pausedState = !!dropWhilePaused;\n for (const timer of this.#timers.values()) {\n // Clear the timer\n if (timer.timer) {\n clearTimeout(timer.timer);\n }\n // Remaining time needed for when we become unpaused\n timer.time = getTime() - timer.time;\n }\n }\n /**\n * Resume the provider.\n */\n resume() {\n if (this.#pausedState == null) {\n return;\n }\n this._forEachSubscriber((s) => s.resume());\n this.#pausedState = null;\n for (const timer of this.#timers.values()) {\n // Remaining time when we were paused\n let timeout = timer.time;\n if (timeout < 0) {\n timeout = 0;\n }\n // Start time (in cause paused, so we con compute remaininf time)\n timer.time = getTime();\n // Start the timer\n setTimeout(timer.func, timeout);\n }\n }\n}\nfunction _parseString(result, start) {\n try {\n const bytes = _parseBytes(result, start);\n if (bytes) {\n return toUtf8String(bytes);\n }\n }\n catch (error) { }\n return null;\n}\nfunction _parseBytes(result, start) {\n if (result === \"0x\") {\n return null;\n }\n try {\n const offset = getNumber(dataSlice(result, start, start + 32));\n const length = getNumber(dataSlice(result, offset, offset + 32));\n return dataSlice(result, offset + 32, offset + 32 + length);\n }\n catch (error) { }\n return null;\n}\nfunction numPad(value) {\n const result = toBeArray(value);\n if (result.length > 32) {\n throw new Error(\"internal; should not happen\");\n }\n const padded = new Uint8Array(32);\n padded.set(result, 32 - result.length);\n return padded;\n}\nfunction bytesPad(value) {\n if ((value.length % 32) === 0) {\n return value;\n }\n const result = new Uint8Array(Math.ceil(value.length / 32) * 32);\n result.set(value);\n return result;\n}\nconst empty = new Uint8Array([]);\n// ABI Encodes a series of (bytes, bytes, ...)\nfunction encodeBytes(datas) {\n const result = [];\n let byteCount = 0;\n // Add place-holders for pointers as we add items\n for (let i = 0; i < datas.length; i++) {\n result.push(empty);\n byteCount += 32;\n }\n for (let i = 0; i < datas.length; i++) {\n const data = getBytes(datas[i]);\n // Update the bytes offset\n result[i] = numPad(byteCount);\n // The length and padded value of data\n result.push(numPad(data.length));\n result.push(bytesPad(data));\n byteCount += 32 + Math.ceil(data.length / 32) * 32;\n }\n return concat(result);\n}\nconst zeros = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\nfunction parseOffchainLookup(data) {\n const result = {\n sender: \"\", urls: [], calldata: \"\", selector: \"\", extraData: \"\", errorArgs: []\n };\n assert(dataLength(data) >= 5 * 32, \"insufficient OffchainLookup data\", \"OFFCHAIN_FAULT\", {\n reason: \"insufficient OffchainLookup data\"\n });\n const sender = dataSlice(data, 0, 32);\n assert(dataSlice(sender, 0, 12) === dataSlice(zeros, 0, 12), \"corrupt OffchainLookup sender\", \"OFFCHAIN_FAULT\", {\n reason: \"corrupt OffchainLookup sender\"\n });\n result.sender = dataSlice(sender, 12);\n // Read the URLs from the response\n try {\n const urls = [];\n const urlsOffset = getNumber(dataSlice(data, 32, 64));\n const urlsLength = getNumber(dataSlice(data, urlsOffset, urlsOffset + 32));\n const urlsData = dataSlice(data, urlsOffset + 32);\n for (let u = 0; u < urlsLength; u++) {\n const url = _parseString(urlsData, u * 32);\n if (url == null) {\n throw new Error(\"abort\");\n }\n urls.push(url);\n }\n result.urls = urls;\n }\n catch (error) {\n assert(false, \"corrupt OffchainLookup urls\", \"OFFCHAIN_FAULT\", {\n reason: \"corrupt OffchainLookup urls\"\n });\n }\n // Get the CCIP calldata to forward\n try {\n const calldata = _parseBytes(data, 64);\n if (calldata == null) {\n throw new Error(\"abort\");\n }\n result.calldata = calldata;\n }\n catch (error) {\n assert(false, \"corrupt OffchainLookup calldata\", \"OFFCHAIN_FAULT\", {\n reason: \"corrupt OffchainLookup calldata\"\n });\n }\n // Get the callbackSelector (bytes4)\n assert(dataSlice(data, 100, 128) === dataSlice(zeros, 0, 28), \"corrupt OffchainLookup callbaackSelector\", \"OFFCHAIN_FAULT\", {\n reason: \"corrupt OffchainLookup callbaackSelector\"\n });\n result.selector = dataSlice(data, 96, 100);\n // Get the extra data to send back to the contract as context\n try {\n const extraData = _parseBytes(data, 128);\n if (extraData == null) {\n throw new Error(\"abort\");\n }\n result.extraData = extraData;\n }\n catch (error) {\n assert(false, \"corrupt OffchainLookup extraData\", \"OFFCHAIN_FAULT\", {\n reason: \"corrupt OffchainLookup extraData\"\n });\n }\n result.errorArgs = \"sender,urls,calldata,selector,extraData\".split(/,/).map((k) => result[k]);\n return result;\n}\n//# sourceMappingURL=abstract-provider.js.map","/**\n * Generally the [[Wallet]] and [[JsonRpcSigner]] and their sub-classes\n * are sufficent for most developers, but this is provided to\n * fascilitate more complex Signers.\n *\n * @_section: api/providers/abstract-signer: Subclassing Signer [abstract-signer]\n */\nimport { resolveAddress } from \"../address/index.js\";\nimport { Transaction } from \"../transaction/index.js\";\nimport { defineProperties, getBigInt, resolveProperties, assert, assertArgument } from \"../utils/index.js\";\nimport { copyRequest } from \"./provider.js\";\nfunction checkProvider(signer, operation) {\n if (signer.provider) {\n return signer.provider;\n }\n assert(false, \"missing provider\", \"UNSUPPORTED_OPERATION\", { operation });\n}\nasync function populate(signer, tx) {\n let pop = copyRequest(tx);\n if (pop.to != null) {\n pop.to = resolveAddress(pop.to, signer);\n }\n if (pop.from != null) {\n const from = pop.from;\n pop.from = Promise.all([\n signer.getAddress(),\n resolveAddress(from, signer)\n ]).then(([address, from]) => {\n assertArgument(address.toLowerCase() === from.toLowerCase(), \"transaction from mismatch\", \"tx.from\", from);\n return address;\n });\n }\n else {\n pop.from = signer.getAddress();\n }\n return await resolveProperties(pop);\n}\n/**\n * An **AbstractSigner** includes most of teh functionality required\n * to get a [[Signer]] working as expected, but requires a few\n * Signer-specific methods be overridden.\n *\n */\nexport class AbstractSigner {\n /**\n * The provider this signer is connected to.\n */\n provider;\n /**\n * Creates a new Signer connected to %%provider%%.\n */\n constructor(provider) {\n defineProperties(this, { provider: (provider || null) });\n }\n async getNonce(blockTag) {\n return checkProvider(this, \"getTransactionCount\").getTransactionCount(await this.getAddress(), blockTag);\n }\n async populateCall(tx) {\n const pop = await populate(this, tx);\n return pop;\n }\n async populateTransaction(tx) {\n const provider = checkProvider(this, \"populateTransaction\");\n const pop = await populate(this, tx);\n if (pop.nonce == null) {\n pop.nonce = await this.getNonce(\"pending\");\n }\n if (pop.gasLimit == null) {\n pop.gasLimit = await this.estimateGas(pop);\n }\n // Populate the chain ID\n const network = await (this.provider).getNetwork();\n if (pop.chainId != null) {\n const chainId = getBigInt(pop.chainId);\n assertArgument(chainId === network.chainId, \"transaction chainId mismatch\", \"tx.chainId\", tx.chainId);\n }\n else {\n pop.chainId = network.chainId;\n }\n // Do not allow mixing pre-eip-1559 and eip-1559 properties\n const hasEip1559 = (pop.maxFeePerGas != null || pop.maxPriorityFeePerGas != null);\n if (pop.gasPrice != null && (pop.type === 2 || hasEip1559)) {\n assertArgument(false, \"eip-1559 transaction do not support gasPrice\", \"tx\", tx);\n }\n else if ((pop.type === 0 || pop.type === 1) && hasEip1559) {\n assertArgument(false, \"pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas\", \"tx\", tx);\n }\n if ((pop.type === 2 || pop.type == null) && (pop.maxFeePerGas != null && pop.maxPriorityFeePerGas != null)) {\n // Fully-formed EIP-1559 transaction (skip getFeeData)\n pop.type = 2;\n }\n else if (pop.type === 0 || pop.type === 1) {\n // Explicit Legacy or EIP-2930 transaction\n // We need to get fee data to determine things\n const feeData = await provider.getFeeData();\n assert(feeData.gasPrice != null, \"network does not support gasPrice\", \"UNSUPPORTED_OPERATION\", {\n operation: \"getGasPrice\"\n });\n // Populate missing gasPrice\n if (pop.gasPrice == null) {\n pop.gasPrice = feeData.gasPrice;\n }\n }\n else {\n // We need to get fee data to determine things\n const feeData = await provider.getFeeData();\n if (pop.type == null) {\n // We need to auto-detect the intended type of this transaction...\n if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) {\n // The network supports EIP-1559!\n // Upgrade transaction from null to eip-1559\n if (pop.authorizationList && pop.authorizationList.length) {\n pop.type = 4;\n }\n else {\n pop.type = 2;\n }\n if (pop.gasPrice != null) {\n // Using legacy gasPrice property on an eip-1559 network,\n // so use gasPrice as both fee properties\n const gasPrice = pop.gasPrice;\n delete pop.gasPrice;\n pop.maxFeePerGas = gasPrice;\n pop.maxPriorityFeePerGas = gasPrice;\n }\n else {\n // Populate missing fee data\n if (pop.maxFeePerGas == null) {\n pop.maxFeePerGas = feeData.maxFeePerGas;\n }\n if (pop.maxPriorityFeePerGas == null) {\n pop.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n }\n }\n else if (feeData.gasPrice != null) {\n // Network doesn't support EIP-1559...\n // ...but they are trying to use EIP-1559 properties\n assert(!hasEip1559, \"network does not support EIP-1559\", \"UNSUPPORTED_OPERATION\", {\n operation: \"populateTransaction\"\n });\n // Populate missing fee data\n if (pop.gasPrice == null) {\n pop.gasPrice = feeData.gasPrice;\n }\n // Explicitly set untyped transaction to legacy\n // @TODO: Maybe this shold allow type 1?\n pop.type = 0;\n }\n else {\n // getFeeData has failed us.\n assert(false, \"failed to get consistent fee data\", \"UNSUPPORTED_OPERATION\", {\n operation: \"signer.getFeeData\"\n });\n }\n }\n else if (pop.type === 2 || pop.type === 3 || pop.type === 4) {\n // Explicitly using EIP-1559 or EIP-4844\n // Populate missing fee data\n if (pop.maxFeePerGas == null) {\n pop.maxFeePerGas = feeData.maxFeePerGas;\n }\n if (pop.maxPriorityFeePerGas == null) {\n pop.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n }\n }\n }\n //@TOOD: Don't await all over the place; save them up for\n // the end for better batching\n return await resolveProperties(pop);\n }\n async populateAuthorization(_auth) {\n const auth = Object.assign({}, _auth);\n // Add a chain ID if not explicitly set to 0\n if (auth.chainId == null) {\n auth.chainId = (await checkProvider(this, \"getNetwork\").getNetwork()).chainId;\n }\n // @TODO: Take chain ID into account when populating noce?\n if (auth.nonce == null) {\n auth.nonce = await this.getNonce();\n }\n return auth;\n }\n async estimateGas(tx) {\n return checkProvider(this, \"estimateGas\").estimateGas(await this.populateCall(tx));\n }\n async call(tx) {\n return checkProvider(this, \"call\").call(await this.populateCall(tx));\n }\n async resolveName(name) {\n const provider = checkProvider(this, \"resolveName\");\n return await provider.resolveName(name);\n }\n async sendTransaction(tx) {\n const provider = checkProvider(this, \"sendTransaction\");\n const pop = await this.populateTransaction(tx);\n delete pop.from;\n const txObj = Transaction.from(pop);\n return await provider.broadcastTransaction(await this.signTransaction(txObj));\n }\n // @TODO: in v7 move this to be abstract\n authorize(authorization) {\n assert(false, \"authorization not implemented for this signer\", \"UNSUPPORTED_OPERATION\", { operation: \"authorize\" });\n }\n}\n/**\n * A **VoidSigner** is a class deisgned to allow an address to be used\n * in any API which accepts a Signer, but for which there are no\n * credentials available to perform any actual signing.\n *\n * This for example allow impersonating an account for the purpose of\n * static calls or estimating gas, but does not allow sending transactions.\n */\nexport class VoidSigner extends AbstractSigner {\n /**\n * The signer address.\n */\n address;\n /**\n * Creates a new **VoidSigner** with %%address%% attached to\n * %%provider%%.\n */\n constructor(address, provider) {\n super(provider);\n defineProperties(this, { address });\n }\n async getAddress() { return this.address; }\n connect(provider) {\n return new VoidSigner(this.address, provider);\n }\n #throwUnsupported(suffix, operation) {\n assert(false, `VoidSigner cannot sign ${suffix}`, \"UNSUPPORTED_OPERATION\", { operation });\n }\n async signTransaction(tx) {\n this.#throwUnsupported(\"transactions\", \"signTransaction\");\n }\n async signMessage(message) {\n this.#throwUnsupported(\"messages\", \"signMessage\");\n }\n async signTypedData(domain, types, value) {\n this.#throwUnsupported(\"typed-data\", \"signTypedData\");\n }\n}\n//# sourceMappingURL=abstract-signer.js.map","/**\n * There are many awesome community services that provide Ethereum\n * nodes both for developers just starting out and for large-scale\n * communities.\n *\n * @_section: api/providers/thirdparty: Community Providers [thirdparty]\n */\n// Show the throttle message only once per service\nconst shown = new Set();\n/**\n * Displays a warning in the console when the community resource is\n * being used too heavily by the app, recommending the developer\n * acquire their own credentials instead of using the community\n * credentials.\n *\n * The notification will only occur once per service.\n */\nexport function showThrottleMessage(service) {\n if (shown.has(service)) {\n return;\n }\n shown.add(service);\n console.log(\"========= NOTICE =========\");\n console.log(`Request-Rate Exceeded for ${service} (this message will not be repeated)`);\n console.log(\"\");\n console.log(\"The default API keys for each service are provided as a highly-throttled,\");\n console.log(\"community resource for low-traffic projects and early prototyping.\");\n console.log(\"\");\n console.log(\"While your application will continue to function, we highly recommended\");\n console.log(\"signing up for your own API keys to improve performance, increase your\");\n console.log(\"request rate/limit and enable other perks, such as metrics and advanced APIs.\");\n console.log(\"\");\n console.log(\"For more details: https:/\\/docs.ethers.org/api-keys/\");\n console.log(\"==========================\");\n}\n//# sourceMappingURL=community.js.map","import { isError } from \"../utils/index.js\";\nimport { PollingEventSubscriber } from \"./subscriber-polling.js\";\nfunction copy(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n/**\n * Some backends support subscribing to events using a Filter ID.\n *\n * When subscribing with this technique, the node issues a unique\n * //Filter ID//. At this point the node dedicates resources to\n * the filter, so that periodic calls to follow up on the //Filter ID//\n * will receive any events since the last call.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class FilterIdSubscriber {\n #provider;\n #filterIdPromise;\n #poller;\n #running;\n #network;\n #hault;\n /**\n * Creates a new **FilterIdSubscriber** which will used [[_subscribe]]\n * and [[_emitResults]] to setup the subscription and provide the event\n * to the %%provider%%.\n */\n constructor(provider) {\n this.#provider = provider;\n this.#filterIdPromise = null;\n this.#poller = this.#poll.bind(this);\n this.#running = false;\n this.#network = null;\n this.#hault = false;\n }\n /**\n * Sub-classes **must** override this to begin the subscription.\n */\n _subscribe(provider) {\n throw new Error(\"subclasses must override this\");\n }\n /**\n * Sub-classes **must** override this handle the events.\n */\n _emitResults(provider, result) {\n throw new Error(\"subclasses must override this\");\n }\n /**\n * Sub-classes **must** override this handle recovery on errors.\n */\n _recover(provider) {\n throw new Error(\"subclasses must override this\");\n }\n async #poll(blockNumber) {\n try {\n // Subscribe if necessary\n if (this.#filterIdPromise == null) {\n this.#filterIdPromise = this._subscribe(this.#provider);\n }\n // Get the Filter ID\n let filterId = null;\n try {\n filterId = await this.#filterIdPromise;\n }\n catch (error) {\n if (!isError(error, \"UNSUPPORTED_OPERATION\") || error.operation !== \"eth_newFilter\") {\n throw error;\n }\n }\n // The backend does not support Filter ID; downgrade to\n // polling\n if (filterId == null) {\n this.#filterIdPromise = null;\n this.#provider._recoverSubscriber(this, this._recover(this.#provider));\n return;\n }\n const network = await this.#provider.getNetwork();\n if (!this.#network) {\n this.#network = network;\n }\n if (this.#network.chainId !== network.chainId) {\n throw new Error(\"chaid changed\");\n }\n if (this.#hault) {\n return;\n }\n const result = await this.#provider.send(\"eth_getFilterChanges\", [filterId]);\n await this._emitResults(this.#provider, result);\n }\n catch (error) {\n console.log(\"@TODO\", error);\n }\n this.#provider.once(\"block\", this.#poller);\n }\n #teardown() {\n const filterIdPromise = this.#filterIdPromise;\n if (filterIdPromise) {\n this.#filterIdPromise = null;\n filterIdPromise.then((filterId) => {\n if (this.#provider.destroyed) {\n return;\n }\n this.#provider.send(\"eth_uninstallFilter\", [filterId]);\n });\n }\n }\n start() {\n if (this.#running) {\n return;\n }\n this.#running = true;\n this.#poll(-2);\n }\n stop() {\n if (!this.#running) {\n return;\n }\n this.#running = false;\n this.#hault = true;\n this.#teardown();\n this.#provider.off(\"block\", this.#poller);\n }\n pause(dropWhilePaused) {\n if (dropWhilePaused) {\n this.#teardown();\n }\n this.#provider.off(\"block\", this.#poller);\n }\n resume() { this.start(); }\n}\n/**\n * A **FilterIdSubscriber** for receiving contract events.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class FilterIdEventSubscriber extends FilterIdSubscriber {\n #event;\n /**\n * Creates a new **FilterIdEventSubscriber** attached to %%provider%%\n * listening for %%filter%%.\n */\n constructor(provider, filter) {\n super(provider);\n this.#event = copy(filter);\n }\n _recover(provider) {\n return new PollingEventSubscriber(provider, this.#event);\n }\n async _subscribe(provider) {\n const filterId = await provider.send(\"eth_newFilter\", [this.#event]);\n return filterId;\n }\n async _emitResults(provider, results) {\n for (const result of results) {\n provider.emit(this.#event, provider._wrapLog(result, provider._network));\n }\n }\n}\n/**\n * A **FilterIdSubscriber** for receiving pending transactions events.\n *\n * @_docloc: api/providers/abstract-provider\n */\nexport class FilterIdPendingSubscriber extends FilterIdSubscriber {\n async _subscribe(provider) {\n return await provider.send(\"eth_newPendingTransactionFilter\", []);\n }\n async _emitResults(provider, results) {\n for (const result of results) {\n provider.emit(\"pending\", result);\n }\n }\n}\n//# sourceMappingURL=subscriber-filterid.js.map","/**\n * One of the most common ways to interact with the blockchain is\n * by a node running a JSON-RPC interface which can be connected to,\n * based on the transport, using:\n *\n * - HTTP or HTTPS - [[JsonRpcProvider]]\n * - WebSocket - [[WebSocketProvider]]\n * - IPC - [[IpcSocketProvider]]\n *\n * @_section: api/providers/jsonrpc:JSON-RPC Provider [about-jsonrpcProvider]\n */\n// @TODO:\n// - Add the batching API\n// https://playground.open-rpc.org/?schemaUrl=https://raw.githubusercontent.com/ethereum/eth1.0-apis/assembled-spec/openrpc.json&uiSchema%5BappBar%5D%5Bui:splitView%5D=true&uiSchema%5BappBar%5D%5Bui:input%5D=false&uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false\nimport { AbiCoder } from \"../abi/index.js\";\nimport { getAddress, resolveAddress } from \"../address/index.js\";\nimport { TypedDataEncoder } from \"../hash/index.js\";\nimport { accessListify, authorizationify } from \"../transaction/index.js\";\nimport { defineProperties, getBigInt, hexlify, isHexString, toQuantity, toUtf8Bytes, isError, makeError, assert, assertArgument, FetchRequest, resolveProperties } from \"../utils/index.js\";\nimport { AbstractProvider, UnmanagedSubscriber } from \"./abstract-provider.js\";\nimport { AbstractSigner } from \"./abstract-signer.js\";\nimport { Network } from \"./network.js\";\nimport { FilterIdEventSubscriber, FilterIdPendingSubscriber } from \"./subscriber-filterid.js\";\nimport { PollingEventSubscriber } from \"./subscriber-polling.js\";\nconst Primitive = \"bigint,boolean,function,number,string,symbol\".split(/,/g);\n//const Methods = \"getAddress,then\".split(/,/g);\nfunction deepCopy(value) {\n if (value == null || Primitive.indexOf(typeof (value)) >= 0) {\n return value;\n }\n // Keep any Addressable\n if (typeof (value.getAddress) === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return (value.map(deepCopy));\n }\n if (typeof (value) === \"object\") {\n return Object.keys(value).reduce((accum, key) => {\n accum[key] = value[key];\n return accum;\n }, {});\n }\n throw new Error(`should not happen: ${value} (${typeof (value)})`);\n}\nfunction stall(duration) {\n return new Promise((resolve) => { setTimeout(resolve, duration); });\n}\nfunction getLowerCase(value) {\n if (value) {\n return value.toLowerCase();\n }\n return value;\n}\nfunction isPollable(value) {\n return (value && typeof (value.pollingInterval) === \"number\");\n}\nconst defaultOptions = {\n polling: false,\n staticNetwork: null,\n batchStallTime: 10,\n batchMaxSize: (1 << 20),\n batchMaxCount: 100,\n cacheTimeout: 250,\n pollingInterval: 4000\n};\n// @TODO: Unchecked Signers\nexport class JsonRpcSigner extends AbstractSigner {\n address;\n constructor(provider, address) {\n super(provider);\n address = getAddress(address);\n defineProperties(this, { address });\n }\n connect(provider) {\n assert(false, \"cannot reconnect JsonRpcSigner\", \"UNSUPPORTED_OPERATION\", {\n operation: \"signer.connect\"\n });\n }\n async getAddress() {\n return this.address;\n }\n // JSON-RPC will automatially fill in nonce, etc. so we just check from\n async populateTransaction(tx) {\n return await this.populateCall(tx);\n }\n // Returns just the hash of the transaction after sent, which is what\n // the bare JSON-RPC API does;\n async sendUncheckedTransaction(_tx) {\n const tx = deepCopy(_tx);\n const promises = [];\n // Make sure the from matches the sender\n if (tx.from) {\n const _from = tx.from;\n promises.push((async () => {\n const from = await resolveAddress(_from, this.provider);\n assertArgument(from != null && from.toLowerCase() === this.address.toLowerCase(), \"from address mismatch\", \"transaction\", _tx);\n tx.from = from;\n })());\n }\n else {\n tx.from = this.address;\n }\n // The JSON-RPC for eth_sendTransaction uses 90000 gas; if the user\n // wishes to use this, it is easy to specify explicitly, otherwise\n // we look it up for them.\n if (tx.gasLimit == null) {\n promises.push((async () => {\n tx.gasLimit = await this.provider.estimateGas({ ...tx, from: this.address });\n })());\n }\n // The address may be an ENS name or Addressable\n if (tx.to != null) {\n const _to = tx.to;\n promises.push((async () => {\n tx.to = await resolveAddress(_to, this.provider);\n })());\n }\n // Wait until all of our properties are filled in\n if (promises.length) {\n await Promise.all(promises);\n }\n const hexTx = this.provider.getRpcTransaction(tx);\n return this.provider.send(\"eth_sendTransaction\", [hexTx]);\n }\n async sendTransaction(tx) {\n // This cannot be mined any earlier than any recent block\n const blockNumber = await this.provider.getBlockNumber();\n // Send the transaction\n const hash = await this.sendUncheckedTransaction(tx);\n // Unfortunately, JSON-RPC only provides and opaque transaction hash\n // for a response, and we need the actual transaction, so we poll\n // for it; it should show up very quickly\n return await (new Promise((resolve, reject) => {\n const timeouts = [1000, 100];\n let invalids = 0;\n const checkTx = async () => {\n try {\n // Try getting the transaction\n const tx = await this.provider.getTransaction(hash);\n if (tx != null) {\n resolve(tx.replaceableTransaction(blockNumber));\n return;\n }\n }\n catch (error) {\n // If we were cancelled: stop polling.\n // If the data is bad: the node returns bad transactions\n // If the network changed: calling again will also fail\n // If unsupported: likely destroyed\n if (isError(error, \"CANCELLED\") || isError(error, \"BAD_DATA\") ||\n isError(error, \"NETWORK_ERROR\") || isError(error, \"UNSUPPORTED_OPERATION\")) {\n if (error.info == null) {\n error.info = {};\n }\n error.info.sendTransactionHash = hash;\n reject(error);\n return;\n }\n // Stop-gap for misbehaving backends; see #4513\n if (isError(error, \"INVALID_ARGUMENT\")) {\n invalids++;\n if (error.info == null) {\n error.info = {};\n }\n error.info.sendTransactionHash = hash;\n if (invalids > 10) {\n reject(error);\n return;\n }\n }\n // Notify anyone that cares; but we will try again, since\n // it is likely an intermittent service error\n this.provider.emit(\"error\", makeError(\"failed to fetch transation after sending (will try again)\", \"UNKNOWN_ERROR\", { error }));\n }\n // Wait another 4 seconds\n this.provider._setTimeout(() => { checkTx(); }, timeouts.pop() || 4000);\n };\n checkTx();\n }));\n }\n async signTransaction(_tx) {\n const tx = deepCopy(_tx);\n // Make sure the from matches the sender\n if (tx.from) {\n const from = await resolveAddress(tx.from, this.provider);\n assertArgument(from != null && from.toLowerCase() === this.address.toLowerCase(), \"from address mismatch\", \"transaction\", _tx);\n tx.from = from;\n }\n else {\n tx.from = this.address;\n }\n const hexTx = this.provider.getRpcTransaction(tx);\n return await this.provider.send(\"eth_signTransaction\", [hexTx]);\n }\n async signMessage(_message) {\n const message = ((typeof (_message) === \"string\") ? toUtf8Bytes(_message) : _message);\n return await this.provider.send(\"personal_sign\", [\n hexlify(message), this.address.toLowerCase()\n ]);\n }\n async signTypedData(domain, types, _value) {\n const value = deepCopy(_value);\n // Populate any ENS names (in-place)\n const populated = await TypedDataEncoder.resolveNames(domain, types, value, async (value) => {\n const address = await resolveAddress(value);\n assertArgument(address != null, \"TypedData does not support null address\", \"value\", value);\n return address;\n });\n return await this.provider.send(\"eth_signTypedData_v4\", [\n this.address.toLowerCase(),\n JSON.stringify(TypedDataEncoder.getPayload(populated.domain, types, populated.value))\n ]);\n }\n async unlock(password) {\n return this.provider.send(\"personal_unlockAccount\", [\n this.address.toLowerCase(), password, null\n ]);\n }\n // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign\n async _legacySignMessage(_message) {\n const message = ((typeof (_message) === \"string\") ? toUtf8Bytes(_message) : _message);\n return await this.provider.send(\"eth_sign\", [\n this.address.toLowerCase(), hexlify(message)\n ]);\n }\n}\n/**\n * The JsonRpcApiProvider is an abstract class and **MUST** be\n * sub-classed.\n *\n * It provides the base for all JSON-RPC-based Provider interaction.\n *\n * Sub-classing Notes:\n * - a sub-class MUST override _send\n * - a sub-class MUST call the `_start()` method once connected\n */\nexport class JsonRpcApiProvider extends AbstractProvider {\n #options;\n // The next ID to use for the JSON-RPC ID field\n #nextId;\n // Payloads are queued and triggered in batches using the drainTimer\n #payloads;\n #drainTimer;\n #notReady;\n #network;\n #pendingDetectNetwork;\n #scheduleDrain() {\n if (this.#drainTimer) {\n return;\n }\n // If we aren't using batching, no harm in sending it immediately\n const stallTime = (this._getOption(\"batchMaxCount\") === 1) ? 0 : this._getOption(\"batchStallTime\");\n this.#drainTimer = setTimeout(() => {\n this.#drainTimer = null;\n const payloads = this.#payloads;\n this.#payloads = [];\n while (payloads.length) {\n // Create payload batches that satisfy our batch constraints\n const batch = [(payloads.shift())];\n while (payloads.length) {\n if (batch.length === this.#options.batchMaxCount) {\n break;\n }\n batch.push((payloads.shift()));\n const bytes = JSON.stringify(batch.map((p) => p.payload));\n if (bytes.length > this.#options.batchMaxSize) {\n payloads.unshift((batch.pop()));\n break;\n }\n }\n // Process the result to each payload\n (async () => {\n const payload = ((batch.length === 1) ? batch[0].payload : batch.map((p) => p.payload));\n this.emit(\"debug\", { action: \"sendRpcPayload\", payload });\n try {\n const result = await this._send(payload);\n this.emit(\"debug\", { action: \"receiveRpcResult\", result });\n // Process results in batch order\n for (const { resolve, reject, payload } of batch) {\n if (this.destroyed) {\n reject(makeError(\"provider destroyed; cancelled request\", \"UNSUPPORTED_OPERATION\", { operation: payload.method }));\n continue;\n }\n // Find the matching result\n const resp = result.filter((r) => (r.id === payload.id))[0];\n // No result; the node failed us in unexpected ways\n if (resp == null) {\n const error = makeError(\"missing response for request\", \"BAD_DATA\", {\n value: result, info: { payload }\n });\n this.emit(\"error\", error);\n reject(error);\n continue;\n }\n // The response is an error\n if (\"error\" in resp) {\n reject(this.getRpcError(payload, resp));\n continue;\n }\n // All good; send the result\n resolve(resp.result);\n }\n }\n catch (error) {\n this.emit(\"debug\", { action: \"receiveRpcError\", error });\n for (const { reject } of batch) {\n // @TODO: augment the error with the payload\n reject(error);\n }\n }\n })();\n }\n }, stallTime);\n }\n constructor(network, options) {\n super(network, options);\n this.#nextId = 1;\n this.#options = Object.assign({}, defaultOptions, options || {});\n this.#payloads = [];\n this.#drainTimer = null;\n this.#network = null;\n this.#pendingDetectNetwork = null;\n {\n let resolve = null;\n const promise = new Promise((_resolve) => {\n resolve = _resolve;\n });\n this.#notReady = { promise, resolve };\n }\n const staticNetwork = this._getOption(\"staticNetwork\");\n if (typeof (staticNetwork) === \"boolean\") {\n assertArgument(!staticNetwork || network !== \"any\", \"staticNetwork cannot be used on special network 'any'\", \"options\", options);\n if (staticNetwork && network != null) {\n this.#network = Network.from(network);\n }\n }\n else if (staticNetwork) {\n // Make sure any static network is compatbile with the provided netwrok\n assertArgument(network == null || staticNetwork.matches(network), \"staticNetwork MUST match network object\", \"options\", options);\n this.#network = staticNetwork;\n }\n }\n /**\n * Returns the value associated with the option %%key%%.\n *\n * Sub-classes can use this to inquire about configuration options.\n */\n _getOption(key) {\n return this.#options[key];\n }\n /**\n * Gets the [[Network]] this provider has committed to. On each call, the network\n * is detected, and if it has changed, the call will reject.\n */\n get _network() {\n assert(this.#network, \"network is not available yet\", \"NETWORK_ERROR\");\n return this.#network;\n }\n /**\n * Resolves to the non-normalized value by performing %%req%%.\n *\n * Sub-classes may override this to modify behavior of actions,\n * and should generally call ``super._perform`` as a fallback.\n */\n async _perform(req) {\n // Legacy networks do not like the type field being passed along (which\n // is fair), so we delete type if it is 0 and a non-EIP-1559 network\n if (req.method === \"call\" || req.method === \"estimateGas\") {\n let tx = req.transaction;\n if (tx && tx.type != null && getBigInt(tx.type)) {\n // If there are no EIP-1559 or newer properties, it might be pre-EIP-1559\n if (tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null) {\n const feeData = await this.getFeeData();\n if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) {\n // Network doesn't know about EIP-1559 (and hence type)\n req = Object.assign({}, req, {\n transaction: Object.assign({}, tx, { type: undefined })\n });\n }\n }\n }\n }\n const request = this.getRpcRequest(req);\n if (request != null) {\n return await this.send(request.method, request.args);\n }\n return super._perform(req);\n }\n /**\n * Sub-classes may override this; it detects the *actual* network that\n * we are **currently** connected to.\n *\n * Keep in mind that [[send]] may only be used once [[ready]], otherwise the\n * _send primitive must be used instead.\n */\n async _detectNetwork() {\n const network = this._getOption(\"staticNetwork\");\n if (network) {\n if (network === true) {\n if (this.#network) {\n return this.#network;\n }\n }\n else {\n return network;\n }\n }\n if (this.#pendingDetectNetwork) {\n return await this.#pendingDetectNetwork;\n }\n // If we are ready, use ``send``, which enabled requests to be batched\n if (this.ready) {\n this.#pendingDetectNetwork = (async () => {\n try {\n const result = Network.from(getBigInt(await this.send(\"eth_chainId\", [])));\n this.#pendingDetectNetwork = null;\n return result;\n }\n catch (error) {\n this.#pendingDetectNetwork = null;\n throw error;\n }\n })();\n return await this.#pendingDetectNetwork;\n }\n // We are not ready yet; use the primitive _send\n this.#pendingDetectNetwork = (async () => {\n const payload = {\n id: this.#nextId++, method: \"eth_chainId\", params: [], jsonrpc: \"2.0\"\n };\n this.emit(\"debug\", { action: \"sendRpcPayload\", payload });\n let result;\n try {\n result = (await this._send(payload))[0];\n this.#pendingDetectNetwork = null;\n }\n catch (error) {\n this.#pendingDetectNetwork = null;\n this.emit(\"debug\", { action: \"receiveRpcError\", error });\n throw error;\n }\n this.emit(\"debug\", { action: \"receiveRpcResult\", result });\n if (\"result\" in result) {\n return Network.from(getBigInt(result.result));\n }\n throw this.getRpcError(payload, result);\n })();\n return await this.#pendingDetectNetwork;\n }\n /**\n * Sub-classes **MUST** call this. Until [[_start]] has been called, no calls\n * will be passed to [[_send]] from [[send]]. If it is overridden, then\n * ``super._start()`` **MUST** be called.\n *\n * Calling it multiple times is safe and has no effect.\n */\n _start() {\n if (this.#notReady == null || this.#notReady.resolve == null) {\n return;\n }\n this.#notReady.resolve();\n this.#notReady = null;\n (async () => {\n // Bootstrap the network\n while (this.#network == null && !this.destroyed) {\n try {\n this.#network = await this._detectNetwork();\n }\n catch (error) {\n if (this.destroyed) {\n break;\n }\n console.log(\"JsonRpcProvider failed to detect network and cannot start up; retry in 1s (perhaps the URL is wrong or the node is not started)\");\n this.emit(\"error\", makeError(\"failed to bootstrap network detection\", \"NETWORK_ERROR\", { event: \"initial-network-discovery\", info: { error } }));\n await stall(1000);\n }\n }\n // Start dispatching requests\n this.#scheduleDrain();\n })();\n }\n /**\n * Resolves once the [[_start]] has been called. This can be used in\n * sub-classes to defer sending data until the connection has been\n * established.\n */\n async _waitUntilReady() {\n if (this.#notReady == null) {\n return;\n }\n return await this.#notReady.promise;\n }\n /**\n * Return a Subscriber that will manage the %%sub%%.\n *\n * Sub-classes may override this to modify the behavior of\n * subscription management.\n */\n _getSubscriber(sub) {\n // Pending Filters aren't availble via polling\n if (sub.type === \"pending\") {\n return new FilterIdPendingSubscriber(this);\n }\n if (sub.type === \"event\") {\n if (this._getOption(\"polling\")) {\n return new PollingEventSubscriber(this, sub.filter);\n }\n return new FilterIdEventSubscriber(this, sub.filter);\n }\n // Orphaned Logs are handled automatically, by the filter, since\n // logs with removed are emitted by it\n if (sub.type === \"orphan\" && sub.filter.orphan === \"drop-log\") {\n return new UnmanagedSubscriber(\"orphan\");\n }\n return super._getSubscriber(sub);\n }\n /**\n * Returns true only if the [[_start]] has been called.\n */\n get ready() { return this.#notReady == null; }\n /**\n * Returns %%tx%% as a normalized JSON-RPC transaction request,\n * which has all values hexlified and any numeric values converted\n * to Quantity values.\n */\n getRpcTransaction(tx) {\n const result = {};\n // JSON-RPC now requires numeric values to be \"quantity\" values\n [\"chainId\", \"gasLimit\", \"gasPrice\", \"type\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"nonce\", \"value\"].forEach((key) => {\n if (tx[key] == null) {\n return;\n }\n let dstKey = key;\n if (key === \"gasLimit\") {\n dstKey = \"gas\";\n }\n result[dstKey] = toQuantity(getBigInt(tx[key], `tx.${key}`));\n });\n // Make sure addresses and data are lowercase\n [\"from\", \"to\", \"data\"].forEach((key) => {\n if (tx[key] == null) {\n return;\n }\n result[key] = hexlify(tx[key]);\n });\n // Normalize the access list object\n if (tx.accessList) {\n result[\"accessList\"] = accessListify(tx.accessList);\n }\n if (tx.blobVersionedHashes) {\n // @TODO: Remove this case once EIP-4844 added to prepared tx\n result[\"blobVersionedHashes\"] = tx.blobVersionedHashes.map(h => h.toLowerCase());\n }\n if (tx.authorizationList) {\n result[\"authorizationList\"] = tx.authorizationList.map((_a) => {\n const a = authorizationify(_a);\n return {\n address: a.address,\n nonce: toQuantity(a.nonce),\n chainId: toQuantity(a.chainId),\n yParity: toQuantity(a.signature.yParity),\n r: toQuantity(a.signature.r),\n s: toQuantity(a.signature.s),\n };\n });\n }\n // @TODO: blobs should probably also be copied over, optionally\n // accounting for the kzg property to backfill blobVersionedHashes\n // using the commitment. Or should that be left as an exercise to\n // the caller?\n return result;\n }\n /**\n * Returns the request method and arguments required to perform\n * %%req%%.\n */\n getRpcRequest(req) {\n switch (req.method) {\n case \"chainId\":\n return { method: \"eth_chainId\", args: [] };\n case \"getBlockNumber\":\n return { method: \"eth_blockNumber\", args: [] };\n case \"getGasPrice\":\n return { method: \"eth_gasPrice\", args: [] };\n case \"getPriorityFee\":\n return { method: \"eth_maxPriorityFeePerGas\", args: [] };\n case \"getBalance\":\n return {\n method: \"eth_getBalance\",\n args: [getLowerCase(req.address), req.blockTag]\n };\n case \"getTransactionCount\":\n return {\n method: \"eth_getTransactionCount\",\n args: [getLowerCase(req.address), req.blockTag]\n };\n case \"getCode\":\n return {\n method: \"eth_getCode\",\n args: [getLowerCase(req.address), req.blockTag]\n };\n case \"getStorage\":\n return {\n method: \"eth_getStorageAt\",\n args: [\n getLowerCase(req.address),\n (\"0x\" + req.position.toString(16)),\n req.blockTag\n ]\n };\n case \"broadcastTransaction\":\n return {\n method: \"eth_sendRawTransaction\",\n args: [req.signedTransaction]\n };\n case \"getBlock\":\n if (\"blockTag\" in req) {\n return {\n method: \"eth_getBlockByNumber\",\n args: [req.blockTag, !!req.includeTransactions]\n };\n }\n else if (\"blockHash\" in req) {\n return {\n method: \"eth_getBlockByHash\",\n args: [req.blockHash, !!req.includeTransactions]\n };\n }\n break;\n case \"getTransaction\":\n return {\n method: \"eth_getTransactionByHash\",\n args: [req.hash]\n };\n case \"getTransactionReceipt\":\n return {\n method: \"eth_getTransactionReceipt\",\n args: [req.hash]\n };\n case \"call\":\n return {\n method: \"eth_call\",\n args: [this.getRpcTransaction(req.transaction), req.blockTag]\n };\n case \"estimateGas\": {\n return {\n method: \"eth_estimateGas\",\n args: [this.getRpcTransaction(req.transaction)]\n };\n }\n case \"getLogs\":\n if (req.filter && req.filter.address != null) {\n if (Array.isArray(req.filter.address)) {\n req.filter.address = req.filter.address.map(getLowerCase);\n }\n else {\n req.filter.address = getLowerCase(req.filter.address);\n }\n }\n return { method: \"eth_getLogs\", args: [req.filter] };\n }\n return null;\n }\n /**\n * Returns an ethers-style Error for the given JSON-RPC error\n * %%payload%%, coalescing the various strings and error shapes\n * that different nodes return, coercing them into a machine-readable\n * standardized error.\n */\n getRpcError(payload, _error) {\n const { method } = payload;\n const { error } = _error;\n if (method === \"eth_estimateGas\" && error.message) {\n const msg = error.message;\n if (!msg.match(/revert/i) && msg.match(/insufficient funds/i)) {\n return makeError(\"insufficient funds\", \"INSUFFICIENT_FUNDS\", {\n transaction: (payload.params[0]),\n info: { payload, error }\n });\n }\n else if (msg.match(/nonce/i) && msg.match(/too low/i)) {\n return makeError(\"nonce has already been used\", \"NONCE_EXPIRED\", {\n transaction: (payload.params[0]),\n info: { payload, error }\n });\n }\n }\n if (method === \"eth_call\" || method === \"eth_estimateGas\") {\n const result = spelunkData(error);\n const e = AbiCoder.getBuiltinCallException((method === \"eth_call\") ? \"call\" : \"estimateGas\", (payload.params[0]), (result ? result.data : null));\n e.info = { error, payload };\n return e;\n }\n // Only estimateGas and call can return arbitrary contract-defined text, so now we\n // we can process text safely.\n const message = JSON.stringify(spelunkMessage(error));\n if (typeof (error.message) === \"string\" && error.message.match(/user denied|ethers-user-denied/i)) {\n const actionMap = {\n eth_sign: \"signMessage\",\n personal_sign: \"signMessage\",\n eth_signTypedData_v4: \"signTypedData\",\n eth_signTransaction: \"signTransaction\",\n eth_sendTransaction: \"sendTransaction\",\n eth_requestAccounts: \"requestAccess\",\n wallet_requestAccounts: \"requestAccess\",\n };\n return makeError(`user rejected action`, \"ACTION_REJECTED\", {\n action: (actionMap[method] || \"unknown\"),\n reason: \"rejected\",\n info: { payload, error }\n });\n }\n if (method === \"eth_sendRawTransaction\" || method === \"eth_sendTransaction\") {\n const transaction = (payload.params[0]);\n if (message.match(/insufficient funds|base fee exceeds gas limit/i)) {\n return makeError(\"insufficient funds for intrinsic transaction cost\", \"INSUFFICIENT_FUNDS\", {\n transaction, info: { error }\n });\n }\n if (message.match(/nonce/i) && message.match(/too low/i)) {\n return makeError(\"nonce has already been used\", \"NONCE_EXPIRED\", { transaction, info: { error } });\n }\n // \"replacement transaction underpriced\"\n if (message.match(/replacement transaction/i) && message.match(/underpriced/i)) {\n return makeError(\"replacement fee too low\", \"REPLACEMENT_UNDERPRICED\", { transaction, info: { error } });\n }\n if (message.match(/only replay-protected/i)) {\n return makeError(\"legacy pre-eip-155 transactions not supported\", \"UNSUPPORTED_OPERATION\", {\n operation: method, info: { transaction, info: { error } }\n });\n }\n }\n let unsupported = !!message.match(/the method .* does not exist/i);\n if (!unsupported) {\n if (error && error.details && error.details.startsWith(\"Unauthorized method:\")) {\n unsupported = true;\n }\n }\n if (unsupported) {\n return makeError(\"unsupported operation\", \"UNSUPPORTED_OPERATION\", {\n operation: payload.method, info: { error, payload }\n });\n }\n return makeError(\"could not coalesce error\", \"UNKNOWN_ERROR\", { error, payload });\n }\n /**\n * Requests the %%method%% with %%params%% via the JSON-RPC protocol\n * over the underlying channel. This can be used to call methods\n * on the backend that do not have a high-level API within the Provider\n * API.\n *\n * This method queues requests according to the batch constraints\n * in the options, assigns the request a unique ID.\n *\n * **Do NOT override** this method in sub-classes; instead\n * override [[_send]] or force the options values in the\n * call to the constructor to modify this method's behavior.\n */\n send(method, params) {\n // @TODO: cache chainId?? purge on switch_networks\n // We have been destroyed; no operations are supported anymore\n if (this.destroyed) {\n return Promise.reject(makeError(\"provider destroyed; cancelled request\", \"UNSUPPORTED_OPERATION\", { operation: method }));\n }\n const id = this.#nextId++;\n const promise = new Promise((resolve, reject) => {\n this.#payloads.push({\n resolve, reject,\n payload: { method, params, id, jsonrpc: \"2.0\" }\n });\n });\n // If there is not a pending drainTimer, set one\n this.#scheduleDrain();\n return promise;\n }\n /**\n * Resolves to the [[Signer]] account for %%address%% managed by\n * the client.\n *\n * If the %%address%% is a number, it is used as an index in the\n * the accounts from [[listAccounts]].\n *\n * This can only be used on clients which manage accounts (such as\n * Geth with imported account or MetaMask).\n *\n * Throws if the account doesn't exist.\n */\n async getSigner(address) {\n if (address == null) {\n address = 0;\n }\n const accountsPromise = this.send(\"eth_accounts\", []);\n // Account index\n if (typeof (address) === \"number\") {\n const accounts = (await accountsPromise);\n if (address >= accounts.length) {\n throw new Error(\"no such account\");\n }\n return new JsonRpcSigner(this, accounts[address]);\n }\n const { accounts } = await resolveProperties({\n network: this.getNetwork(),\n accounts: accountsPromise\n });\n // Account address\n address = getAddress(address);\n for (const account of accounts) {\n if (getAddress(account) === address) {\n return new JsonRpcSigner(this, address);\n }\n }\n throw new Error(\"invalid account\");\n }\n async listAccounts() {\n const accounts = await this.send(\"eth_accounts\", []);\n return accounts.map((a) => new JsonRpcSigner(this, a));\n }\n destroy() {\n // Stop processing requests\n if (this.#drainTimer) {\n clearTimeout(this.#drainTimer);\n this.#drainTimer = null;\n }\n // Cancel all pending requests\n for (const { payload, reject } of this.#payloads) {\n reject(makeError(\"provider destroyed; cancelled request\", \"UNSUPPORTED_OPERATION\", { operation: payload.method }));\n }\n this.#payloads = [];\n // Parent clean-up\n super.destroy();\n }\n}\n// @TODO: remove this in v7, it is not exported because this functionality\n// is exposed in the JsonRpcApiProvider by setting polling to true. It should\n// be safe to remove regardless, because it isn't reachable, but just in case.\n/**\n * @_ignore:\n */\nexport class JsonRpcApiPollingProvider extends JsonRpcApiProvider {\n #pollingInterval;\n constructor(network, options) {\n super(network, options);\n let pollingInterval = this._getOption(\"pollingInterval\");\n if (pollingInterval == null) {\n pollingInterval = defaultOptions.pollingInterval;\n }\n this.#pollingInterval = pollingInterval;\n }\n _getSubscriber(sub) {\n const subscriber = super._getSubscriber(sub);\n if (isPollable(subscriber)) {\n subscriber.pollingInterval = this.#pollingInterval;\n }\n return subscriber;\n }\n /**\n * The polling interval (default: 4000 ms)\n */\n get pollingInterval() { return this.#pollingInterval; }\n set pollingInterval(value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\"invalid interval\");\n }\n this.#pollingInterval = value;\n this._forEachSubscriber((sub) => {\n if (isPollable(sub)) {\n sub.pollingInterval = this.#pollingInterval;\n }\n });\n }\n}\n/**\n * The JsonRpcProvider is one of the most common Providers,\n * which performs all operations over HTTP (or HTTPS) requests.\n *\n * Events are processed by polling the backend for the current block\n * number; when it advances, all block-base events are then checked\n * for updates.\n */\nexport class JsonRpcProvider extends JsonRpcApiPollingProvider {\n #connect;\n constructor(url, network, options) {\n if (url == null) {\n url = \"http:/\\/localhost:8545\";\n }\n super(network, options);\n if (typeof (url) === \"string\") {\n this.#connect = new FetchRequest(url);\n }\n else {\n this.#connect = url.clone();\n }\n }\n _getConnection() {\n return this.#connect.clone();\n }\n async send(method, params) {\n // All requests are over HTTP, so we can just start handling requests\n // We do this here rather than the constructor so that we don't send any\n // requests to the network (i.e. eth_chainId) until we absolutely have to.\n await this._start();\n return await super.send(method, params);\n }\n async _send(payload) {\n // Configure a POST connection for the requested method\n const request = this._getConnection();\n request.body = JSON.stringify(payload);\n request.setHeader(\"content-type\", \"application/json\");\n const response = await request.send();\n response.assertOk();\n let resp = response.bodyJson;\n if (!Array.isArray(resp)) {\n resp = [resp];\n }\n return resp;\n }\n}\nfunction spelunkData(value) {\n if (value == null) {\n return null;\n }\n // These *are* the droids we're looking for.\n if (typeof (value.message) === \"string\" && value.message.match(/revert/i) && isHexString(value.data)) {\n return { message: value.message, data: value.data };\n }\n // Spelunk further...\n if (typeof (value) === \"object\") {\n for (const key in value) {\n const result = spelunkData(value[key]);\n if (result) {\n return result;\n }\n }\n return null;\n }\n // Might be a JSON string we can further descend...\n if (typeof (value) === \"string\") {\n try {\n return spelunkData(JSON.parse(value));\n }\n catch (error) { }\n }\n return null;\n}\nfunction _spelunkMessage(value, result) {\n if (value == null) {\n return;\n }\n // These *are* the droids we're looking for.\n if (typeof (value.message) === \"string\") {\n result.push(value.message);\n }\n // Spelunk further...\n if (typeof (value) === \"object\") {\n for (const key in value) {\n _spelunkMessage(value[key], result);\n }\n }\n // Might be a JSON string we can further descend...\n if (typeof (value) === \"string\") {\n try {\n return _spelunkMessage(JSON.parse(value), result);\n }\n catch (error) { }\n }\n}\nfunction spelunkMessage(value) {\n const result = [];\n _spelunkMessage(value, result);\n return result;\n}\n//# sourceMappingURL=provider-jsonrpc.js.map","/**\n * [[link-ankr]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Sepolia Testnet (``sepolia``)\n * - Arbitrum (``arbitrum``)\n * - Base (``base``)\n * - Base Goerlia Testnet (``base-goerli``)\n * - Base Sepolia Testnet (``base-sepolia``)\n * - BNB (``bnb``)\n * - BNB Testnet (``bnbt``)\n * - Optimism (``optimism``)\n * - Optimism Goerli Testnet (``optimism-goerli``)\n * - Optimism Sepolia Testnet (``optimism-sepolia``)\n * - Polygon (``matic``)\n * - Polygon Mumbai Testnet (``matic-mumbai``)\n *\n * @_subsection: api/providers/thirdparty:Ankr [providers-ankr]\n */\nimport { defineProperties, FetchRequest, assertArgument } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nconst defaultApiKey = \"9f7d929b018cdffb338517efa06f58359e86ff1ffd350bc889738523659e7972\";\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"rpc.ankr.com/eth\";\n case \"goerli\":\n return \"rpc.ankr.com/eth_goerli\";\n case \"sepolia\":\n return \"rpc.ankr.com/eth_sepolia\";\n case \"arbitrum\":\n return \"rpc.ankr.com/arbitrum\";\n case \"base\":\n return \"rpc.ankr.com/base\";\n case \"base-goerli\":\n return \"rpc.ankr.com/base_goerli\";\n case \"base-sepolia\":\n return \"rpc.ankr.com/base_sepolia\";\n case \"bnb\":\n return \"rpc.ankr.com/bsc\";\n case \"bnbt\":\n return \"rpc.ankr.com/bsc_testnet_chapel\";\n case \"matic\":\n return \"rpc.ankr.com/polygon\";\n case \"matic-mumbai\":\n return \"rpc.ankr.com/polygon_mumbai\";\n case \"optimism\":\n return \"rpc.ankr.com/optimism\";\n case \"optimism-goerli\":\n return \"rpc.ankr.com/optimism_testnet\";\n case \"optimism-sepolia\":\n return \"rpc.ankr.com/optimism_sepolia\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **AnkrProvider** connects to the [[link-ankr]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-ankr-signup).\n */\nexport class AnkrProvider extends JsonRpcProvider {\n /**\n * The API key for the Ankr connection.\n */\n apiKey;\n /**\n * Create a new **AnkrProvider**.\n *\n * By default connecting to ``mainnet`` with a highly throttled\n * API key.\n */\n constructor(_network, apiKey) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (apiKey == null) {\n apiKey = defaultApiKey;\n }\n // Ankr does not support filterId, so we force polling\n const options = { polling: true, staticNetwork: network };\n const request = AnkrProvider.getRequest(network, apiKey);\n super(request, network, options);\n defineProperties(this, { apiKey });\n }\n _getProvider(chainId) {\n try {\n return new AnkrProvider(chainId, this.apiKey);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n /**\n * Returns a prepared request for connecting to %%network%% with\n * %%apiKey%%.\n */\n static getRequest(network, apiKey) {\n if (apiKey == null) {\n apiKey = defaultApiKey;\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/${apiKey}`);\n request.allowGzip = true;\n if (apiKey === defaultApiKey) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"AnkrProvider\");\n return true;\n };\n }\n return request;\n }\n getRpcError(payload, error) {\n if (payload.method === \"eth_sendRawTransaction\") {\n if (error && error.error && error.error.message === \"INTERNAL_ERROR: could not replace existing tx\") {\n error.error.message = \"replacement transaction underpriced\";\n }\n }\n return super.getRpcError(payload, error);\n }\n isCommunityResource() {\n return (this.apiKey === defaultApiKey);\n }\n}\n//# sourceMappingURL=provider-ankr.js.map","/**\n * [[link-alchemy]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Sepolia Testnet (``sepolia``)\n * - Arbitrum (``arbitrum``)\n * - Arbitrum Goerli Testnet (``arbitrum-goerli``)\n * - Arbitrum Sepolia Testnet (``arbitrum-sepolia``)\n * - Base (``base``)\n * - Base Goerlia Testnet (``base-goerli``)\n * - Base Sepolia Testnet (``base-sepolia``)\n * - Optimism (``optimism``)\n * - Optimism Goerli Testnet (``optimism-goerli``)\n * - Optimism Sepolia Testnet (``optimism-sepolia``)\n * - Polygon (``matic``)\n * - Polygon Amoy Testnet (``matic-amoy``)\n * - Polygon Mumbai Testnet (``matic-mumbai``)\n *\n * @_subsection: api/providers/thirdparty:Alchemy [providers-alchemy]\n */\nimport { defineProperties, resolveProperties, assert, assertArgument, FetchRequest } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nconst defaultApiKey = \"_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC\";\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"eth-mainnet.alchemyapi.io\";\n case \"goerli\":\n return \"eth-goerli.g.alchemy.com\";\n case \"sepolia\":\n return \"eth-sepolia.g.alchemy.com\";\n case \"arbitrum\":\n return \"arb-mainnet.g.alchemy.com\";\n case \"arbitrum-goerli\":\n return \"arb-goerli.g.alchemy.com\";\n case \"arbitrum-sepolia\":\n return \"arb-sepolia.g.alchemy.com\";\n case \"base\":\n return \"base-mainnet.g.alchemy.com\";\n case \"base-goerli\":\n return \"base-goerli.g.alchemy.com\";\n case \"base-sepolia\":\n return \"base-sepolia.g.alchemy.com\";\n case \"matic\":\n return \"polygon-mainnet.g.alchemy.com\";\n case \"matic-amoy\":\n return \"polygon-amoy.g.alchemy.com\";\n case \"matic-mumbai\":\n return \"polygon-mumbai.g.alchemy.com\";\n case \"optimism\":\n return \"opt-mainnet.g.alchemy.com\";\n case \"optimism-goerli\":\n return \"opt-goerli.g.alchemy.com\";\n case \"optimism-sepolia\":\n return \"opt-sepolia.g.alchemy.com\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **AlchemyProvider** connects to the [[link-alchemy]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-alchemy-signup).\n *\n * @_docloc: api/providers/thirdparty\n */\nexport class AlchemyProvider extends JsonRpcProvider {\n apiKey;\n constructor(_network, apiKey) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (apiKey == null) {\n apiKey = defaultApiKey;\n }\n const request = AlchemyProvider.getRequest(network, apiKey);\n super(request, network, { staticNetwork: network });\n defineProperties(this, { apiKey });\n }\n _getProvider(chainId) {\n try {\n return new AlchemyProvider(chainId, this.apiKey);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n async _perform(req) {\n // https://docs.alchemy.com/reference/trace-transaction\n if (req.method === \"getTransactionResult\") {\n const { trace, tx } = await resolveProperties({\n trace: this.send(\"trace_transaction\", [req.hash]),\n tx: this.getTransaction(req.hash)\n });\n if (trace == null || tx == null) {\n return null;\n }\n let data;\n let error = false;\n try {\n data = trace[0].result.output;\n error = (trace[0].error === \"Reverted\");\n }\n catch (error) { }\n if (data) {\n assert(!error, \"an error occurred during transaction executions\", \"CALL_EXCEPTION\", {\n action: \"getTransactionResult\",\n data,\n reason: null,\n transaction: tx,\n invocation: null,\n revert: null // @TODO\n });\n return data;\n }\n assert(false, \"could not parse trace result\", \"BAD_DATA\", { value: trace });\n }\n return await super._perform(req);\n }\n isCommunityResource() {\n return (this.apiKey === defaultApiKey);\n }\n static getRequest(network, apiKey) {\n if (apiKey == null) {\n apiKey = defaultApiKey;\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/v2/${apiKey}`);\n request.allowGzip = true;\n if (apiKey === defaultApiKey) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"alchemy\");\n return true;\n };\n }\n return request;\n }\n}\n//# sourceMappingURL=provider-alchemy.js.map","/**\n * [[link-chainstack]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Arbitrum (``arbitrum``)\n * - BNB Smart Chain Mainnet (``bnb``)\n * - Polygon (``matic``)\n *\n * @_subsection: api/providers/thirdparty:Chainstack [providers-chainstack]\n */\nimport { defineProperties, FetchRequest, assertArgument } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nfunction getApiKey(name) {\n switch (name) {\n case \"mainnet\": return \"39f1d67cedf8b7831010a665328c9197\";\n case \"arbitrum\": return \"0550c209db33c3abf4cc927e1e18cea1\";\n case \"bnb\": return \"98b5a77e531614387366f6fc5da097f8\";\n case \"matic\": return \"cd9d4d70377471aa7c142ec4a4205249\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"ethereum-mainnet.core.chainstack.com\";\n case \"arbitrum\":\n return \"arbitrum-mainnet.core.chainstack.com\";\n case \"bnb\":\n return \"bsc-mainnet.core.chainstack.com\";\n case \"matic\":\n return \"polygon-mainnet.core.chainstack.com\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **ChainstackProvider** connects to the [[link-chainstack]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-chainstack).\n */\nexport class ChainstackProvider extends JsonRpcProvider {\n /**\n * The API key for the Chainstack connection.\n */\n apiKey;\n /**\n * Creates a new **ChainstackProvider**.\n */\n constructor(_network, apiKey) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (apiKey == null) {\n apiKey = getApiKey(network.name);\n }\n const request = ChainstackProvider.getRequest(network, apiKey);\n super(request, network, { staticNetwork: network });\n defineProperties(this, { apiKey });\n }\n _getProvider(chainId) {\n try {\n return new ChainstackProvider(chainId, this.apiKey);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n isCommunityResource() {\n return (this.apiKey === getApiKey(this._network.name));\n }\n /**\n * Returns a prepared request for connecting to %%network%%\n * with %%apiKey%% and %%projectSecret%%.\n */\n static getRequest(network, apiKey) {\n if (apiKey == null) {\n apiKey = getApiKey(network.name);\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/${apiKey}`);\n request.allowGzip = true;\n if (apiKey === getApiKey(network.name)) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"ChainstackProvider\");\n return true;\n };\n }\n return request;\n }\n}\n//# sourceMappingURL=provider-chainstack.js.map","/**\n * About Cloudflare\n *\n * @_subsection: api/providers/thirdparty:Cloudflare [providers-cloudflare]\n */\nimport { assertArgument } from \"../utils/index.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\n/**\n * About Cloudflare...\n */\nexport class CloudflareProvider extends JsonRpcProvider {\n constructor(_network) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n assertArgument(network.name === \"mainnet\", \"unsupported network\", \"network\", _network);\n super(\"https:/\\/cloudflare-eth.com/\", network, { staticNetwork: network });\n }\n}\n//# sourceMappingURL=provider-cloudflare.js.map","/**\n * [[link-etherscan]] provides a third-party service for connecting to\n * various blockchains over a combination of JSON-RPC and custom API\n * endpoints.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Sepolia Testnet (``sepolia``)\n * - Holesky Testnet (``holesky``)\n * - Arbitrum (``arbitrum``)\n * - Arbitrum Goerli Testnet (``arbitrum-goerli``)\n * - Base (``base``)\n * - Base Sepolia Testnet (``base-sepolia``)\n * - BNB Smart Chain Mainnet (``bnb``)\n * - BNB Smart Chain Testnet (``bnbt``)\n * - Optimism (``optimism``)\n * - Optimism Goerli Testnet (``optimism-goerli``)\n * - Polygon (``matic``)\n * - Polygon Mumbai Testnet (``matic-mumbai``)\n * - Polygon Amoy Testnet (``matic-amoy``)\n *\n * @_subsection api/providers/thirdparty:Etherscan [providers-etherscan]\n */\nimport { AbiCoder } from \"../abi/index.js\";\nimport { Contract } from \"../contract/index.js\";\nimport { accessListify, Transaction } from \"../transaction/index.js\";\nimport { defineProperties, hexlify, toQuantity, FetchRequest, assert, assertArgument, isError, \n// parseUnits,\ntoUtf8String } from \"../utils/index.js\";\nimport { AbstractProvider } from \"./abstract-provider.js\";\nimport { Network } from \"./network.js\";\nimport { NetworkPlugin } from \"./plugins-network.js\";\nimport { showThrottleMessage } from \"./community.js\";\nconst THROTTLE = 2000;\nfunction isPromise(value) {\n return (value && typeof (value.then) === \"function\");\n}\nconst EtherscanPluginId = \"org.ethers.plugins.provider.Etherscan\";\n/**\n * A Network can include an **EtherscanPlugin** to provide\n * a custom base URL.\n *\n * @_docloc: api/providers/thirdparty:Etherscan\n */\nexport class EtherscanPlugin extends NetworkPlugin {\n /**\n * The Etherscan API base URL.\n */\n baseUrl;\n /**\n * Creates a new **EtherscanProvider** which will use\n * %%baseUrl%%.\n */\n constructor(baseUrl) {\n super(EtherscanPluginId);\n defineProperties(this, { baseUrl });\n }\n clone() {\n return new EtherscanPlugin(this.baseUrl);\n }\n}\nconst skipKeys = [\"enableCcipRead\"];\nlet nextId = 1;\n/**\n * The **EtherscanBaseProvider** is the super-class of\n * [[EtherscanProvider]], which should generally be used instead.\n *\n * Since the **EtherscanProvider** includes additional code for\n * [[Contract]] access, in //rare cases// that contracts are not\n * used, this class can reduce code size.\n *\n * @_docloc: api/providers/thirdparty:Etherscan\n */\nexport class EtherscanProvider extends AbstractProvider {\n /**\n * The connected network.\n */\n network;\n /**\n * The API key or null if using the community provided bandwidth.\n */\n apiKey;\n #plugin;\n /**\n * Creates a new **EtherscanBaseProvider**.\n */\n constructor(_network, _apiKey) {\n const apiKey = (_apiKey != null) ? _apiKey : null;\n super();\n const network = Network.from(_network);\n this.#plugin = network.getPlugin(EtherscanPluginId);\n defineProperties(this, { apiKey, network });\n }\n /**\n * Returns the base URL.\n *\n * If an [[EtherscanPlugin]] is configured on the\n * [[EtherscanBaseProvider_network]], returns the plugin's\n * baseUrl.\n *\n * Deprecated; for Etherscan v2 the base is no longer a simply\n * host, but instead a URL including a chainId parameter. Changing\n * this to return a URL prefix could break some libraries, so it\n * is left intact but will be removed in the future as it is unused.\n */\n getBaseUrl() {\n if (this.#plugin) {\n return this.#plugin.baseUrl;\n }\n switch (this.network.name) {\n case \"mainnet\":\n return \"https:/\\/api.etherscan.io\";\n case \"goerli\":\n return \"https:/\\/api-goerli.etherscan.io\";\n case \"sepolia\":\n return \"https:/\\/api-sepolia.etherscan.io\";\n case \"holesky\":\n return \"https:/\\/api-holesky.etherscan.io\";\n case \"arbitrum\":\n return \"https:/\\/api.arbiscan.io\";\n case \"arbitrum-goerli\":\n return \"https:/\\/api-goerli.arbiscan.io\";\n case \"base\":\n return \"https:/\\/api.basescan.org\";\n case \"base-sepolia\":\n return \"https:/\\/api-sepolia.basescan.org\";\n case \"bnb\":\n return \"https:/\\/api.bscscan.com\";\n case \"bnbt\":\n return \"https:/\\/api-testnet.bscscan.com\";\n case \"matic\":\n return \"https:/\\/api.polygonscan.com\";\n case \"matic-amoy\":\n return \"https:/\\/api-amoy.polygonscan.com\";\n case \"matic-mumbai\":\n return \"https:/\\/api-testnet.polygonscan.com\";\n case \"optimism\":\n return \"https:/\\/api-optimistic.etherscan.io\";\n case \"optimism-goerli\":\n return \"https:/\\/api-goerli-optimistic.etherscan.io\";\n default:\n }\n assertArgument(false, \"unsupported network\", \"network\", this.network);\n }\n /**\n * Returns the URL for the %%module%% and %%params%%.\n */\n getUrl(module, params) {\n let query = Object.keys(params).reduce((accum, key) => {\n const value = params[key];\n if (value != null) {\n accum += `&${key}=${value}`;\n }\n return accum;\n }, \"\");\n if (this.apiKey) {\n query += `&apikey=${this.apiKey}`;\n }\n return `https:/\\/api.etherscan.io/v2/api?chainid=${this.network.chainId}&module=${module}${query}`;\n }\n /**\n * Returns the URL for using POST requests.\n */\n getPostUrl() {\n return `https:/\\/api.etherscan.io/v2/api?chainid=${this.network.chainId}`;\n }\n /**\n * Returns the parameters for using POST requests.\n */\n getPostData(module, params) {\n params.module = module;\n params.apikey = this.apiKey;\n params.chainid = this.network.chainId;\n return params;\n }\n async detectNetwork() {\n return this.network;\n }\n /**\n * Resolves to the result of calling %%module%% with %%params%%.\n *\n * If %%post%%, the request is made as a POST request.\n */\n async fetch(module, params, post) {\n const id = nextId++;\n const url = (post ? this.getPostUrl() : this.getUrl(module, params));\n const payload = (post ? this.getPostData(module, params) : null);\n this.emit(\"debug\", { action: \"sendRequest\", id, url, payload: payload });\n const request = new FetchRequest(url);\n request.setThrottleParams({ slotInterval: 1000 });\n request.retryFunc = (req, resp, attempt) => {\n if (this.isCommunityResource()) {\n showThrottleMessage(\"Etherscan\");\n }\n return Promise.resolve(true);\n };\n request.processFunc = async (request, response) => {\n const result = response.hasBody() ? JSON.parse(toUtf8String(response.body)) : {};\n const throttle = ((typeof (result.result) === \"string\") ? result.result : \"\").toLowerCase().indexOf(\"rate limit\") >= 0;\n if (module === \"proxy\") {\n // This JSON response indicates we are being throttled\n if (result && result.status == 0 && result.message == \"NOTOK\" && throttle) {\n this.emit(\"debug\", { action: \"receiveError\", id, reason: \"proxy-NOTOK\", error: result });\n response.throwThrottleError(result.result, THROTTLE);\n }\n }\n else {\n if (throttle) {\n this.emit(\"debug\", { action: \"receiveError\", id, reason: \"null result\", error: result.result });\n response.throwThrottleError(result.result, THROTTLE);\n }\n }\n return response;\n };\n if (payload) {\n request.setHeader(\"content-type\", \"application/x-www-form-urlencoded; charset=UTF-8\");\n request.body = Object.keys(payload).map((k) => `${k}=${payload[k]}`).join(\"&\");\n }\n const response = await request.send();\n try {\n response.assertOk();\n }\n catch (error) {\n this.emit(\"debug\", { action: \"receiveError\", id, error, reason: \"assertOk\" });\n assert(false, \"response error\", \"SERVER_ERROR\", { request, response });\n }\n if (!response.hasBody()) {\n this.emit(\"debug\", { action: \"receiveError\", id, error: \"missing body\", reason: \"null body\" });\n assert(false, \"missing response\", \"SERVER_ERROR\", { request, response });\n }\n const result = JSON.parse(toUtf8String(response.body));\n if (module === \"proxy\") {\n if (result.jsonrpc != \"2.0\") {\n this.emit(\"debug\", { action: \"receiveError\", id, result, reason: \"invalid JSON-RPC\" });\n assert(false, \"invalid JSON-RPC response (missing jsonrpc='2.0')\", \"SERVER_ERROR\", { request, response, info: { result } });\n }\n if (result.error) {\n this.emit(\"debug\", { action: \"receiveError\", id, result, reason: \"JSON-RPC error\" });\n assert(false, \"error response\", \"SERVER_ERROR\", { request, response, info: { result } });\n }\n this.emit(\"debug\", { action: \"receiveRequest\", id, result });\n return result.result;\n }\n else {\n // getLogs, getHistory have weird success responses\n if (result.status == 0 && (result.message === \"No records found\" || result.message === \"No transactions found\")) {\n this.emit(\"debug\", { action: \"receiveRequest\", id, result });\n return result.result;\n }\n if (result.status != 1 || (typeof (result.message) === \"string\" && !result.message.match(/^OK/))) {\n this.emit(\"debug\", { action: \"receiveError\", id, result });\n assert(false, \"error response\", \"SERVER_ERROR\", { request, response, info: { result } });\n }\n this.emit(\"debug\", { action: \"receiveRequest\", id, result });\n return result.result;\n }\n }\n /**\n * Returns %%transaction%% normalized for the Etherscan API.\n */\n _getTransactionPostData(transaction) {\n const result = {};\n for (let key in transaction) {\n if (skipKeys.indexOf(key) >= 0) {\n continue;\n }\n if (transaction[key] == null) {\n continue;\n }\n let value = transaction[key];\n if (key === \"type\" && value === 0) {\n continue;\n }\n if (key === \"blockTag\" && value === \"latest\") {\n continue;\n }\n // Quantity-types require no leading zero, unless 0\n if ({ type: true, gasLimit: true, gasPrice: true, maxFeePerGs: true, maxPriorityFeePerGas: true, nonce: true, value: true }[key]) {\n value = toQuantity(value);\n }\n else if (key === \"accessList\") {\n value = \"[\" + accessListify(value).map((set) => {\n return `{address:\"${set.address}\",storageKeys:[\"${set.storageKeys.join('\",\"')}\"]}`;\n }).join(\",\") + \"]\";\n }\n else if (key === \"blobVersionedHashes\") {\n if (value.length === 0) {\n continue;\n }\n // @TODO: update this once the API supports blobs\n assert(false, \"Etherscan API does not support blobVersionedHashes\", \"UNSUPPORTED_OPERATION\", {\n operation: \"_getTransactionPostData\",\n info: { transaction }\n });\n }\n else {\n value = hexlify(value);\n }\n result[key] = value;\n }\n return result;\n }\n /**\n * Throws the normalized Etherscan error.\n */\n _checkError(req, error, transaction) {\n // Pull any message out if, possible\n let message = \"\";\n if (isError(error, \"SERVER_ERROR\")) {\n // Check for an error emitted by a proxy call\n try {\n message = error.info.result.error.message;\n }\n catch (e) { }\n if (!message) {\n try {\n message = error.info.message;\n }\n catch (e) { }\n }\n }\n if (req.method === \"estimateGas\") {\n if (!message.match(/revert/i) && message.match(/insufficient funds/i)) {\n assert(false, \"insufficient funds\", \"INSUFFICIENT_FUNDS\", {\n transaction: req.transaction\n });\n }\n }\n if (req.method === \"call\" || req.method === \"estimateGas\") {\n if (message.match(/execution reverted/i)) {\n let data = \"\";\n try {\n data = error.info.result.error.data;\n }\n catch (error) { }\n const e = AbiCoder.getBuiltinCallException(req.method, req.transaction, data);\n e.info = { request: req, error };\n throw e;\n }\n }\n if (message) {\n if (req.method === \"broadcastTransaction\") {\n const transaction = Transaction.from(req.signedTransaction);\n if (message.match(/replacement/i) && message.match(/underpriced/i)) {\n assert(false, \"replacement fee too low\", \"REPLACEMENT_UNDERPRICED\", {\n transaction\n });\n }\n if (message.match(/insufficient funds/)) {\n assert(false, \"insufficient funds for intrinsic transaction cost\", \"INSUFFICIENT_FUNDS\", {\n transaction\n });\n }\n if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) {\n assert(false, \"nonce has already been used\", \"NONCE_EXPIRED\", {\n transaction\n });\n }\n }\n }\n // Something we could not process\n throw error;\n }\n async _detectNetwork() {\n return this.network;\n }\n async _perform(req) {\n switch (req.method) {\n case \"chainId\":\n return this.network.chainId;\n case \"getBlockNumber\":\n return this.fetch(\"proxy\", { action: \"eth_blockNumber\" });\n case \"getGasPrice\":\n return this.fetch(\"proxy\", { action: \"eth_gasPrice\" });\n case \"getPriorityFee\":\n // This is temporary until Etherscan completes support\n if (this.network.name === \"mainnet\") {\n return \"1000000000\";\n }\n else if (this.network.name === \"optimism\") {\n return \"1000000\";\n }\n else {\n throw new Error(\"fallback onto the AbstractProvider default\");\n }\n /* Working with Etherscan to get this added:\n try {\n const test = await this.fetch(\"proxy\", {\n action: \"eth_maxPriorityFeePerGas\"\n });\n console.log(test);\n return test;\n } catch (e) {\n console.log(\"DEBUG\", e);\n throw e;\n }\n */\n /* This might be safe; but due to rounding neither myself\n or Etherscan are necessarily comfortable with this. :)\n try {\n const result = await this.fetch(\"gastracker\", { action: \"gasoracle\" });\n console.log(result);\n const gasPrice = parseUnits(result.SafeGasPrice, \"gwei\");\n const baseFee = parseUnits(result.suggestBaseFee, \"gwei\");\n const priorityFee = gasPrice - baseFee;\n if (priorityFee < 0) { throw new Error(\"negative priority fee; defer to abstract provider default\"); }\n return priorityFee;\n } catch (error) {\n console.log(\"DEBUG\", error);\n throw error;\n }\n */\n case \"getBalance\":\n // Returns base-10 result\n return this.fetch(\"account\", {\n action: \"balance\",\n address: req.address,\n tag: req.blockTag\n });\n case \"getTransactionCount\":\n return this.fetch(\"proxy\", {\n action: \"eth_getTransactionCount\",\n address: req.address,\n tag: req.blockTag\n });\n case \"getCode\":\n return this.fetch(\"proxy\", {\n action: \"eth_getCode\",\n address: req.address,\n tag: req.blockTag\n });\n case \"getStorage\":\n return this.fetch(\"proxy\", {\n action: \"eth_getStorageAt\",\n address: req.address,\n position: req.position,\n tag: req.blockTag\n });\n case \"broadcastTransaction\":\n return this.fetch(\"proxy\", {\n action: \"eth_sendRawTransaction\",\n hex: req.signedTransaction\n }, true).catch((error) => {\n return this._checkError(req, error, req.signedTransaction);\n });\n case \"getBlock\":\n if (\"blockTag\" in req) {\n return this.fetch(\"proxy\", {\n action: \"eth_getBlockByNumber\",\n tag: req.blockTag,\n boolean: (req.includeTransactions ? \"true\" : \"false\")\n });\n }\n assert(false, \"getBlock by blockHash not supported by Etherscan\", \"UNSUPPORTED_OPERATION\", {\n operation: \"getBlock(blockHash)\"\n });\n case \"getTransaction\":\n return this.fetch(\"proxy\", {\n action: \"eth_getTransactionByHash\",\n txhash: req.hash\n });\n case \"getTransactionReceipt\":\n return this.fetch(\"proxy\", {\n action: \"eth_getTransactionReceipt\",\n txhash: req.hash\n });\n case \"call\": {\n if (req.blockTag !== \"latest\") {\n throw new Error(\"EtherscanProvider does not support blockTag for call\");\n }\n const postData = this._getTransactionPostData(req.transaction);\n postData.module = \"proxy\";\n postData.action = \"eth_call\";\n try {\n return await this.fetch(\"proxy\", postData, true);\n }\n catch (error) {\n return this._checkError(req, error, req.transaction);\n }\n }\n case \"estimateGas\": {\n const postData = this._getTransactionPostData(req.transaction);\n postData.module = \"proxy\";\n postData.action = \"eth_estimateGas\";\n try {\n return await this.fetch(\"proxy\", postData, true);\n }\n catch (error) {\n return this._checkError(req, error, req.transaction);\n }\n }\n /*\n case \"getLogs\": {\n // Needs to complain if more than one address is passed in\n const args: Record = { action: \"getLogs\" }\n \n if (params.filter.fromBlock) {\n args.fromBlock = checkLogTag(params.filter.fromBlock);\n }\n \n if (params.filter.toBlock) {\n args.toBlock = checkLogTag(params.filter.toBlock);\n }\n \n if (params.filter.address) {\n args.address = params.filter.address;\n }\n \n // @TODO: We can handle slightly more complicated logs using the logs API\n if (params.filter.topics && params.filter.topics.length > 0) {\n if (params.filter.topics.length > 1) {\n logger.throwError(\"unsupported topic count\", Logger.Errors.UNSUPPORTED_OPERATION, { topics: params.filter.topics });\n }\n if (params.filter.topics.length === 1) {\n const topic0 = params.filter.topics[0];\n if (typeof(topic0) !== \"string\" || topic0.length !== 66) {\n logger.throwError(\"unsupported topic format\", Logger.Errors.UNSUPPORTED_OPERATION, { topic0: topic0 });\n }\n args.topic0 = topic0;\n }\n }\n \n const logs: Array = await this.fetch(\"logs\", args);\n \n // Cache txHash => blockHash\n let blocks: { [tag: string]: string } = {};\n \n // Add any missing blockHash to the logs\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i];\n if (log.blockHash != null) { continue; }\n if (blocks[log.blockNumber] == null) {\n const block = await this.getBlock(log.blockNumber);\n if (block) {\n blocks[log.blockNumber] = block.hash;\n }\n }\n \n log.blockHash = blocks[log.blockNumber];\n }\n \n return logs;\n }\n */\n default:\n break;\n }\n return super._perform(req);\n }\n async getNetwork() {\n return this.network;\n }\n /**\n * Resolves to the current price of ether.\n *\n * This returns ``0`` on any network other than ``mainnet``.\n */\n async getEtherPrice() {\n if (this.network.name !== \"mainnet\") {\n return 0.0;\n }\n return parseFloat((await this.fetch(\"stats\", { action: \"ethprice\" })).ethusd);\n }\n /**\n * Resolves to a [Contract]] for %%address%%, using the\n * Etherscan API to retreive the Contract ABI.\n */\n async getContract(_address) {\n let address = this._getAddress(_address);\n if (isPromise(address)) {\n address = await address;\n }\n try {\n const resp = await this.fetch(\"contract\", {\n action: \"getabi\", address\n });\n const abi = JSON.parse(resp);\n return new Contract(address, abi, this);\n }\n catch (error) {\n return null;\n }\n }\n isCommunityResource() {\n return (this.apiKey == null);\n }\n}\n//# sourceMappingURL=provider-etherscan.js.map","function getGlobal() {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n}\n;\nconst _WebSocket = getGlobal().WebSocket;\nexport { _WebSocket as WebSocket };\n//# sourceMappingURL=ws-browser.js.map","/**\n * Generic long-lived socket provider.\n *\n * Sub-classing notes\n * - a sub-class MUST call the `_start()` method once connected\n * - a sub-class MUST override the `_write(string)` method\n * - a sub-class MUST call `_processMessage(string)` for each message\n *\n * @_subsection: api/providers/abstract-provider:Socket Providers [about-socketProvider]\n */\nimport { UnmanagedSubscriber } from \"./abstract-provider.js\";\nimport { assert, assertArgument, makeError } from \"../utils/index.js\";\nimport { JsonRpcApiProvider } from \"./provider-jsonrpc.js\";\n/**\n * A **SocketSubscriber** uses a socket transport to handle events and\n * should use [[_emit]] to manage the events.\n */\nexport class SocketSubscriber {\n #provider;\n #filter;\n /**\n * The filter.\n */\n get filter() { return JSON.parse(this.#filter); }\n #filterId;\n #paused;\n #emitPromise;\n /**\n * Creates a new **SocketSubscriber** attached to %%provider%% listening\n * to %%filter%%.\n */\n constructor(provider, filter) {\n this.#provider = provider;\n this.#filter = JSON.stringify(filter);\n this.#filterId = null;\n this.#paused = null;\n this.#emitPromise = null;\n }\n start() {\n this.#filterId = this.#provider.send(\"eth_subscribe\", this.filter).then((filterId) => {\n ;\n this.#provider._register(filterId, this);\n return filterId;\n });\n }\n stop() {\n (this.#filterId).then((filterId) => {\n if (this.#provider.destroyed) {\n return;\n }\n this.#provider.send(\"eth_unsubscribe\", [filterId]);\n });\n this.#filterId = null;\n }\n // @TODO: pause should trap the current blockNumber, unsub, and on resume use getLogs\n // and resume\n pause(dropWhilePaused) {\n assert(dropWhilePaused, \"preserve logs while paused not supported by SocketSubscriber yet\", \"UNSUPPORTED_OPERATION\", { operation: \"pause(false)\" });\n this.#paused = !!dropWhilePaused;\n }\n resume() {\n this.#paused = null;\n }\n /**\n * @_ignore:\n */\n _handleMessage(message) {\n if (this.#filterId == null) {\n return;\n }\n if (this.#paused === null) {\n let emitPromise = this.#emitPromise;\n if (emitPromise == null) {\n emitPromise = this._emit(this.#provider, message);\n }\n else {\n emitPromise = emitPromise.then(async () => {\n await this._emit(this.#provider, message);\n });\n }\n this.#emitPromise = emitPromise.then(() => {\n if (this.#emitPromise === emitPromise) {\n this.#emitPromise = null;\n }\n });\n }\n }\n /**\n * Sub-classes **must** override this to emit the events on the\n * provider.\n */\n async _emit(provider, message) {\n throw new Error(\"sub-classes must implemente this; _emit\");\n }\n}\n/**\n * A **SocketBlockSubscriber** listens for ``newHeads`` events and emits\n * ``\"block\"`` events.\n */\nexport class SocketBlockSubscriber extends SocketSubscriber {\n /**\n * @_ignore:\n */\n constructor(provider) {\n super(provider, [\"newHeads\"]);\n }\n async _emit(provider, message) {\n provider.emit(\"block\", parseInt(message.number));\n }\n}\n/**\n * A **SocketPendingSubscriber** listens for pending transacitons and emits\n * ``\"pending\"`` events.\n */\nexport class SocketPendingSubscriber extends SocketSubscriber {\n /**\n * @_ignore:\n */\n constructor(provider) {\n super(provider, [\"newPendingTransactions\"]);\n }\n async _emit(provider, message) {\n provider.emit(\"pending\", message);\n }\n}\n/**\n * A **SocketEventSubscriber** listens for event logs.\n */\nexport class SocketEventSubscriber extends SocketSubscriber {\n #logFilter;\n /**\n * The filter.\n */\n get logFilter() { return JSON.parse(this.#logFilter); }\n /**\n * @_ignore:\n */\n constructor(provider, filter) {\n super(provider, [\"logs\", filter]);\n this.#logFilter = JSON.stringify(filter);\n }\n async _emit(provider, message) {\n provider.emit(this.logFilter, provider._wrapLog(message, provider._network));\n }\n}\n/**\n * A **SocketProvider** is backed by a long-lived connection over a\n * socket, which can subscribe and receive real-time messages over\n * its communication channel.\n */\nexport class SocketProvider extends JsonRpcApiProvider {\n #callbacks;\n // Maps each filterId to its subscriber\n #subs;\n // If any events come in before a subscriber has finished\n // registering, queue them\n #pending;\n /**\n * Creates a new **SocketProvider** connected to %%network%%.\n *\n * If unspecified, the network will be discovered.\n */\n constructor(network, _options) {\n // Copy the options\n const options = Object.assign({}, (_options != null) ? _options : {});\n // Support for batches is generally not supported for\n // connection-base providers; if this changes in the future\n // the _send should be updated to reflect this\n assertArgument(options.batchMaxCount == null || options.batchMaxCount === 1, \"sockets-based providers do not support batches\", \"options.batchMaxCount\", _options);\n options.batchMaxCount = 1;\n // Socket-based Providers (generally) cannot change their network,\n // since they have a long-lived connection; but let people override\n // this if they have just cause.\n if (options.staticNetwork == null) {\n options.staticNetwork = true;\n }\n super(network, options);\n this.#callbacks = new Map();\n this.#subs = new Map();\n this.#pending = new Map();\n }\n // This value is only valid after _start has been called\n /*\n get _network(): Network {\n if (this.#network == null) {\n throw new Error(\"this shouldn't happen\");\n }\n return this.#network.clone();\n }\n */\n _getSubscriber(sub) {\n switch (sub.type) {\n case \"close\":\n return new UnmanagedSubscriber(\"close\");\n case \"block\":\n return new SocketBlockSubscriber(this);\n case \"pending\":\n return new SocketPendingSubscriber(this);\n case \"event\":\n return new SocketEventSubscriber(this, sub.filter);\n case \"orphan\":\n // Handled auto-matically within AbstractProvider\n // when the log.removed = true\n if (sub.filter.orphan === \"drop-log\") {\n return new UnmanagedSubscriber(\"drop-log\");\n }\n }\n return super._getSubscriber(sub);\n }\n /**\n * Register a new subscriber. This is used internalled by Subscribers\n * and generally is unecessary unless extending capabilities.\n */\n _register(filterId, subscriber) {\n this.#subs.set(filterId, subscriber);\n const pending = this.#pending.get(filterId);\n if (pending) {\n for (const message of pending) {\n subscriber._handleMessage(message);\n }\n this.#pending.delete(filterId);\n }\n }\n async _send(payload) {\n // WebSocket provider doesn't accept batches\n assertArgument(!Array.isArray(payload), \"WebSocket does not support batch send\", \"payload\", payload);\n // @TODO: stringify payloads here and store to prevent mutations\n // Prepare a promise to respond to\n const promise = new Promise((resolve, reject) => {\n this.#callbacks.set(payload.id, { payload, resolve, reject });\n });\n // Wait until the socket is connected before writing to it\n await this._waitUntilReady();\n // Write the request to the socket\n await this._write(JSON.stringify(payload));\n return [await promise];\n }\n // Sub-classes must call this once they are connected\n /*\n async _start(): Promise {\n if (this.#ready) { return; }\n\n for (const { payload } of this.#callbacks.values()) {\n await this._write(JSON.stringify(payload));\n }\n\n this.#ready = (async function() {\n await super._start();\n })();\n }\n */\n /**\n * Sub-classes **must** call this with messages received over their\n * transport to be processed and dispatched.\n */\n async _processMessage(message) {\n const result = (JSON.parse(message));\n if (result && typeof (result) === \"object\" && \"id\" in result) {\n const callback = this.#callbacks.get(result.id);\n if (callback == null) {\n this.emit(\"error\", makeError(\"received result for unknown id\", \"UNKNOWN_ERROR\", {\n reasonCode: \"UNKNOWN_ID\",\n result\n }));\n return;\n }\n this.#callbacks.delete(result.id);\n callback.resolve(result);\n }\n else if (result && result.method === \"eth_subscription\") {\n const filterId = result.params.subscription;\n const subscriber = this.#subs.get(filterId);\n if (subscriber) {\n subscriber._handleMessage(result.params.result);\n }\n else {\n let pending = this.#pending.get(filterId);\n if (pending == null) {\n pending = [];\n this.#pending.set(filterId, pending);\n }\n pending.push(result.params.result);\n }\n }\n else {\n this.emit(\"error\", makeError(\"received unexpected message\", \"UNKNOWN_ERROR\", {\n reasonCode: \"UNEXPECTED_MESSAGE\",\n result\n }));\n return;\n }\n }\n /**\n * Sub-classes **must** override this to send %%message%% over their\n * transport.\n */\n async _write(message) {\n throw new Error(\"sub-classes must override this\");\n }\n}\n//# sourceMappingURL=provider-socket.js.map","import { WebSocket as _WebSocket } from \"./ws.js\"; /*-browser*/\nimport { SocketProvider } from \"./provider-socket.js\";\n/**\n * A JSON-RPC provider which is backed by a WebSocket.\n *\n * WebSockets are often preferred because they retain a live connection\n * to a server, which permits more instant access to events.\n *\n * However, this incurs higher server infrasturture costs, so additional\n * resources may be required to host your own WebSocket nodes and many\n * third-party services charge additional fees for WebSocket endpoints.\n */\nexport class WebSocketProvider extends SocketProvider {\n #connect;\n #websocket;\n get websocket() {\n if (this.#websocket == null) {\n throw new Error(\"websocket closed\");\n }\n return this.#websocket;\n }\n constructor(url, network, options) {\n super(network, options);\n if (typeof (url) === \"string\") {\n this.#connect = () => { return new _WebSocket(url); };\n this.#websocket = this.#connect();\n }\n else if (typeof (url) === \"function\") {\n this.#connect = url;\n this.#websocket = url();\n }\n else {\n this.#connect = null;\n this.#websocket = url;\n }\n this.websocket.onopen = async () => {\n try {\n await this._start();\n this.resume();\n }\n catch (error) {\n console.log(\"failed to start WebsocketProvider\", error);\n // @TODO: now what? Attempt reconnect?\n }\n };\n this.websocket.onmessage = (message) => {\n this._processMessage(message.data);\n };\n /*\n this.websocket.onclose = (event) => {\n // @TODO: What event.code should we reconnect on?\n const reconnect = false;\n if (reconnect) {\n this.pause(true);\n if (this.#connect) {\n this.#websocket = this.#connect();\n this.#websocket.onopen = ...\n // @TODO: this requires the super class to rebroadcast; move it there\n }\n this._reconnect();\n }\n };\n */\n }\n async _write(message) {\n this.websocket.send(message);\n }\n async destroy() {\n if (this.#websocket != null) {\n this.#websocket.close();\n this.#websocket = null;\n }\n super.destroy();\n }\n}\n//# sourceMappingURL=provider-websocket.js.map","/**\n * [[link-infura]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Sepolia Testnet (``sepolia``)\n * - Arbitrum (``arbitrum``)\n * - Arbitrum Goerli Testnet (``arbitrum-goerli``)\n * - Arbitrum Sepolia Testnet (``arbitrum-sepolia``)\n * - Base (``base``)\n * - Base Goerlia Testnet (``base-goerli``)\n * - Base Sepolia Testnet (``base-sepolia``)\n * - BNB Smart Chain Mainnet (``bnb``)\n * - BNB Smart Chain Testnet (``bnbt``)\n * - Linea (``linea``)\n * - Linea Goerli Testnet (``linea-goerli``)\n * - Linea Sepolia Testnet (``linea-sepolia``)\n * - Optimism (``optimism``)\n * - Optimism Goerli Testnet (``optimism-goerli``)\n * - Optimism Sepolia Testnet (``optimism-sepolia``)\n * - Polygon (``matic``)\n * - Polygon Amoy Testnet (``matic-amoy``)\n * - Polygon Mumbai Testnet (``matic-mumbai``)\n *\n * @_subsection: api/providers/thirdparty:INFURA [providers-infura]\n */\nimport { defineProperties, FetchRequest, assert, assertArgument } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nimport { WebSocketProvider } from \"./provider-websocket.js\";\nconst defaultProjectId = \"84842078b09946638c03157f83405213\";\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"mainnet.infura.io\";\n case \"goerli\":\n return \"goerli.infura.io\";\n case \"sepolia\":\n return \"sepolia.infura.io\";\n case \"arbitrum\":\n return \"arbitrum-mainnet.infura.io\";\n case \"arbitrum-goerli\":\n return \"arbitrum-goerli.infura.io\";\n case \"arbitrum-sepolia\":\n return \"arbitrum-sepolia.infura.io\";\n case \"base\":\n return \"base-mainnet.infura.io\";\n case \"base-goerlia\": // @TODO: Remove this typo in the future!\n case \"base-goerli\":\n return \"base-goerli.infura.io\";\n case \"base-sepolia\":\n return \"base-sepolia.infura.io\";\n case \"bnb\":\n return \"bsc-mainnet.infura.io\";\n case \"bnbt\":\n return \"bsc-testnet.infura.io\";\n case \"linea\":\n return \"linea-mainnet.infura.io\";\n case \"linea-goerli\":\n return \"linea-goerli.infura.io\";\n case \"linea-sepolia\":\n return \"linea-sepolia.infura.io\";\n case \"matic\":\n return \"polygon-mainnet.infura.io\";\n case \"matic-amoy\":\n return \"polygon-amoy.infura.io\";\n case \"matic-mumbai\":\n return \"polygon-mumbai.infura.io\";\n case \"optimism\":\n return \"optimism-mainnet.infura.io\";\n case \"optimism-goerli\":\n return \"optimism-goerli.infura.io\";\n case \"optimism-sepolia\":\n return \"optimism-sepolia.infura.io\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **InfuraWebSocketProvider** connects to the [[link-infura]]\n * WebSocket end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-infura-signup).\n */\nexport class InfuraWebSocketProvider extends WebSocketProvider {\n /**\n * The Project ID for the INFURA connection.\n */\n projectId;\n /**\n * The Project Secret.\n *\n * If null, no authenticated requests are made. This should not\n * be used outside of private contexts.\n */\n projectSecret;\n /**\n * Creates a new **InfuraWebSocketProvider**.\n */\n constructor(network, projectId) {\n const provider = new InfuraProvider(network, projectId);\n const req = provider._getConnection();\n assert(!req.credentials, \"INFURA WebSocket project secrets unsupported\", \"UNSUPPORTED_OPERATION\", { operation: \"InfuraProvider.getWebSocketProvider()\" });\n const url = req.url.replace(/^http/i, \"ws\").replace(\"/v3/\", \"/ws/v3/\");\n super(url, provider._network);\n defineProperties(this, {\n projectId: provider.projectId,\n projectSecret: provider.projectSecret\n });\n }\n isCommunityResource() {\n return (this.projectId === defaultProjectId);\n }\n}\n/**\n * The **InfuraProvider** connects to the [[link-infura]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-infura-signup).\n */\nexport class InfuraProvider extends JsonRpcProvider {\n /**\n * The Project ID for the INFURA connection.\n */\n projectId;\n /**\n * The Project Secret.\n *\n * If null, no authenticated requests are made. This should not\n * be used outside of private contexts.\n */\n projectSecret;\n /**\n * Creates a new **InfuraProvider**.\n */\n constructor(_network, projectId, projectSecret) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (projectId == null) {\n projectId = defaultProjectId;\n }\n if (projectSecret == null) {\n projectSecret = null;\n }\n const request = InfuraProvider.getRequest(network, projectId, projectSecret);\n super(request, network, { staticNetwork: network });\n defineProperties(this, { projectId, projectSecret });\n }\n _getProvider(chainId) {\n try {\n return new InfuraProvider(chainId, this.projectId, this.projectSecret);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n isCommunityResource() {\n return (this.projectId === defaultProjectId);\n }\n /**\n * Creates a new **InfuraWebSocketProvider**.\n */\n static getWebSocketProvider(network, projectId) {\n return new InfuraWebSocketProvider(network, projectId);\n }\n /**\n * Returns a prepared request for connecting to %%network%%\n * with %%projectId%% and %%projectSecret%%.\n */\n static getRequest(network, projectId, projectSecret) {\n if (projectId == null) {\n projectId = defaultProjectId;\n }\n if (projectSecret == null) {\n projectSecret = null;\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/v3/${projectId}`);\n request.allowGzip = true;\n if (projectSecret) {\n request.setCredentials(\"\", projectSecret);\n }\n if (projectId === defaultProjectId) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"InfuraProvider\");\n return true;\n };\n }\n return request;\n }\n}\n//# sourceMappingURL=provider-infura.js.map","/**\n * [[link-quicknode]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Sepolia Testnet (``sepolia``)\n * - Holesky Testnet (``holesky``)\n * - Arbitrum (``arbitrum``)\n * - Arbitrum Goerli Testnet (``arbitrum-goerli``)\n * - Arbitrum Sepolia Testnet (``arbitrum-sepolia``)\n * - Base Mainnet (``base``);\n * - Base Goerli Testnet (``base-goerli``);\n * - Base Sepolia Testnet (``base-sepolia``);\n * - BNB Smart Chain Mainnet (``bnb``)\n * - BNB Smart Chain Testnet (``bnbt``)\n * - Optimism (``optimism``)\n * - Optimism Goerli Testnet (``optimism-goerli``)\n * - Optimism Sepolia Testnet (``optimism-sepolia``)\n * - Polygon (``matic``)\n * - Polygon Mumbai Testnet (``matic-mumbai``)\n *\n * @_subsection: api/providers/thirdparty:QuickNode [providers-quicknode]\n */\nimport { defineProperties, FetchRequest, assertArgument } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nconst defaultToken = \"919b412a057b5e9c9b6dce193c5a60242d6efadb\";\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"ethers.quiknode.pro\";\n case \"goerli\":\n return \"ethers.ethereum-goerli.quiknode.pro\";\n case \"sepolia\":\n return \"ethers.ethereum-sepolia.quiknode.pro\";\n case \"holesky\":\n return \"ethers.ethereum-holesky.quiknode.pro\";\n case \"arbitrum\":\n return \"ethers.arbitrum-mainnet.quiknode.pro\";\n case \"arbitrum-goerli\":\n return \"ethers.arbitrum-goerli.quiknode.pro\";\n case \"arbitrum-sepolia\":\n return \"ethers.arbitrum-sepolia.quiknode.pro\";\n case \"base\":\n return \"ethers.base-mainnet.quiknode.pro\";\n case \"base-goerli\":\n return \"ethers.base-goerli.quiknode.pro\";\n case \"base-spolia\":\n return \"ethers.base-sepolia.quiknode.pro\";\n case \"bnb\":\n return \"ethers.bsc.quiknode.pro\";\n case \"bnbt\":\n return \"ethers.bsc-testnet.quiknode.pro\";\n case \"matic\":\n return \"ethers.matic.quiknode.pro\";\n case \"matic-mumbai\":\n return \"ethers.matic-testnet.quiknode.pro\";\n case \"optimism\":\n return \"ethers.optimism.quiknode.pro\";\n case \"optimism-goerli\":\n return \"ethers.optimism-goerli.quiknode.pro\";\n case \"optimism-sepolia\":\n return \"ethers.optimism-sepolia.quiknode.pro\";\n case \"xdai\":\n return \"ethers.xdai.quiknode.pro\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/*\n@TODO:\n These networks are not currently present in the Network\n default included networks. Research them and ensure they\n are EVM compatible and work with ethers\n\n http://ethers.matic-amoy.quiknode.pro\n\n http://ethers.avalanche-mainnet.quiknode.pro\n http://ethers.avalanche-testnet.quiknode.pro\n http://ethers.blast-sepolia.quiknode.pro\n http://ethers.celo-mainnet.quiknode.pro\n http://ethers.fantom.quiknode.pro\n http://ethers.imx-demo.quiknode.pro\n http://ethers.imx-mainnet.quiknode.pro\n http://ethers.imx-testnet.quiknode.pro\n http://ethers.near-mainnet.quiknode.pro\n http://ethers.near-testnet.quiknode.pro\n http://ethers.nova-mainnet.quiknode.pro\n http://ethers.scroll-mainnet.quiknode.pro\n http://ethers.scroll-testnet.quiknode.pro\n http://ethers.tron-mainnet.quiknode.pro\n http://ethers.zkevm-mainnet.quiknode.pro\n http://ethers.zkevm-testnet.quiknode.pro\n http://ethers.zksync-mainnet.quiknode.pro\n http://ethers.zksync-testnet.quiknode.pro\n*/\n/**\n * The **QuickNodeProvider** connects to the [[link-quicknode]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API token is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-quicknode).\n */\nexport class QuickNodeProvider extends JsonRpcProvider {\n /**\n * The API token.\n */\n token;\n /**\n * Creates a new **QuickNodeProvider**.\n */\n constructor(_network, token) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (token == null) {\n token = defaultToken;\n }\n const request = QuickNodeProvider.getRequest(network, token);\n super(request, network, { staticNetwork: network });\n defineProperties(this, { token });\n }\n _getProvider(chainId) {\n try {\n return new QuickNodeProvider(chainId, this.token);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n isCommunityResource() {\n return (this.token === defaultToken);\n }\n /**\n * Returns a new request prepared for %%network%% and the\n * %%token%%.\n */\n static getRequest(network, token) {\n if (token == null) {\n token = defaultToken;\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/${token}`);\n request.allowGzip = true;\n //if (projectSecret) { request.setCredentials(\"\", projectSecret); }\n if (token === defaultToken) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"QuickNodeProvider\");\n return true;\n };\n }\n return request;\n }\n}\n//# sourceMappingURL=provider-quicknode.js.map","/**\n * A **FallbackProvider** provides resilience, security and performance\n * in a way that is customizable and configurable.\n *\n * @_section: api/providers/fallback-provider:Fallback Provider [about-fallback-provider]\n */\nimport { assert, assertArgument, getBigInt, getNumber, isError } from \"../utils/index.js\";\nimport { AbstractProvider } from \"./abstract-provider.js\";\nimport { Network } from \"./network.js\";\nconst BN_1 = BigInt(\"1\");\nconst BN_2 = BigInt(\"2\");\nfunction shuffle(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i];\n array[i] = array[j];\n array[j] = tmp;\n }\n}\nfunction stall(duration) {\n return new Promise((resolve) => { setTimeout(resolve, duration); });\n}\nfunction getTime() { return (new Date()).getTime(); }\nfunction stringify(value) {\n return JSON.stringify(value, (key, value) => {\n if (typeof (value) === \"bigint\") {\n return { type: \"bigint\", value: value.toString() };\n }\n return value;\n });\n}\n;\nconst defaultConfig = { stallTimeout: 400, priority: 1, weight: 1 };\nconst defaultState = {\n blockNumber: -2, requests: 0, lateResponses: 0, errorResponses: 0,\n outOfSync: -1, unsupportedEvents: 0, rollingDuration: 0, score: 0,\n _network: null, _updateNumber: null, _totalTime: 0,\n _lastFatalError: null, _lastFatalErrorTimestamp: 0\n};\nasync function waitForSync(config, blockNumber) {\n while (config.blockNumber < 0 || config.blockNumber < blockNumber) {\n if (!config._updateNumber) {\n config._updateNumber = (async () => {\n try {\n const blockNumber = await config.provider.getBlockNumber();\n if (blockNumber > config.blockNumber) {\n config.blockNumber = blockNumber;\n }\n }\n catch (error) {\n config.blockNumber = -2;\n config._lastFatalError = error;\n config._lastFatalErrorTimestamp = getTime();\n }\n config._updateNumber = null;\n })();\n }\n await config._updateNumber;\n config.outOfSync++;\n if (config._lastFatalError) {\n break;\n }\n }\n}\nfunction _normalize(value) {\n if (value == null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"[\" + (value.map(_normalize)).join(\",\") + \"]\";\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return _normalize(value.toJSON());\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n case \"number\":\n return BigInt(value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{\" + keys.map((k) => `${JSON.stringify(k)}:${_normalize(value[k])}`).join(\",\") + \"}\";\n }\n }\n console.log(\"Could not serialize\", value);\n throw new Error(\"Hmm...\");\n}\nfunction normalizeResult(method, value) {\n if (\"error\" in value) {\n const error = value.error;\n let tag;\n if (isError(error, \"CALL_EXCEPTION\")) {\n tag = _normalize(Object.assign({}, error, {\n shortMessage: undefined, reason: undefined, info: undefined\n }));\n }\n else {\n tag = _normalize(error);\n }\n return { tag, value: error };\n }\n const result = value.result;\n return { tag: _normalize(result), value: result };\n}\n// This strategy picks the highest weight result, as long as the weight is\n// equal to or greater than quorum\nfunction checkQuorum(quorum, results) {\n const tally = new Map();\n for (const { value, tag, weight } of results) {\n const t = tally.get(tag) || { value, weight: 0 };\n t.weight += weight;\n tally.set(tag, t);\n }\n let best = null;\n for (const r of tally.values()) {\n if (r.weight >= quorum && (!best || r.weight > best.weight)) {\n best = r;\n }\n }\n if (best) {\n return best.value;\n }\n return undefined;\n}\nfunction getMedian(quorum, results) {\n let resultWeight = 0;\n const errorMap = new Map();\n let bestError = null;\n const values = [];\n for (const { value, tag, weight } of results) {\n if (value instanceof Error) {\n const e = errorMap.get(tag) || { value, weight: 0 };\n e.weight += weight;\n errorMap.set(tag, e);\n if (bestError == null || e.weight > bestError.weight) {\n bestError = e;\n }\n }\n else {\n values.push(BigInt(value));\n resultWeight += weight;\n }\n }\n if (resultWeight < quorum) {\n // We have quorum for an error\n if (bestError && bestError.weight >= quorum) {\n return bestError.value;\n }\n // We do not have quorum for a result\n return undefined;\n }\n // Get the sorted values\n values.sort((a, b) => ((a < b) ? -1 : (b > a) ? 1 : 0));\n const mid = Math.floor(values.length / 2);\n // Odd-length; take the middle value\n if (values.length % 2) {\n return values[mid];\n }\n // Even length; take the ceiling of the mean of the center two values\n return (values[mid - 1] + values[mid] + BN_1) / BN_2;\n}\nfunction getAnyResult(quorum, results) {\n // If any value or error meets quorum, that is our preferred result\n const result = checkQuorum(quorum, results);\n if (result !== undefined) {\n return result;\n }\n // Otherwise, do we have any result?\n for (const r of results) {\n if (r.value) {\n return r.value;\n }\n }\n // Nope!\n return undefined;\n}\nfunction getFuzzyMode(quorum, results) {\n if (quorum === 1) {\n return getNumber(getMedian(quorum, results), \"%internal\");\n }\n const tally = new Map();\n const add = (result, weight) => {\n const t = tally.get(result) || { result, weight: 0 };\n t.weight += weight;\n tally.set(result, t);\n };\n for (const { weight, value } of results) {\n const r = getNumber(value);\n add(r - 1, weight);\n add(r, weight);\n add(r + 1, weight);\n }\n let bestWeight = 0;\n let bestResult = undefined;\n for (const { weight, result } of tally.values()) {\n // Use this result, if this result meets quorum and has either:\n // - a better weight\n // - or equal weight, but the result is larger\n if (weight >= quorum && (weight > bestWeight || (bestResult != null && weight === bestWeight && result > bestResult))) {\n bestWeight = weight;\n bestResult = result;\n }\n }\n return bestResult;\n}\n/**\n * A **FallbackProvider** manages several [[Providers]] providing\n * resilience by switching between slow or misbehaving nodes, security\n * by requiring multiple backends to aggree and performance by allowing\n * faster backends to respond earlier.\n *\n */\nexport class FallbackProvider extends AbstractProvider {\n /**\n * The number of backends that must agree on a value before it is\n * accpeted.\n */\n quorum;\n /**\n * @_ignore:\n */\n eventQuorum;\n /**\n * @_ignore:\n */\n eventWorkers;\n #configs;\n #height;\n #initialSyncPromise;\n /**\n * Creates a new **FallbackProvider** with %%providers%% connected to\n * %%network%%.\n *\n * If a [[Provider]] is included in %%providers%%, defaults are used\n * for the configuration.\n */\n constructor(providers, network, options) {\n super(network, options);\n this.#configs = providers.map((p) => {\n if (p instanceof AbstractProvider) {\n return Object.assign({ provider: p }, defaultConfig, defaultState);\n }\n else {\n return Object.assign({}, defaultConfig, p, defaultState);\n }\n });\n this.#height = -2;\n this.#initialSyncPromise = null;\n if (options && options.quorum != null) {\n this.quorum = options.quorum;\n }\n else {\n this.quorum = Math.ceil(this.#configs.reduce((accum, config) => {\n accum += config.weight;\n return accum;\n }, 0) / 2);\n }\n this.eventQuorum = 1;\n this.eventWorkers = 1;\n assertArgument(this.quorum <= this.#configs.reduce((a, c) => (a + c.weight), 0), \"quorum exceed provider weight\", \"quorum\", this.quorum);\n }\n get providerConfigs() {\n return this.#configs.map((c) => {\n const result = Object.assign({}, c);\n for (const key in result) {\n if (key[0] === \"_\") {\n delete result[key];\n }\n }\n return result;\n });\n }\n async _detectNetwork() {\n return Network.from(getBigInt(await this._perform({ method: \"chainId\" })));\n }\n // @TODO: Add support to select providers to be the event subscriber\n //_getSubscriber(sub: Subscription): Subscriber {\n // throw new Error(\"@TODO\");\n //}\n /**\n * Transforms a %%req%% into the correct method call on %%provider%%.\n */\n async _translatePerform(provider, req) {\n switch (req.method) {\n case \"broadcastTransaction\":\n return await provider.broadcastTransaction(req.signedTransaction);\n case \"call\":\n return await provider.call(Object.assign({}, req.transaction, { blockTag: req.blockTag }));\n case \"chainId\":\n return (await provider.getNetwork()).chainId;\n case \"estimateGas\":\n return await provider.estimateGas(req.transaction);\n case \"getBalance\":\n return await provider.getBalance(req.address, req.blockTag);\n case \"getBlock\": {\n const block = (\"blockHash\" in req) ? req.blockHash : req.blockTag;\n return await provider.getBlock(block, req.includeTransactions);\n }\n case \"getBlockNumber\":\n return await provider.getBlockNumber();\n case \"getCode\":\n return await provider.getCode(req.address, req.blockTag);\n case \"getGasPrice\":\n return (await provider.getFeeData()).gasPrice;\n case \"getPriorityFee\":\n return (await provider.getFeeData()).maxPriorityFeePerGas;\n case \"getLogs\":\n return await provider.getLogs(req.filter);\n case \"getStorage\":\n return await provider.getStorage(req.address, req.position, req.blockTag);\n case \"getTransaction\":\n return await provider.getTransaction(req.hash);\n case \"getTransactionCount\":\n return await provider.getTransactionCount(req.address, req.blockTag);\n case \"getTransactionReceipt\":\n return await provider.getTransactionReceipt(req.hash);\n case \"getTransactionResult\":\n return await provider.getTransactionResult(req.hash);\n }\n }\n // Grab the next (random) config that is not already part of\n // the running set\n #getNextConfig(running) {\n // @TODO: Maybe do a check here to favour (heavily) providers that\n // do not require waitForSync and disfavour providers that\n // seem down-ish or are behaving slowly\n const configs = Array.from(running).map((r) => r.config);\n // Shuffle the states, sorted by priority\n const allConfigs = this.#configs.slice();\n shuffle(allConfigs);\n allConfigs.sort((a, b) => (a.priority - b.priority));\n for (const config of allConfigs) {\n if (config._lastFatalError) {\n continue;\n }\n if (configs.indexOf(config) === -1) {\n return config;\n }\n }\n return null;\n }\n // Adds a new runner (if available) to running.\n #addRunner(running, req) {\n const config = this.#getNextConfig(running);\n // No runners available\n if (config == null) {\n return null;\n }\n // Create a new runner\n const runner = {\n config, result: null, didBump: false,\n perform: null, staller: null\n };\n const now = getTime();\n // Start performing this operation\n runner.perform = (async () => {\n try {\n config.requests++;\n const result = await this._translatePerform(config.provider, req);\n runner.result = { result };\n }\n catch (error) {\n config.errorResponses++;\n runner.result = { error };\n }\n const dt = (getTime() - now);\n config._totalTime += dt;\n config.rollingDuration = 0.95 * config.rollingDuration + 0.05 * dt;\n runner.perform = null;\n })();\n // Start a staller; when this times out, it's time to force\n // kicking off another runner because we are taking too long\n runner.staller = (async () => {\n await stall(config.stallTimeout);\n runner.staller = null;\n })();\n running.add(runner);\n return runner;\n }\n // Initializes the blockNumber and network for each runner and\n // blocks until initialized\n async #initialSync() {\n let initialSync = this.#initialSyncPromise;\n if (!initialSync) {\n const promises = [];\n this.#configs.forEach((config) => {\n promises.push((async () => {\n await waitForSync(config, 0);\n if (!config._lastFatalError) {\n config._network = await config.provider.getNetwork();\n }\n })());\n });\n this.#initialSyncPromise = initialSync = (async () => {\n // Wait for all providers to have a block number and network\n await Promise.all(promises);\n // Check all the networks match\n let chainId = null;\n for (const config of this.#configs) {\n if (config._lastFatalError) {\n continue;\n }\n const network = (config._network);\n if (chainId == null) {\n chainId = network.chainId;\n }\n else if (network.chainId !== chainId) {\n assert(false, \"cannot mix providers on different networks\", \"UNSUPPORTED_OPERATION\", {\n operation: \"new FallbackProvider\"\n });\n }\n }\n })();\n }\n await initialSync;\n }\n async #checkQuorum(running, req) {\n // Get all the result objects\n const results = [];\n for (const runner of running) {\n if (runner.result != null) {\n const { tag, value } = normalizeResult(req.method, runner.result);\n results.push({ tag, value, weight: runner.config.weight });\n }\n }\n // Are there enough results to event meet quorum?\n if (results.reduce((a, r) => (a + r.weight), 0) < this.quorum) {\n return undefined;\n }\n switch (req.method) {\n case \"getBlockNumber\": {\n // We need to get the bootstrap block height\n if (this.#height === -2) {\n this.#height = Math.ceil(getNumber(getMedian(this.quorum, this.#configs.filter((c) => (!c._lastFatalError)).map((c) => ({\n value: c.blockNumber,\n tag: getNumber(c.blockNumber).toString(),\n weight: c.weight\n })))));\n }\n // Find the mode across all the providers, allowing for\n // a little drift between block heights\n const mode = getFuzzyMode(this.quorum, results);\n if (mode === undefined) {\n return undefined;\n }\n if (mode > this.#height) {\n this.#height = mode;\n }\n return this.#height;\n }\n case \"getGasPrice\":\n case \"getPriorityFee\":\n case \"estimateGas\":\n return getMedian(this.quorum, results);\n case \"getBlock\":\n // Pending blocks are in the mempool and already\n // quite untrustworthy; just grab anything\n if (\"blockTag\" in req && req.blockTag === \"pending\") {\n return getAnyResult(this.quorum, results);\n }\n return checkQuorum(this.quorum, results);\n case \"call\":\n case \"chainId\":\n case \"getBalance\":\n case \"getTransactionCount\":\n case \"getCode\":\n case \"getStorage\":\n case \"getTransaction\":\n case \"getTransactionReceipt\":\n case \"getLogs\":\n return checkQuorum(this.quorum, results);\n case \"broadcastTransaction\":\n return getAnyResult(this.quorum, results);\n }\n assert(false, \"unsupported method\", \"UNSUPPORTED_OPERATION\", {\n operation: `_perform(${stringify(req.method)})`\n });\n }\n async #waitForQuorum(running, req) {\n if (running.size === 0) {\n throw new Error(\"no runners?!\");\n }\n // Any promises that are interesting to watch for; an expired stall\n // or a successful perform\n const interesting = [];\n let newRunners = 0;\n for (const runner of running) {\n // No responses, yet; keep an eye on it\n if (runner.perform) {\n interesting.push(runner.perform);\n }\n // Still stalling...\n if (runner.staller) {\n interesting.push(runner.staller);\n continue;\n }\n // This runner has already triggered another runner\n if (runner.didBump) {\n continue;\n }\n // Got a response (result or error) or stalled; kick off another runner\n runner.didBump = true;\n newRunners++;\n }\n // Check if we have reached quorum on a result (or error)\n const value = await this.#checkQuorum(running, req);\n if (value !== undefined) {\n if (value instanceof Error) {\n throw value;\n }\n return value;\n }\n // Add any new runners, because a staller timed out or a result\n // or error response came in.\n for (let i = 0; i < newRunners; i++) {\n this.#addRunner(running, req);\n }\n // All providers have returned, and we have no result\n assert(interesting.length > 0, \"quorum not met\", \"SERVER_ERROR\", {\n request: \"%sub-requests\",\n info: { request: req, results: Array.from(running).map((r) => stringify(r.result)) }\n });\n // Wait for someone to either complete its perform or stall out\n await Promise.race(interesting);\n // This is recursive, but at worst case the depth is 2x the\n // number of providers (each has a perform and a staller)\n return await this.#waitForQuorum(running, req);\n }\n async _perform(req) {\n // Broadcasting a transaction is rare (ish) and already incurs\n // a cost on the user, so spamming is safe-ish. Just send it to\n // every backend.\n if (req.method === \"broadcastTransaction\") {\n // Once any broadcast provides a positive result, use it. No\n // need to wait for anyone else\n const results = this.#configs.map((c) => null);\n const broadcasts = this.#configs.map(async ({ provider, weight }, index) => {\n try {\n const result = await provider._perform(req);\n results[index] = Object.assign(normalizeResult(req.method, { result }), { weight });\n }\n catch (error) {\n results[index] = Object.assign(normalizeResult(req.method, { error }), { weight });\n }\n });\n // As each promise finishes...\n while (true) {\n // Check for a valid broadcast result\n const done = results.filter((r) => (r != null));\n for (const { value } of done) {\n if (!(value instanceof Error)) {\n return value;\n }\n }\n // Check for a legit broadcast error (one which we cannot\n // recover from; some nodes may return the following red\n // herring events:\n // - alredy seend (UNKNOWN_ERROR)\n // - NONCE_EXPIRED\n // - REPLACEMENT_UNDERPRICED\n const result = checkQuorum(this.quorum, results.filter((r) => (r != null)));\n if (isError(result, \"INSUFFICIENT_FUNDS\")) {\n throw result;\n }\n // Kick off the next provider (if any)\n const waiting = broadcasts.filter((b, i) => (results[i] == null));\n if (waiting.length === 0) {\n break;\n }\n await Promise.race(waiting);\n }\n // Use standard quorum results; any result was returned above,\n // so this will find any error that met quorum if any\n const result = getAnyResult(this.quorum, results);\n assert(result !== undefined, \"problem multi-broadcasting\", \"SERVER_ERROR\", {\n request: \"%sub-requests\",\n info: { request: req, results: results.map(stringify) }\n });\n if (result instanceof Error) {\n throw result;\n }\n return result;\n }\n await this.#initialSync();\n // Bootstrap enough runners to meet quorum\n const running = new Set();\n let inflightQuorum = 0;\n while (true) {\n const runner = this.#addRunner(running, req);\n if (runner == null) {\n break;\n }\n inflightQuorum += runner.config.weight;\n if (inflightQuorum >= this.quorum) {\n break;\n }\n }\n const result = await this.#waitForQuorum(running, req);\n // Track requests sent to a provider that are still\n // outstanding after quorum has been otherwise found\n for (const runner of running) {\n if (runner.perform && runner.result == null) {\n runner.config.lateResponses++;\n }\n }\n return result;\n }\n async destroy() {\n for (const { provider } of this.#configs) {\n provider.destroy();\n }\n super.destroy();\n }\n}\n//# sourceMappingURL=provider-fallback.js.map","import { assert } from \"../utils/index.js\";\nimport { AnkrProvider } from \"./provider-ankr.js\";\nimport { AlchemyProvider } from \"./provider-alchemy.js\";\n//import { BlockscoutProvider } from \"./provider-blockscout.js\";\nimport { ChainstackProvider } from \"./provider-chainstack.js\";\nimport { CloudflareProvider } from \"./provider-cloudflare.js\";\nimport { EtherscanProvider } from \"./provider-etherscan.js\";\nimport { InfuraProvider } from \"./provider-infura.js\";\n//import { PocketProvider } from \"./provider-pocket.js\";\nimport { QuickNodeProvider } from \"./provider-quicknode.js\";\nimport { FallbackProvider } from \"./provider-fallback.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nimport { Network } from \"./network.js\";\nimport { WebSocketProvider } from \"./provider-websocket.js\";\nfunction isWebSocketLike(value) {\n return (value && typeof (value.send) === \"function\" &&\n typeof (value.close) === \"function\");\n}\nconst Testnets = \"goerli kovan sepolia classicKotti optimism-goerli arbitrum-goerli matic-mumbai bnbt\".split(\" \");\n/**\n * Returns a default provider for %%network%%.\n *\n * If %%network%% is a [[WebSocketLike]] or string that begins with\n * ``\"ws:\"`` or ``\"wss:\"``, a [[WebSocketProvider]] is returned backed\n * by that WebSocket or URL.\n *\n * If %%network%% is a string that begins with ``\"HTTP:\"`` or ``\"HTTPS:\"``,\n * a [[JsonRpcProvider]] is returned connected to that URL.\n *\n * Otherwise, a default provider is created backed by well-known public\n * Web3 backends (such as [[link-infura]]) using community-provided API\n * keys.\n *\n * The %%options%% allows specifying custom API keys per backend (setting\n * an API key to ``\"-\"`` will omit that provider) and ``options.exclusive``\n * can be set to either a backend name or and array of backend names, which\n * will whitelist **only** those backends.\n *\n * Current backend strings supported are:\n * - ``\"alchemy\"``\n * - ``\"ankr\"``\n * - ``\"cloudflare\"``\n * - ``\"chainstack\"``\n * - ``\"etherscan\"``\n * - ``\"infura\"``\n * - ``\"publicPolygon\"``\n * - ``\"quicknode\"``\n *\n * @example:\n * // Connect to a local Geth node\n * provider = getDefaultProvider(\"http://localhost:8545/\");\n *\n * // Connect to Ethereum mainnet with any current and future\n * // third-party services available\n * provider = getDefaultProvider(\"mainnet\");\n *\n * // Connect to Polygon, but only allow Etherscan and\n * // INFURA and use \"MY_API_KEY\" in calls to Etherscan.\n * provider = getDefaultProvider(\"matic\", {\n * etherscan: \"MY_API_KEY\",\n * exclusive: [ \"etherscan\", \"infura\" ]\n * });\n */\nexport function getDefaultProvider(network, options) {\n if (options == null) {\n options = {};\n }\n const allowService = (name) => {\n if (options[name] === \"-\") {\n return false;\n }\n if (typeof (options.exclusive) === \"string\") {\n return (name === options.exclusive);\n }\n if (Array.isArray(options.exclusive)) {\n return (options.exclusive.indexOf(name) !== -1);\n }\n return true;\n };\n if (typeof (network) === \"string\" && network.match(/^https?:/)) {\n return new JsonRpcProvider(network);\n }\n if (typeof (network) === \"string\" && network.match(/^wss?:/) || isWebSocketLike(network)) {\n return new WebSocketProvider(network);\n }\n // Get the network and name, if possible\n let staticNetwork = null;\n try {\n staticNetwork = Network.from(network);\n }\n catch (error) { }\n const providers = [];\n if (allowService(\"publicPolygon\") && staticNetwork) {\n if (staticNetwork.name === \"matic\") {\n providers.push(new JsonRpcProvider(\"https:/\\/polygon-rpc.com/\", staticNetwork, { staticNetwork }));\n }\n else if (staticNetwork.name === \"matic-amoy\") {\n providers.push(new JsonRpcProvider(\"https:/\\/rpc-amoy.polygon.technology/\", staticNetwork, { staticNetwork }));\n }\n }\n if (allowService(\"alchemy\")) {\n try {\n providers.push(new AlchemyProvider(network, options.alchemy));\n }\n catch (error) { }\n }\n if (allowService(\"ankr\") && options.ankr != null) {\n try {\n providers.push(new AnkrProvider(network, options.ankr));\n }\n catch (error) { }\n }\n /* Temporarily remove until custom error issue is fixed\n if (allowService(\"blockscout\")) {\n try {\n providers.push(new BlockscoutProvider(network, options.blockscout));\n } catch (error) { }\n }\n */\n if (allowService(\"chainstack\")) {\n try {\n providers.push(new ChainstackProvider(network, options.chainstack));\n }\n catch (error) { }\n }\n if (allowService(\"cloudflare\")) {\n try {\n providers.push(new CloudflareProvider(network));\n }\n catch (error) { }\n }\n if (allowService(\"etherscan\")) {\n try {\n providers.push(new EtherscanProvider(network, options.etherscan));\n }\n catch (error) { }\n }\n if (allowService(\"infura\")) {\n try {\n let projectId = options.infura;\n let projectSecret = undefined;\n if (typeof (projectId) === \"object\") {\n projectSecret = projectId.projectSecret;\n projectId = projectId.projectId;\n }\n providers.push(new InfuraProvider(network, projectId, projectSecret));\n }\n catch (error) { }\n }\n /*\n if (options.pocket !== \"-\") {\n try {\n let appId = options.pocket;\n let secretKey: undefined | string = undefined;\n let loadBalancer: undefined | boolean = undefined;\n if (typeof(appId) === \"object\") {\n loadBalancer = !!appId.loadBalancer;\n secretKey = appId.secretKey;\n appId = appId.appId;\n }\n providers.push(new PocketProvider(network, appId, secretKey, loadBalancer));\n } catch (error) { console.log(error); }\n }\n */\n if (allowService(\"quicknode\")) {\n try {\n let token = options.quicknode;\n providers.push(new QuickNodeProvider(network, token));\n }\n catch (error) { }\n }\n assert(providers.length, \"unsupported default network\", \"UNSUPPORTED_OPERATION\", {\n operation: \"getDefaultProvider\"\n });\n // No need for a FallbackProvider\n if (providers.length === 1) {\n return providers[0];\n }\n // We use the floor because public third-party providers can be unreliable,\n // so a low number of providers with a large quorum will fail too often\n let quorum = Math.floor(providers.length / 2);\n if (quorum > 2) {\n quorum = 2;\n }\n // Testnets don't need as strong a security gaurantee and speed is\n // more useful during testing\n if (staticNetwork && Testnets.indexOf(staticNetwork.name) !== -1) {\n quorum = 1;\n }\n // Provided override qorum takes priority\n if (options && options.quorum) {\n quorum = options.quorum;\n }\n return new FallbackProvider(providers, undefined, { quorum });\n}\n//# sourceMappingURL=default-provider.js.map","import { defineProperties } from \"../utils/index.js\";\nimport { AbstractSigner } from \"./abstract-signer.js\";\n/**\n * A **NonceManager** wraps another [[Signer]] and automatically manages\n * the nonce, ensuring serialized and sequential nonces are used during\n * transaction.\n */\nexport class NonceManager extends AbstractSigner {\n /**\n * The Signer being managed.\n */\n signer;\n #noncePromise;\n #delta;\n /**\n * Creates a new **NonceManager** to manage %%signer%%.\n */\n constructor(signer) {\n super(signer.provider);\n defineProperties(this, { signer });\n this.#noncePromise = null;\n this.#delta = 0;\n }\n async getAddress() {\n return this.signer.getAddress();\n }\n connect(provider) {\n return new NonceManager(this.signer.connect(provider));\n }\n async getNonce(blockTag) {\n if (blockTag === \"pending\") {\n if (this.#noncePromise == null) {\n this.#noncePromise = super.getNonce(\"pending\");\n }\n const delta = this.#delta;\n return (await this.#noncePromise) + delta;\n }\n return super.getNonce(blockTag);\n }\n /**\n * Manually increment the nonce. This may be useful when managng\n * offline transactions.\n */\n increment() {\n this.#delta++;\n }\n /**\n * Resets the nonce, causing the **NonceManager** to reload the current\n * nonce from the blockchain on the next transaction.\n */\n reset() {\n this.#delta = 0;\n this.#noncePromise = null;\n }\n async sendTransaction(tx) {\n const noncePromise = this.getNonce(\"pending\");\n this.increment();\n tx = await this.signer.populateTransaction(tx);\n tx.nonce = await noncePromise;\n // @TODO: Maybe handle interesting/recoverable errors?\n // Like don't increment if the tx was certainly not sent\n return await this.signer.sendTransaction(tx);\n }\n signTransaction(tx) {\n return this.signer.signTransaction(tx);\n }\n signMessage(message) {\n return this.signer.signMessage(message);\n }\n signTypedData(domain, types, value) {\n return this.signer.signTypedData(domain, types, value);\n }\n}\n//# sourceMappingURL=signer-noncemanager.js.map","import { assertArgument, makeError } from \"../utils/index.js\";\nimport { JsonRpcApiPollingProvider } from \"./provider-jsonrpc.js\";\n;\n/**\n * A **BrowserProvider** is intended to wrap an injected provider which\n * adheres to the [[link-eip-1193]] standard, which most (if not all)\n * currently do.\n */\nexport class BrowserProvider extends JsonRpcApiPollingProvider {\n #request;\n #providerInfo;\n /**\n * Connect to the %%ethereum%% provider, optionally forcing the\n * %%network%%.\n */\n constructor(ethereum, network, _options) {\n // Copy the options\n const options = Object.assign({}, ((_options != null) ? _options : {}), { batchMaxCount: 1 });\n assertArgument(ethereum && ethereum.request, \"invalid EIP-1193 provider\", \"ethereum\", ethereum);\n super(network, options);\n this.#providerInfo = null;\n if (_options && _options.providerInfo) {\n this.#providerInfo = _options.providerInfo;\n }\n this.#request = async (method, params) => {\n const payload = { method, params };\n this.emit(\"debug\", { action: \"sendEip1193Request\", payload });\n try {\n const result = await ethereum.request(payload);\n this.emit(\"debug\", { action: \"receiveEip1193Result\", result });\n return result;\n }\n catch (e) {\n const error = new Error(e.message);\n error.code = e.code;\n error.data = e.data;\n error.payload = payload;\n this.emit(\"debug\", { action: \"receiveEip1193Error\", error });\n throw error;\n }\n };\n }\n get providerInfo() {\n return this.#providerInfo;\n }\n async send(method, params) {\n await this._start();\n return await super.send(method, params);\n }\n async _send(payload) {\n assertArgument(!Array.isArray(payload), \"EIP-1193 does not support batch request\", \"payload\", payload);\n try {\n const result = await this.#request(payload.method, payload.params || []);\n return [{ id: payload.id, result }];\n }\n catch (e) {\n return [{\n id: payload.id,\n error: { code: e.code, data: e.data, message: e.message }\n }];\n }\n }\n getRpcError(payload, error) {\n error = JSON.parse(JSON.stringify(error));\n // EIP-1193 gives us some machine-readable error codes, so rewrite\n // them into Ethers standard errors.\n switch (error.error.code || -1) {\n case 4001:\n error.error.message = `ethers-user-denied: ${error.error.message}`;\n break;\n case 4200:\n error.error.message = `ethers-unsupported: ${error.error.message}`;\n break;\n }\n return super.getRpcError(payload, error);\n }\n /**\n * Resolves to ``true`` if the provider manages the %%address%%.\n */\n async hasSigner(address) {\n if (address == null) {\n address = 0;\n }\n const accounts = await this.send(\"eth_accounts\", []);\n if (typeof (address) === \"number\") {\n return (accounts.length > address);\n }\n address = address.toLowerCase();\n return accounts.filter((a) => (a.toLowerCase() === address)).length !== 0;\n }\n async getSigner(address) {\n if (address == null) {\n address = 0;\n }\n if (!(await this.hasSigner(address))) {\n try {\n await this.#request(\"eth_requestAccounts\", []);\n }\n catch (error) {\n const payload = error.payload;\n throw this.getRpcError(payload, { id: payload.id, error });\n }\n }\n return await super.getSigner(address);\n }\n /**\n * Discover and connect to a Provider in the Browser using the\n * [[link-eip-6963]] discovery mechanism. If no providers are\n * present, ``null`` is resolved.\n */\n static async discover(options) {\n if (options == null) {\n options = {};\n }\n if (options.provider) {\n return new BrowserProvider(options.provider);\n }\n const context = options.window ? options.window :\n (typeof (window) !== \"undefined\") ? window : null;\n if (context == null) {\n return null;\n }\n const anyProvider = options.anyProvider;\n if (anyProvider && context.ethereum) {\n return new BrowserProvider(context.ethereum);\n }\n if (!(\"addEventListener\" in context && \"dispatchEvent\" in context\n && \"removeEventListener\" in context)) {\n return null;\n }\n const timeout = options.timeout ? options.timeout : 300;\n if (timeout === 0) {\n return null;\n }\n return await (new Promise((resolve, reject) => {\n let found = [];\n const addProvider = (event) => {\n found.push(event.detail);\n if (anyProvider) {\n finalize();\n }\n };\n const finalize = () => {\n clearTimeout(timer);\n if (found.length) {\n // If filtering is provided:\n if (options && options.filter) {\n // Call filter, with a copies of found provider infos\n const filtered = options.filter(found.map(i => Object.assign({}, (i.info))));\n if (filtered == null) {\n // No provider selected\n resolve(null);\n }\n else if (filtered instanceof BrowserProvider) {\n // Custom provider created\n resolve(filtered);\n }\n else {\n // Find the matching provider\n let match = null;\n if (filtered.uuid) {\n const matches = found.filter(f => (filtered.uuid === f.info.uuid));\n // @TODO: What should happen if multiple values\n // for the same UUID?\n match = matches[0];\n }\n if (match) {\n const { provider, info } = match;\n resolve(new BrowserProvider(provider, undefined, {\n providerInfo: info\n }));\n }\n else {\n reject(makeError(\"filter returned unknown info\", \"UNSUPPORTED_OPERATION\", {\n value: filtered\n }));\n }\n }\n }\n else {\n // Pick the first found provider\n const { provider, info } = found[0];\n resolve(new BrowserProvider(provider, undefined, {\n providerInfo: info\n }));\n }\n }\n else {\n // Nothing found\n resolve(null);\n }\n context.removeEventListener(\"eip6963:announceProvider\", addProvider);\n };\n const timer = setTimeout(() => { finalize(); }, timeout);\n context.addEventListener(\"eip6963:announceProvider\", addProvider);\n context.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n }));\n }\n}\n//# sourceMappingURL=provider-browser.js.map","/**\n * [[link-blockscout]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Sepolia Testnet (``sepolia``)\n * - Holesky Testnet (``holesky``)\n * - Ethereum Classic (``classic``)\n * - Arbitrum (``arbitrum``)\n * - Base (``base``)\n * - Base Sepolia Testnet (``base-sepolia``)\n * - Gnosis (``xdai``)\n * - Optimism (``optimism``)\n * - Optimism Sepolia Testnet (``optimism-sepolia``)\n * - Polygon (``matic``)\n *\n * @_subsection: api/providers/thirdparty:Blockscout [providers-blockscout]\n */\nimport { assertArgument, defineProperties, FetchRequest, isHexString } from \"../utils/index.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nfunction getUrl(name) {\n switch (name) {\n case \"mainnet\":\n return \"https:/\\/eth.blockscout.com/api/eth-rpc\";\n case \"sepolia\":\n return \"https:/\\/eth-sepolia.blockscout.com/api/eth-rpc\";\n case \"holesky\":\n return \"https:/\\/eth-holesky.blockscout.com/api/eth-rpc\";\n case \"classic\":\n return \"https:/\\/etc.blockscout.com/api/eth-rpc\";\n case \"arbitrum\":\n return \"https:/\\/arbitrum.blockscout.com/api/eth-rpc\";\n case \"base\":\n return \"https:/\\/base.blockscout.com/api/eth-rpc\";\n case \"base-sepolia\":\n return \"https:/\\/base-sepolia.blockscout.com/api/eth-rpc\";\n case \"matic\":\n return \"https:/\\/polygon.blockscout.com/api/eth-rpc\";\n case \"optimism\":\n return \"https:/\\/optimism.blockscout.com/api/eth-rpc\";\n case \"optimism-sepolia\":\n return \"https:/\\/optimism-sepolia.blockscout.com/api/eth-rpc\";\n case \"xdai\":\n return \"https:/\\/gnosis.blockscout.com/api/eth-rpc\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **BlockscoutProvider** connects to the [[link-blockscout]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-blockscout).\n */\nexport class BlockscoutProvider extends JsonRpcProvider {\n /**\n * The API key.\n */\n apiKey;\n /**\n * Creates a new **BlockscoutProvider**.\n */\n constructor(_network, apiKey) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (apiKey == null) {\n apiKey = null;\n }\n const request = BlockscoutProvider.getRequest(network);\n super(request, network, { staticNetwork: network });\n defineProperties(this, { apiKey });\n }\n _getProvider(chainId) {\n try {\n return new BlockscoutProvider(chainId, this.apiKey);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n isCommunityResource() {\n return (this.apiKey === null);\n }\n getRpcRequest(req) {\n // Blockscout enforces the TAG argument for estimateGas\n const resp = super.getRpcRequest(req);\n if (resp && resp.method === \"eth_estimateGas\" && resp.args.length == 1) {\n resp.args = resp.args.slice();\n resp.args.push(\"latest\");\n }\n return resp;\n }\n getRpcError(payload, _error) {\n const error = _error ? _error.error : null;\n // Blockscout currently drops the VM result and replaces it with a\n // human-readable string, so we need to make it machine-readable.\n if (error && error.code === -32015 && !isHexString(error.data || \"\", true)) {\n const panicCodes = {\n \"assert(false)\": \"01\",\n \"arithmetic underflow or overflow\": \"11\",\n \"division or modulo by zero\": \"12\",\n \"out-of-bounds array access; popping on an empty array\": \"31\",\n \"out-of-bounds access of an array or bytesN\": \"32\"\n };\n let panicCode = \"\";\n if (error.message === \"VM execution error.\") {\n // eth_call passes this message\n panicCode = panicCodes[error.data] || \"\";\n }\n else if (panicCodes[error.message || \"\"]) {\n panicCode = panicCodes[error.message || \"\"];\n }\n if (panicCode) {\n error.message += ` (reverted: ${error.data})`;\n error.data = \"0x4e487b7100000000000000000000000000000000000000000000000000000000000000\" + panicCode;\n }\n }\n else if (error && error.code === -32000) {\n if (error.message === \"wrong transaction nonce\") {\n error.message += \" (nonce too low)\";\n }\n }\n return super.getRpcError(payload, _error);\n }\n /**\n * Returns a prepared request for connecting to %%network%%\n * with %%apiKey%%.\n */\n static getRequest(network) {\n const request = new FetchRequest(getUrl(network.name));\n request.allowGzip = true;\n return request;\n }\n}\n//# sourceMappingURL=provider-blockscout.js.map","/**\n * [[link-pocket]] provides a third-party service for connecting to\n * various blockchains over JSON-RPC.\n *\n * **Supported Networks**\n *\n * - Ethereum Mainnet (``mainnet``)\n * - Goerli Testnet (``goerli``)\n * - Polygon (``matic``)\n * - Arbitrum (``arbitrum``)\n *\n * @_subsection: api/providers/thirdparty:Pocket [providers-pocket]\n */\nimport { defineProperties, FetchRequest, assertArgument } from \"../utils/index.js\";\nimport { showThrottleMessage } from \"./community.js\";\nimport { Network } from \"./network.js\";\nimport { JsonRpcProvider } from \"./provider-jsonrpc.js\";\nconst defaultApplicationId = \"62e1ad51b37b8e00394bda3b\";\nfunction getHost(name) {\n switch (name) {\n case \"mainnet\":\n return \"eth-mainnet.gateway.pokt.network\";\n case \"goerli\":\n return \"eth-goerli.gateway.pokt.network\";\n case \"matic\":\n return \"poly-mainnet.gateway.pokt.network\";\n case \"matic-mumbai\":\n return \"polygon-mumbai-rpc.gateway.pokt.network\";\n }\n assertArgument(false, \"unsupported network\", \"network\", name);\n}\n/**\n * The **PocketProvider** connects to the [[link-pocket]]\n * JSON-RPC end-points.\n *\n * By default, a highly-throttled API key is used, which is\n * appropriate for quick prototypes and simple scripts. To\n * gain access to an increased rate-limit, it is highly\n * recommended to [sign up here](link-pocket-signup).\n */\nexport class PocketProvider extends JsonRpcProvider {\n /**\n * The Application ID for the Pocket connection.\n */\n applicationId;\n /**\n * The Application Secret for making authenticated requests\n * to the Pocket connection.\n */\n applicationSecret;\n /**\n * Create a new **PocketProvider**.\n *\n * By default connecting to ``mainnet`` with a highly throttled\n * API key.\n */\n constructor(_network, applicationId, applicationSecret) {\n if (_network == null) {\n _network = \"mainnet\";\n }\n const network = Network.from(_network);\n if (applicationId == null) {\n applicationId = defaultApplicationId;\n }\n if (applicationSecret == null) {\n applicationSecret = null;\n }\n const options = { staticNetwork: network };\n const request = PocketProvider.getRequest(network, applicationId, applicationSecret);\n super(request, network, options);\n defineProperties(this, { applicationId, applicationSecret });\n }\n _getProvider(chainId) {\n try {\n return new PocketProvider(chainId, this.applicationId, this.applicationSecret);\n }\n catch (error) { }\n return super._getProvider(chainId);\n }\n /**\n * Returns a prepared request for connecting to %%network%% with\n * %%applicationId%%.\n */\n static getRequest(network, applicationId, applicationSecret) {\n if (applicationId == null) {\n applicationId = defaultApplicationId;\n }\n const request = new FetchRequest(`https:/\\/${getHost(network.name)}/v1/lb/${applicationId}`);\n request.allowGzip = true;\n if (applicationSecret) {\n request.setCredentials(\"\", applicationSecret);\n }\n if (applicationId === defaultApplicationId) {\n request.retryFunc = async (request, response, attempt) => {\n showThrottleMessage(\"PocketProvider\");\n return true;\n };\n }\n return request;\n }\n isCommunityResource() {\n return (this.applicationId === defaultApplicationId);\n }\n}\n//# sourceMappingURL=provider-pocket.js.map","const IpcSocketProvider = undefined;\nexport { IpcSocketProvider };\n//# sourceMappingURL=provider-ipcsocket-browser.js.map","import { getAddress, resolveAddress } from \"../address/index.js\";\nimport { hashAuthorization, hashMessage, TypedDataEncoder } from \"../hash/index.js\";\nimport { AbstractSigner, copyRequest } from \"../providers/index.js\";\nimport { computeAddress, Transaction } from \"../transaction/index.js\";\nimport { defineProperties, getBigInt, resolveProperties, assert, assertArgument } from \"../utils/index.js\";\n/**\n * The **BaseWallet** is a stream-lined implementation of a\n * [[Signer]] that operates with a private key.\n *\n * It is preferred to use the [[Wallet]] class, as it offers\n * additional functionality and simplifies loading a variety\n * of JSON formats, Mnemonic Phrases, etc.\n *\n * This class may be of use for those attempting to implement\n * a minimal Signer.\n */\nexport class BaseWallet extends AbstractSigner {\n /**\n * The wallet address.\n */\n address;\n #signingKey;\n /**\n * Creates a new BaseWallet for %%privateKey%%, optionally\n * connected to %%provider%%.\n *\n * If %%provider%% is not specified, only offline methods can\n * be used.\n */\n constructor(privateKey, provider) {\n super(provider);\n assertArgument(privateKey && typeof (privateKey.sign) === \"function\", \"invalid private key\", \"privateKey\", \"[ REDACTED ]\");\n this.#signingKey = privateKey;\n const address = computeAddress(this.signingKey.publicKey);\n defineProperties(this, { address });\n }\n // Store private values behind getters to reduce visibility\n // in console.log\n /**\n * The [[SigningKey]] used for signing payloads.\n */\n get signingKey() { return this.#signingKey; }\n /**\n * The private key for this wallet.\n */\n get privateKey() { return this.signingKey.privateKey; }\n async getAddress() { return this.address; }\n connect(provider) {\n return new BaseWallet(this.#signingKey, provider);\n }\n async signTransaction(tx) {\n tx = copyRequest(tx);\n // Replace any Addressable or ENS name with an address\n const { to, from } = await resolveProperties({\n to: (tx.to ? resolveAddress(tx.to, this) : undefined),\n from: (tx.from ? resolveAddress(tx.from, this) : undefined)\n });\n if (to != null) {\n tx.to = to;\n }\n if (from != null) {\n tx.from = from;\n }\n if (tx.from != null) {\n assertArgument(getAddress((tx.from)) === this.address, \"transaction from address mismatch\", \"tx.from\", tx.from);\n delete tx.from;\n }\n // Build the transaction\n const btx = Transaction.from(tx);\n btx.signature = this.signingKey.sign(btx.unsignedHash);\n return btx.serialized;\n }\n async signMessage(message) {\n return this.signMessageSync(message);\n }\n // @TODO: Add a secialized signTx and signTyped sync that enforces\n // all parameters are known?\n /**\n * Returns the signature for %%message%% signed with this wallet.\n */\n signMessageSync(message) {\n return this.signingKey.sign(hashMessage(message)).serialized;\n }\n /**\n * Returns the Authorization for %%auth%%.\n */\n authorizeSync(auth) {\n assertArgument(typeof (auth.address) === \"string\", \"invalid address for authorizeSync\", \"auth.address\", auth);\n const signature = this.signingKey.sign(hashAuthorization(auth));\n return Object.assign({}, {\n address: getAddress(auth.address),\n nonce: getBigInt(auth.nonce || 0),\n chainId: getBigInt(auth.chainId || 0),\n }, { signature });\n }\n /**\n * Resolves to the Authorization for %%auth%%.\n */\n async authorize(auth) {\n auth = Object.assign({}, auth, {\n address: await resolveAddress(auth.address, this)\n });\n return this.authorizeSync(await this.populateAuthorization(auth));\n }\n async signTypedData(domain, types, value) {\n // Populate any ENS names\n const populated = await TypedDataEncoder.resolveNames(domain, types, value, async (name) => {\n // @TODO: this should use resolveName; addresses don't\n // need a provider\n assert(this.provider != null, \"cannot resolve ENS names without a provider\", \"UNSUPPORTED_OPERATION\", {\n operation: \"resolveName\",\n info: { name }\n });\n const address = await this.provider.resolveName(name);\n assert(address != null, \"unconfigured ENS name\", \"UNCONFIGURED_NAME\", {\n value: name\n });\n return address;\n });\n return this.signingKey.sign(TypedDataEncoder.hash(populated.domain, types, populated.value)).serialized;\n }\n}\n//# sourceMappingURL=base-wallet.js.map","import { assertArgument } from \"../utils/index.js\";\nconst subsChrs = \" !#$%&'()*+,-./<=>?@[]^_`{|}~\";\nconst Word = /^[a-z]*$/i;\nfunction unfold(words, sep) {\n let initial = 97;\n return words.reduce((accum, word) => {\n if (word === sep) {\n initial++;\n }\n else if (word.match(Word)) {\n accum.push(String.fromCharCode(initial) + word);\n }\n else {\n initial = 97;\n accum.push(word);\n }\n return accum;\n }, []);\n}\n/**\n * @_ignore\n */\nexport function decode(data, subs) {\n // Replace all the substitutions with their expanded form\n for (let i = subsChrs.length - 1; i >= 0; i--) {\n data = data.split(subsChrs[i]).join(subs.substring(2 * i, 2 * i + 2));\n }\n // Get all tle clumps; each suffix, first-increment and second-increment\n const clumps = [];\n const leftover = data.replace(/(:|([0-9])|([A-Z][a-z]*))/g, (all, item, semi, word) => {\n if (semi) {\n for (let i = parseInt(semi); i >= 0; i--) {\n clumps.push(\";\");\n }\n }\n else {\n clumps.push(item.toLowerCase());\n }\n return \"\";\n });\n /* c8 ignore start */\n if (leftover) {\n throw new Error(`leftovers: ${JSON.stringify(leftover)}`);\n }\n /* c8 ignore stop */\n return unfold(unfold(clumps, \";\"), \":\");\n}\n/**\n * @_ignore\n */\nexport function decodeOwl(data) {\n assertArgument(data[0] === \"0\", \"unsupported auwl data\", \"data\", data);\n return decode(data.substring(1 + 2 * subsChrs.length), data.substring(1, 1 + 2 * subsChrs.length));\n}\n//# sourceMappingURL=decode-owl.js.map","import { defineProperties } from \"../utils/index.js\";\n/**\n * A Wordlist represents a collection of language-specific\n * words used to encode and devoce [[link-bip-39]] encoded data\n * by mapping words to 11-bit values and vice versa.\n */\nexport class Wordlist {\n locale;\n /**\n * Creates a new Wordlist instance.\n *\n * Sub-classes MUST call this if they provide their own constructor,\n * passing in the locale string of the language.\n *\n * Generally there is no need to create instances of a Wordlist,\n * since each language-specific Wordlist creates an instance and\n * there is no state kept internally, so they are safe to share.\n */\n constructor(locale) {\n defineProperties(this, { locale });\n }\n /**\n * Sub-classes may override this to provide a language-specific\n * method for spliting %%phrase%% into individual words.\n *\n * By default, %%phrase%% is split using any sequences of\n * white-space as defined by regular expressions (i.e. ``/\\s+/``).\n */\n split(phrase) {\n return phrase.toLowerCase().split(/\\s+/g);\n }\n /**\n * Sub-classes may override this to provider a language-specific\n * method for joining %%words%% into a phrase.\n *\n * By default, %%words%% are joined by a single space.\n */\n join(words) {\n return words.join(\" \");\n }\n}\n//# sourceMappingURL=wordlist.js.map","// Use the encode-latin.js script to create the necessary\n// data files to be consumed by this class\nimport { id } from \"../hash/index.js\";\nimport { assertArgument } from \"../utils/index.js\";\nimport { decodeOwl } from \"./decode-owl.js\";\nimport { Wordlist } from \"./wordlist.js\";\n/**\n * An OWL format Wordlist is an encoding method that exploits\n * the general locality of alphabetically sorted words to\n * achieve a simple but effective means of compression.\n *\n * This class is generally not useful to most developers as\n * it is used mainly internally to keep Wordlists for languages\n * based on ASCII-7 small.\n *\n * If necessary, there are tools within the ``generation/`` folder\n * to create the necessary data.\n */\nexport class WordlistOwl extends Wordlist {\n #data;\n #checksum;\n /**\n * Creates a new Wordlist for %%locale%% using the OWL %%data%%\n * and validated against the %%checksum%%.\n */\n constructor(locale, data, checksum) {\n super(locale);\n this.#data = data;\n this.#checksum = checksum;\n this.#words = null;\n }\n /**\n * The OWL-encoded data.\n */\n get _data() { return this.#data; }\n /**\n * Decode all the words for the wordlist.\n */\n _decodeWords() {\n return decodeOwl(this.#data);\n }\n #words;\n #loadWords() {\n if (this.#words == null) {\n const words = this._decodeWords();\n // Verify the computed list matches the official list\n const checksum = id(words.join(\"\\n\") + \"\\n\");\n /* c8 ignore start */\n if (checksum !== this.#checksum) {\n throw new Error(`BIP39 Wordlist for ${this.locale} FAILED`);\n }\n /* c8 ignore stop */\n this.#words = words;\n }\n return this.#words;\n }\n getWord(index) {\n const words = this.#loadWords();\n assertArgument(index >= 0 && index < words.length, `invalid word index: ${index}`, \"index\", index);\n return words[index];\n }\n getWordIndex(word) {\n return this.#loadWords().indexOf(word);\n }\n}\n//# sourceMappingURL=wordlist-owl.js.map","import { WordlistOwl } from \"./wordlist-owl.js\";\nconst words = \"0erleonalorenseinceregesticitStanvetearctssi#ch2Athck&tneLl0And#Il.yLeOutO=S|S%b/ra@SurdU'0Ce[Cid|CountCu'Hie=IdOu,-Qui*Ro[TT]T%T*[Tu$0AptDD-tD*[Ju,M.UltV<)Vi)0Rob-0FairF%dRaid0A(EEntRee0Ead0MRRp%tS!_rmBumCoholErtI&LLeyLowMo,O}PhaReadySoT Ways0A>urAz(gOngOuntU'd0Aly,Ch%Ci|G G!GryIm$K!Noun)Nu$O` Sw T&naTiqueXietyY1ArtOlogyPe?P!Pro=Ril1ChCt-EaEnaGueMMedM%MyOundR<+Re,Ri=RowTTefa@Ti,Tw%k0KPe@SaultSetSi,SumeThma0H!>OmTa{T&dT.udeTra@0Ct]D.Gu,NtTh%ToTumn0Era+OcadoOid0AkeA*AyEsomeFulKw?d0Is:ByChel%C#D+GL<)Lc#y~MbooN_{Ad!AftAmA}AshAt AwlAzyEamEd.EekEwI{etImeIspIt-OpO[Ou^OwdUci$UelUi'Umb!Un^UshYY,$2BeLtu*PPbo?dRiousRr|Rta(R=Sh]/omTe3C!:DMa+MpN)Ng R(gShUght WnY3AlBa>BrisCadeCemb CideCl(eC%a>C*a'ErF&'F(eFyG*eLayLiv M3AgramAlAm#dAryCeE'lEtFf G.$Gn.yLemmaNn NosaurRe@RtSag*eScov Sea'ShSmi[S%d Splay/<)V tVideV%)Zzy5Ct%Cum|G~Lph(Ma(Na>NkeyN%OrSeUb!Ve_ftAg#AmaA,-AwEamE[IftIllInkIpI=OpUmY2CkMbNeR(g/T^Ty1Arf1Nam-:G G!RlyRnR`Sily/Sy1HoOlogyOnomy0GeItUca>1F%t0G1GhtTh 2BowD E@r-EgSe0B?kBodyBra)Er+Ot]PloyPow Pty0Ab!A@DD![D%'EmyErgyF%)Ga+G(eH<)JoyLi,OughR-hRollSu*T Ti*TryVelope1Isode0U$Uip0AA'OdeOs]R%Upt0CapeSayS&)Ta>0Ern$H-s1Id&)IlOkeOl=1A@Amp!Ce[Ch<+C.eCludeCu'Ecu>Erci'Hau,Hib.I!I,ItOt-PM&'Mu}Pa@Po'Pro=Pul'0ChCludeComeC*a'DexD-a>Do%Du,ryFN Noc|PutQuirySSue0Em1Ory:CketGu?RZz3AlousAns~yWel9BInKeUr}yY5D+I)MpNg!Ni%Nk/:Ng?oo3EnEpT^upY3CkDD}yNdNgdomSsTT^&TeTt&Wi4EeIfeO{Ow:BBelB%Dd DyKeMpNgua+PtopR+T T(UghUndryVaWWnWsu.Y Zy3Ad AfArnA=Ctu*FtGG$G&dIsu*M#NdNg`NsOp?dSs#Tt Vel3ArB tyBr?yC&'FeFtGhtKeMbM.NkOnQuid/Tt!VeZ?d5AdAnB, C$CkG-NelyNgOpTt yUdUn+VeY$5CkyGga+Mb N?N^Xury3R-s:Ch(eDG-G}tIdIlInJ%KeMm$NNa+Nda>NgoNs]Nu$P!Rb!R^Rg(R(eRketRria+SkSs/ T^T i$ThTrixTt XimumZe3AdowAnAsu*AtCh<-D$DiaLodyLtMb M%yNt]NuRcyR+R.RryShSsa+T$Thod3Dd!DnightLk~]M-NdNimumN%Nu>Rac!Rr%S ySs/akeXXedXtu*5Bi!DelDifyMM|N.%NkeyN, N`OnR$ReRn(gSqu.oTh T]T%Unta(U'VeVie5ChFf(LeLtiplySc!SeumShroomS-/Tu$3Self/ yTh:I=MePk(Rrow/yT]Tu*3ArCkEdGati=G!@I` PhewR=/TTw%kUtr$V WsXt3CeGht5B!I'M(eeOd!Rm$R`SeTab!TeTh(gTi)VelW5C!?Mb R'T:K0EyJe@Li+Scu*S =Ta(Vious0CurEAyEa'Ed+U{UgUn+2EmEtIntL?LeLi)NdNyOlPul?Rt]S.]Ssib!/TatoTt yV tyWd W _@i)Ai'Ed-tEf Epa*Es|EttyEv|I)IdeIm?yIntI%.yIs#Iva>IzeOb!mO)[Odu)Of.OgramOje@Omo>OofOp tyOsp O>@OudOvide2Bl-Dd(g~LpL'Mpk(N^PilPpyR^a'R.yRpo'R'ShTZz!3Ramid:99Al.yAntumArt E,]I{ItIzO>:Bb.Cco#CeCkD?DioIlInI'~yMpN^NdomN+PidReTeTh V&WZ%3AdyAlAs#BelBuildC$lCei=CipeC%dCyc!Du)F!@F%mFu'G]G*tGul?Je@LaxLea'LiefLyMa(Memb M(dMo=Nd NewNtOp&PairPeatPla)P%tQui*ScueSemb!Si,Sour)Sp#'SultTi*T*atTurnUn]Ve$ViewW?d2Y`m0BBb#CeChDeD+F!GhtGidNgOtPp!SkTu$V$V 5AdA,BotBu,CketM<)OfOkieOmSeTa>UghUndU>Y$5Bb DeGLeNNwayR$:DDd!D}[FeIlLadLm#L#LtLu>MeMp!NdTisfyToshiU)Usa+VeY1A!AnA*Att E}HemeHoolI&)I[%sOrp]OutRapRe&RiptRub1AAr^As#AtC#dC*tCt]Cur.yEdEkGm|Le@~M(?Ni%N'Nt&)RiesRvi)Ss]Tt!TupV&_dowAftAllowA*EdEllEriffIeldIftI}IpIv O{OeOotOpOrtOuld O=RimpRugUff!Y0Bl(gCkDeE+GhtGnL|Lk~yLv Mil?Mp!N)NgR&/ Tua>XZe1A>Et^IIllInIrtUll0AbAmEepEnd I)IdeIghtImOgAyEakEelEmEpE*oI{IllIngO{Oma^O}OolOryO=Ra>gyReetRikeR#gRugg!Ud|UffUmb!Y!0Bje@Bm.BwayC)[ChDd&Ff G?G+,ItMm NNnyN'tP PplyP*meReRfa)R+Rpri'RroundR=ySpe@/a(1AllowAmpApArmE?EetIftImIngIt^Ord1MbolMptomRup/em:B!Ck!GIlL|LkNkPeR+tSk/eTtooXi3A^Am~NNGradeHoldOnP Set1BOng::Rd3Ar~ow9UUngU`:3BraRo9NeO\";\nconst checksum = \"0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60\";\nlet wordlist = null;\n/**\n * The [[link-bip39-en]] for [mnemonic phrases](link-bip-39).\n *\n * @_docloc: api/wordlists\n */\nexport class LangEn extends WordlistOwl {\n /**\n * Creates a new instance of the English language Wordlist.\n *\n * This should be unnecessary most of the time as the exported\n * [[langEn]] should suffice.\n *\n * @_ignore:\n */\n constructor() { super(\"en\", words, checksum); }\n /**\n * Returns a singleton instance of a ``LangEn``, creating it\n * if this is the first time being called.\n */\n static wordlist() {\n if (wordlist == null) {\n wordlist = new LangEn();\n }\n return wordlist;\n }\n}\n//# sourceMappingURL=lang-en.js.map","import { pbkdf2, sha256 } from \"../crypto/index.js\";\nimport { defineProperties, getBytes, hexlify, assertNormalize, assertPrivate, assertArgument, toUtf8Bytes } from \"../utils/index.js\";\nimport { LangEn } from \"../wordlists/lang-en.js\";\n// Returns a byte with the MSB bits set\nfunction getUpperMask(bits) {\n return ((1 << bits) - 1) << (8 - bits) & 0xff;\n}\n// Returns a byte with the LSB bits set\nfunction getLowerMask(bits) {\n return ((1 << bits) - 1) & 0xff;\n}\nfunction mnemonicToEntropy(mnemonic, wordlist) {\n assertNormalize(\"NFKD\");\n if (wordlist == null) {\n wordlist = LangEn.wordlist();\n }\n const words = wordlist.split(mnemonic);\n assertArgument((words.length % 3) === 0 && words.length >= 12 && words.length <= 24, \"invalid mnemonic length\", \"mnemonic\", \"[ REDACTED ]\");\n const entropy = new Uint8Array(Math.ceil(11 * words.length / 8));\n let offset = 0;\n for (let i = 0; i < words.length; i++) {\n let index = wordlist.getWordIndex(words[i].normalize(\"NFKD\"));\n assertArgument(index >= 0, `invalid mnemonic word at index ${i}`, \"mnemonic\", \"[ REDACTED ]\");\n for (let bit = 0; bit < 11; bit++) {\n if (index & (1 << (10 - bit))) {\n entropy[offset >> 3] |= (1 << (7 - (offset % 8)));\n }\n offset++;\n }\n }\n const entropyBits = 32 * words.length / 3;\n const checksumBits = words.length / 3;\n const checksumMask = getUpperMask(checksumBits);\n const checksum = getBytes(sha256(entropy.slice(0, entropyBits / 8)))[0] & checksumMask;\n assertArgument(checksum === (entropy[entropy.length - 1] & checksumMask), \"invalid mnemonic checksum\", \"mnemonic\", \"[ REDACTED ]\");\n return hexlify(entropy.slice(0, entropyBits / 8));\n}\nfunction entropyToMnemonic(entropy, wordlist) {\n assertArgument((entropy.length % 4) === 0 && entropy.length >= 16 && entropy.length <= 32, \"invalid entropy size\", \"entropy\", \"[ REDACTED ]\");\n if (wordlist == null) {\n wordlist = LangEn.wordlist();\n }\n const indices = [0];\n let remainingBits = 11;\n for (let i = 0; i < entropy.length; i++) {\n // Consume the whole byte (with still more to go)\n if (remainingBits > 8) {\n indices[indices.length - 1] <<= 8;\n indices[indices.length - 1] |= entropy[i];\n remainingBits -= 8;\n // This byte will complete an 11-bit index\n }\n else {\n indices[indices.length - 1] <<= remainingBits;\n indices[indices.length - 1] |= entropy[i] >> (8 - remainingBits);\n // Start the next word\n indices.push(entropy[i] & getLowerMask(8 - remainingBits));\n remainingBits += 3;\n }\n }\n // Compute the checksum bits\n const checksumBits = entropy.length / 4;\n const checksum = parseInt(sha256(entropy).substring(2, 4), 16) & getUpperMask(checksumBits);\n // Shift the checksum into the word indices\n indices[indices.length - 1] <<= checksumBits;\n indices[indices.length - 1] |= (checksum >> (8 - checksumBits));\n return wordlist.join(indices.map((index) => wordlist.getWord(index)));\n}\nconst _guard = {};\n/**\n * A **Mnemonic** wraps all properties required to compute [[link-bip-39]]\n * seeds and convert between phrases and entropy.\n */\nexport class Mnemonic {\n /**\n * The mnemonic phrase of 12, 15, 18, 21 or 24 words.\n *\n * Use the [[wordlist]] ``split`` method to get the individual words.\n */\n phrase;\n /**\n * The password used for this mnemonic. If no password is used this\n * is the empty string (i.e. ``\"\"``) as per the specification.\n */\n password;\n /**\n * The wordlist for this mnemonic.\n */\n wordlist;\n /**\n * The underlying entropy which the mnemonic encodes.\n */\n entropy;\n /**\n * @private\n */\n constructor(guard, entropy, phrase, password, wordlist) {\n if (password == null) {\n password = \"\";\n }\n if (wordlist == null) {\n wordlist = LangEn.wordlist();\n }\n assertPrivate(guard, _guard, \"Mnemonic\");\n defineProperties(this, { phrase, password, wordlist, entropy });\n }\n /**\n * Returns the seed for the mnemonic.\n */\n computeSeed() {\n const salt = toUtf8Bytes(\"mnemonic\" + this.password, \"NFKD\");\n return pbkdf2(toUtf8Bytes(this.phrase, \"NFKD\"), salt, 2048, 64, \"sha512\");\n }\n /**\n * Creates a new Mnemonic for the %%phrase%%.\n *\n * The default %%password%% is the empty string and the default\n * wordlist is the [English wordlists](LangEn).\n */\n static fromPhrase(phrase, password, wordlist) {\n // Normalize the case and space; throws if invalid\n const entropy = mnemonicToEntropy(phrase, wordlist);\n phrase = entropyToMnemonic(getBytes(entropy), wordlist);\n return new Mnemonic(_guard, entropy, phrase, password, wordlist);\n }\n /**\n * Create a new **Mnemonic** from the %%entropy%%.\n *\n * The default %%password%% is the empty string and the default\n * wordlist is the [English wordlists](LangEn).\n */\n static fromEntropy(_entropy, password, wordlist) {\n const entropy = getBytes(_entropy, \"entropy\");\n const phrase = entropyToMnemonic(entropy, wordlist);\n return new Mnemonic(_guard, hexlify(entropy), phrase, password, wordlist);\n }\n /**\n * Returns the phrase for %%mnemonic%%.\n */\n static entropyToPhrase(_entropy, wordlist) {\n const entropy = getBytes(_entropy, \"entropy\");\n return entropyToMnemonic(entropy, wordlist);\n }\n /**\n * Returns the entropy for %%phrase%%.\n */\n static phraseToEntropy(phrase, wordlist) {\n return mnemonicToEntropy(phrase, wordlist);\n }\n /**\n * Returns true if %%phrase%% is a valid [[link-bip-39]] phrase.\n *\n * This checks all the provided words belong to the %%wordlist%%,\n * that the length is valid and the checksum is correct.\n */\n static isValidMnemonic(phrase, wordlist) {\n try {\n mnemonicToEntropy(phrase, wordlist);\n return true;\n }\n catch (error) { }\n return false;\n }\n}\n//# sourceMappingURL=mnemonic.js.map","/*! MIT License. Copyright 2015-2022 Richard Moore . See LICENSE.txt. */\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _AES_key, _AES_Kd, _AES_Ke;\n// Number of rounds by keysize\nconst numberOfRounds = { 16: 10, 24: 12, 32: 14 };\n// Round constant words\nconst rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91];\n// S-box and Inverse S-box (S is for Substitution)\nconst S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];\nconst Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d];\n// Transformations for encryption\nconst T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];\nconst T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];\nconst T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];\nconst T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c];\n// Transformations for decryption\nconst T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];\nconst T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];\nconst T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];\nconst T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0];\n// Transformations for decryption key expansion\nconst U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];\nconst U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];\nconst U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];\nconst U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];\nfunction convertToInt32(bytes) {\n const result = [];\n for (let i = 0; i < bytes.length; i += 4) {\n result.push((bytes[i] << 24) | (bytes[i + 1] << 16) | (bytes[i + 2] << 8) | bytes[i + 3]);\n }\n return result;\n}\nexport class AES {\n get key() { return __classPrivateFieldGet(this, _AES_key, \"f\").slice(); }\n constructor(key) {\n _AES_key.set(this, void 0);\n _AES_Kd.set(this, void 0);\n _AES_Ke.set(this, void 0);\n if (!(this instanceof AES)) {\n throw Error('AES must be instanitated with `new`');\n }\n __classPrivateFieldSet(this, _AES_key, new Uint8Array(key), \"f\");\n const rounds = numberOfRounds[this.key.length];\n if (rounds == null) {\n throw new TypeError('invalid key size (must be 16, 24 or 32 bytes)');\n }\n // encryption round keys\n __classPrivateFieldSet(this, _AES_Ke, [], \"f\");\n // decryption round keys\n __classPrivateFieldSet(this, _AES_Kd, [], \"f\");\n for (let i = 0; i <= rounds; i++) {\n __classPrivateFieldGet(this, _AES_Ke, \"f\").push([0, 0, 0, 0]);\n __classPrivateFieldGet(this, _AES_Kd, \"f\").push([0, 0, 0, 0]);\n }\n const roundKeyCount = (rounds + 1) * 4;\n const KC = this.key.length / 4;\n // convert the key into ints\n const tk = convertToInt32(this.key);\n // copy values into round key arrays\n let index;\n for (let i = 0; i < KC; i++) {\n index = i >> 2;\n __classPrivateFieldGet(this, _AES_Ke, \"f\")[index][i % 4] = tk[i];\n __classPrivateFieldGet(this, _AES_Kd, \"f\")[rounds - index][i % 4] = tk[i];\n }\n // key expansion (fips-197 section 5.2)\n let rconpointer = 0;\n let t = KC, tt;\n while (t < roundKeyCount) {\n tt = tk[KC - 1];\n tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^\n (S[(tt >> 8) & 0xFF] << 16) ^\n (S[tt & 0xFF] << 8) ^\n S[(tt >> 24) & 0xFF] ^\n (rcon[rconpointer] << 24));\n rconpointer += 1;\n // key expansion (for non-256 bit)\n if (KC != 8) {\n for (let i = 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n }\n // key expansion for 256-bit keys is \"slightly different\" (fips-197)\n }\n else {\n for (let i = 1; i < (KC / 2); i++) {\n tk[i] ^= tk[i - 1];\n }\n tt = tk[(KC / 2) - 1];\n tk[KC / 2] ^= (S[tt & 0xFF] ^\n (S[(tt >> 8) & 0xFF] << 8) ^\n (S[(tt >> 16) & 0xFF] << 16) ^\n (S[(tt >> 24) & 0xFF] << 24));\n for (let i = (KC / 2) + 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n }\n }\n // copy values into round key arrays\n let i = 0, r, c;\n while (i < KC && t < roundKeyCount) {\n r = t >> 2;\n c = t % 4;\n __classPrivateFieldGet(this, _AES_Ke, \"f\")[r][c] = tk[i];\n __classPrivateFieldGet(this, _AES_Kd, \"f\")[rounds - r][c] = tk[i++];\n t++;\n }\n }\n // inverse-cipher-ify the decryption round key (fips-197 section 5.3)\n for (let r = 1; r < rounds; r++) {\n for (let c = 0; c < 4; c++) {\n tt = __classPrivateFieldGet(this, _AES_Kd, \"f\")[r][c];\n __classPrivateFieldGet(this, _AES_Kd, \"f\")[r][c] = (U1[(tt >> 24) & 0xFF] ^\n U2[(tt >> 16) & 0xFF] ^\n U3[(tt >> 8) & 0xFF] ^\n U4[tt & 0xFF]);\n }\n }\n }\n encrypt(plaintext) {\n if (plaintext.length != 16) {\n throw new TypeError('invalid plaintext size (must be 16 bytes)');\n }\n const rounds = __classPrivateFieldGet(this, _AES_Ke, \"f\").length - 1;\n const a = [0, 0, 0, 0];\n // convert plaintext to (ints ^ key)\n let t = convertToInt32(plaintext);\n for (let i = 0; i < 4; i++) {\n t[i] ^= __classPrivateFieldGet(this, _AES_Ke, \"f\")[0][i];\n }\n // apply round transforms\n for (let r = 1; r < rounds; r++) {\n for (let i = 0; i < 4; i++) {\n a[i] = (T1[(t[i] >> 24) & 0xff] ^\n T2[(t[(i + 1) % 4] >> 16) & 0xff] ^\n T3[(t[(i + 2) % 4] >> 8) & 0xff] ^\n T4[t[(i + 3) % 4] & 0xff] ^\n __classPrivateFieldGet(this, _AES_Ke, \"f\")[r][i]);\n }\n t = a.slice();\n }\n // the last round is special\n const result = new Uint8Array(16);\n let tt = 0;\n for (let i = 0; i < 4; i++) {\n tt = __classPrivateFieldGet(this, _AES_Ke, \"f\")[rounds][i];\n result[4 * i] = (S[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;\n result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;\n result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;\n result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;\n }\n return result;\n }\n decrypt(ciphertext) {\n if (ciphertext.length != 16) {\n throw new TypeError('invalid ciphertext size (must be 16 bytes)');\n }\n const rounds = __classPrivateFieldGet(this, _AES_Kd, \"f\").length - 1;\n const a = [0, 0, 0, 0];\n // convert plaintext to (ints ^ key)\n let t = convertToInt32(ciphertext);\n for (let i = 0; i < 4; i++) {\n t[i] ^= __classPrivateFieldGet(this, _AES_Kd, \"f\")[0][i];\n }\n // apply round transforms\n for (let r = 1; r < rounds; r++) {\n for (let i = 0; i < 4; i++) {\n a[i] = (T5[(t[i] >> 24) & 0xff] ^\n T6[(t[(i + 3) % 4] >> 16) & 0xff] ^\n T7[(t[(i + 2) % 4] >> 8) & 0xff] ^\n T8[t[(i + 1) % 4] & 0xff] ^\n __classPrivateFieldGet(this, _AES_Kd, \"f\")[r][i]);\n }\n t = a.slice();\n }\n // the last round is special\n const result = new Uint8Array(16);\n let tt = 0;\n for (let i = 0; i < 4; i++) {\n tt = __classPrivateFieldGet(this, _AES_Kd, \"f\")[rounds][i];\n result[4 * i] = (Si[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;\n result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;\n result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;\n result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;\n }\n return result;\n }\n}\n_AES_key = new WeakMap(), _AES_Kd = new WeakMap(), _AES_Ke = new WeakMap();\n//# sourceMappingURL=aes.js.map","import { AES } from \"./aes.js\";\nexport class ModeOfOperation {\n constructor(name, key, cls) {\n if (cls && !(this instanceof cls)) {\n throw new Error(`${name} must be instantiated with \"new\"`);\n }\n Object.defineProperties(this, {\n aes: { enumerable: true, value: new AES(key) },\n name: { enumerable: true, value: name }\n });\n }\n}\n//# sourceMappingURL=mode.js.map","// Cipher Block Chaining\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _CBC_iv, _CBC_lastBlock;\nimport { ModeOfOperation } from \"./mode.js\";\nexport class CBC extends ModeOfOperation {\n constructor(key, iv) {\n super(\"ECC\", key, CBC);\n _CBC_iv.set(this, void 0);\n _CBC_lastBlock.set(this, void 0);\n if (iv) {\n if (iv.length % 16) {\n throw new TypeError(\"invalid iv size (must be 16 bytes)\");\n }\n __classPrivateFieldSet(this, _CBC_iv, new Uint8Array(iv), \"f\");\n }\n else {\n __classPrivateFieldSet(this, _CBC_iv, new Uint8Array(16), \"f\");\n }\n __classPrivateFieldSet(this, _CBC_lastBlock, this.iv, \"f\");\n }\n get iv() { return new Uint8Array(__classPrivateFieldGet(this, _CBC_iv, \"f\")); }\n encrypt(plaintext) {\n if (plaintext.length % 16) {\n throw new TypeError(\"invalid plaintext size (must be multiple of 16 bytes)\");\n }\n const ciphertext = new Uint8Array(plaintext.length);\n for (let i = 0; i < plaintext.length; i += 16) {\n for (let j = 0; j < 16; j++) {\n __classPrivateFieldGet(this, _CBC_lastBlock, \"f\")[j] ^= plaintext[i + j];\n }\n __classPrivateFieldSet(this, _CBC_lastBlock, this.aes.encrypt(__classPrivateFieldGet(this, _CBC_lastBlock, \"f\")), \"f\");\n ciphertext.set(__classPrivateFieldGet(this, _CBC_lastBlock, \"f\"), i);\n }\n return ciphertext;\n }\n decrypt(ciphertext) {\n if (ciphertext.length % 16) {\n throw new TypeError(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n }\n const plaintext = new Uint8Array(ciphertext.length);\n for (let i = 0; i < ciphertext.length; i += 16) {\n const block = this.aes.decrypt(ciphertext.subarray(i, i + 16));\n for (let j = 0; j < 16; j++) {\n plaintext[i + j] = block[j] ^ __classPrivateFieldGet(this, _CBC_lastBlock, \"f\")[j];\n __classPrivateFieldGet(this, _CBC_lastBlock, \"f\")[j] = ciphertext[i + j];\n }\n }\n return plaintext;\n }\n}\n_CBC_iv = new WeakMap(), _CBC_lastBlock = new WeakMap();\n//# sourceMappingURL=mode-cbc.js.map","// Counter Mode\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _CTR_remaining, _CTR_remainingIndex, _CTR_counter;\nimport { ModeOfOperation } from \"./mode.js\";\nexport class CTR extends ModeOfOperation {\n constructor(key, initialValue) {\n super(\"CTR\", key, CTR);\n // Remaining bytes for the one-time pad\n _CTR_remaining.set(this, void 0);\n _CTR_remainingIndex.set(this, void 0);\n // The current counter\n _CTR_counter.set(this, void 0);\n __classPrivateFieldSet(this, _CTR_counter, new Uint8Array(16), \"f\");\n __classPrivateFieldGet(this, _CTR_counter, \"f\").fill(0);\n __classPrivateFieldSet(this, _CTR_remaining, __classPrivateFieldGet(this, _CTR_counter, \"f\"), \"f\"); // This will be discarded immediately\n __classPrivateFieldSet(this, _CTR_remainingIndex, 16, \"f\");\n if (initialValue == null) {\n initialValue = 1;\n }\n if (typeof (initialValue) === \"number\") {\n this.setCounterValue(initialValue);\n }\n else {\n this.setCounterBytes(initialValue);\n }\n }\n get counter() { return new Uint8Array(__classPrivateFieldGet(this, _CTR_counter, \"f\")); }\n setCounterValue(value) {\n if (!Number.isInteger(value) || value < 0 || value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError(\"invalid counter initial integer value\");\n }\n for (let index = 15; index >= 0; --index) {\n __classPrivateFieldGet(this, _CTR_counter, \"f\")[index] = value % 256;\n value = Math.floor(value / 256);\n }\n }\n setCounterBytes(value) {\n if (value.length !== 16) {\n throw new TypeError(\"invalid counter initial Uint8Array value length\");\n }\n __classPrivateFieldGet(this, _CTR_counter, \"f\").set(value);\n }\n increment() {\n for (let i = 15; i >= 0; i--) {\n if (__classPrivateFieldGet(this, _CTR_counter, \"f\")[i] === 255) {\n __classPrivateFieldGet(this, _CTR_counter, \"f\")[i] = 0;\n }\n else {\n __classPrivateFieldGet(this, _CTR_counter, \"f\")[i]++;\n break;\n }\n }\n }\n encrypt(plaintext) {\n var _a, _b;\n const crypttext = new Uint8Array(plaintext);\n for (let i = 0; i < crypttext.length; i++) {\n if (__classPrivateFieldGet(this, _CTR_remainingIndex, \"f\") === 16) {\n __classPrivateFieldSet(this, _CTR_remaining, this.aes.encrypt(__classPrivateFieldGet(this, _CTR_counter, \"f\")), \"f\");\n __classPrivateFieldSet(this, _CTR_remainingIndex, 0, \"f\");\n this.increment();\n }\n crypttext[i] ^= __classPrivateFieldGet(this, _CTR_remaining, \"f\")[__classPrivateFieldSet(this, _CTR_remainingIndex, (_b = __classPrivateFieldGet(this, _CTR_remainingIndex, \"f\"), _a = _b++, _b), \"f\"), _a];\n }\n return crypttext;\n }\n decrypt(ciphertext) {\n return this.encrypt(ciphertext);\n }\n}\n_CTR_remaining = new WeakMap(), _CTR_remainingIndex = new WeakMap(), _CTR_counter = new WeakMap();\n//# sourceMappingURL=mode-ctr.js.map","export function pkcs7Pad(data) {\n const padder = 16 - (data.length % 16);\n const result = new Uint8Array(data.length + padder);\n result.set(data);\n for (let i = data.length; i < result.length; i++) {\n result[i] = padder;\n }\n return result;\n}\nexport function pkcs7Strip(data) {\n if (data.length < 16) {\n throw new TypeError('PKCS#7 invalid length');\n }\n const padder = data[data.length - 1];\n if (padder > 16) {\n throw new TypeError('PKCS#7 padding byte out of range');\n }\n const length = data.length - padder;\n for (let i = 0; i < padder; i++) {\n if (data[length + i] !== padder) {\n throw new TypeError('PKCS#7 invalid padding byte');\n }\n }\n return new Uint8Array(data.subarray(0, length));\n}\n//# sourceMappingURL=padding.js.map","/**\n * @_ignore\n */\nimport { getBytesCopy, assertArgument, toUtf8Bytes } from \"../utils/index.js\";\nexport function looseArrayify(hexString) {\n if (typeof (hexString) === \"string\" && !hexString.startsWith(\"0x\")) {\n hexString = \"0x\" + hexString;\n }\n return getBytesCopy(hexString);\n}\nexport function zpad(value, length) {\n value = String(value);\n while (value.length < length) {\n value = '0' + value;\n }\n return value;\n}\nexport function getPassword(password) {\n if (typeof (password) === 'string') {\n return toUtf8Bytes(password, \"NFKC\");\n }\n return getBytesCopy(password);\n}\nexport function spelunk(object, _path) {\n const match = _path.match(/^([a-z0-9$_.-]*)(:([a-z]+))?(!)?$/i);\n assertArgument(match != null, \"invalid path\", \"path\", _path);\n const path = match[1];\n const type = match[3];\n const reqd = (match[4] === \"!\");\n let cur = object;\n for (const comp of path.toLowerCase().split('.')) {\n // Search for a child object with a case-insensitive matching key\n if (Array.isArray(cur)) {\n if (!comp.match(/^[0-9]+$/)) {\n break;\n }\n cur = cur[parseInt(comp)];\n }\n else if (typeof (cur) === \"object\") {\n let found = null;\n for (const key in cur) {\n if (key.toLowerCase() === comp) {\n found = cur[key];\n break;\n }\n }\n cur = found;\n }\n else {\n cur = null;\n }\n if (cur == null) {\n break;\n }\n }\n assertArgument(!reqd || cur != null, \"missing required value\", \"path\", path);\n if (type && cur != null) {\n if (type === \"int\") {\n if (typeof (cur) === \"string\" && cur.match(/^-?[0-9]+$/)) {\n return parseInt(cur);\n }\n else if (Number.isSafeInteger(cur)) {\n return cur;\n }\n }\n if (type === \"number\") {\n if (typeof (cur) === \"string\" && cur.match(/^-?[0-9.]*$/)) {\n return parseFloat(cur);\n }\n }\n if (type === \"data\") {\n if (typeof (cur) === \"string\") {\n return looseArrayify(cur);\n }\n }\n if (type === \"array\" && Array.isArray(cur)) {\n return cur;\n }\n if (type === typeof (cur)) {\n return cur;\n }\n assertArgument(false, `wrong type found for ${type} `, \"path\", path);\n }\n return cur;\n}\n/*\nexport function follow(object: any, path: string): null | string {\n let currentChild = object;\n\n for (const comp of path.toLowerCase().split('/')) {\n\n // Search for a child object with a case-insensitive matching key\n let matchingChild = null;\n for (const key in currentChild) {\n if (key.toLowerCase() === comp) {\n matchingChild = currentChild[key];\n break;\n }\n }\n\n if (matchingChild === null) { return null; }\n\n currentChild = matchingChild;\n }\n\n return currentChild;\n}\n\n// \"path/to/something:type!\"\nexport function followRequired(data: any, path: string): string {\n const value = follow(data, path);\n if (value != null) { return value; }\n return logger.throwArgumentError(\"invalid value\", `data:${ path }`,\n JSON.stringify(data));\n}\n*/\n// See: https://www.ietf.org/rfc/rfc4122.txt (Section 4.4)\n/*\nexport function uuidV4(randomBytes: BytesLike): string {\n const bytes = getBytes(randomBytes, \"randomBytes\");\n\n // Section: 4.1.3:\n // - time_hi_and_version[12:16] = 0b0100\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n\n // Section 4.4\n // - clock_seq_hi_and_reserved[6] = 0b0\n // - clock_seq_hi_and_reserved[7] = 0b1\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const value = hexlify(bytes);\n\n return [\n value.substring(2, 10),\n value.substring(10, 14),\n value.substring(14, 18),\n value.substring(18, 22),\n value.substring(22, 34),\n ].join(\"-\");\n}\n*/\n//# sourceMappingURL=utils.js.map","/**\n * The JSON Wallet formats allow a simple way to store the private\n * keys needed in Ethereum along with related information and allows\n * for extensible forms of encryption.\n *\n * These utilities facilitate decrypting and encrypting the most common\n * JSON Wallet formats.\n *\n * @_subsection: api/wallet:JSON Wallets [json-wallets]\n */\nimport { CTR } from \"aes-js\";\nimport { getAddress } from \"../address/index.js\";\nimport { keccak256, pbkdf2, randomBytes, scrypt, scryptSync } from \"../crypto/index.js\";\nimport { computeAddress } from \"../transaction/index.js\";\nimport { concat, getBytes, hexlify, uuidV4, assert, assertArgument } from \"../utils/index.js\";\nimport { getPassword, spelunk, zpad } from \"./utils.js\";\nimport { version } from \"../_version.js\";\nconst defaultPath = \"m/44'/60'/0'/0/0\";\n/**\n * Returns true if %%json%% is a valid JSON Keystore Wallet.\n */\nexport function isKeystoreJson(json) {\n try {\n const data = JSON.parse(json);\n const version = ((data.version != null) ? parseInt(data.version) : 0);\n if (version === 3) {\n return true;\n }\n }\n catch (error) { }\n return false;\n}\nfunction decrypt(data, key, ciphertext) {\n const cipher = spelunk(data, \"crypto.cipher:string\");\n if (cipher === \"aes-128-ctr\") {\n const iv = spelunk(data, \"crypto.cipherparams.iv:data!\");\n const aesCtr = new CTR(key, iv);\n return hexlify(aesCtr.decrypt(ciphertext));\n }\n assert(false, \"unsupported cipher\", \"UNSUPPORTED_OPERATION\", {\n operation: \"decrypt\"\n });\n}\nfunction getAccount(data, _key) {\n const key = getBytes(_key);\n const ciphertext = spelunk(data, \"crypto.ciphertext:data!\");\n const computedMAC = hexlify(keccak256(concat([key.slice(16, 32), ciphertext]))).substring(2);\n assertArgument(computedMAC === spelunk(data, \"crypto.mac:string!\").toLowerCase(), \"incorrect password\", \"password\", \"[ REDACTED ]\");\n const privateKey = decrypt(data, key.slice(0, 16), ciphertext);\n const address = computeAddress(privateKey);\n if (data.address) {\n let check = data.address.toLowerCase();\n if (!check.startsWith(\"0x\")) {\n check = \"0x\" + check;\n }\n assertArgument(getAddress(check) === address, \"keystore address/privateKey mismatch\", \"address\", data.address);\n }\n const account = { address, privateKey };\n // Version 0.1 x-ethers metadata must contain an encrypted mnemonic phrase\n const version = spelunk(data, \"x-ethers.version:string\");\n if (version === \"0.1\") {\n const mnemonicKey = key.slice(32, 64);\n const mnemonicCiphertext = spelunk(data, \"x-ethers.mnemonicCiphertext:data!\");\n const mnemonicIv = spelunk(data, \"x-ethers.mnemonicCounter:data!\");\n const mnemonicAesCtr = new CTR(mnemonicKey, mnemonicIv);\n account.mnemonic = {\n path: (spelunk(data, \"x-ethers.path:string\") || defaultPath),\n locale: (spelunk(data, \"x-ethers.locale:string\") || \"en\"),\n entropy: hexlify(getBytes(mnemonicAesCtr.decrypt(mnemonicCiphertext)))\n };\n }\n return account;\n}\nfunction getDecryptKdfParams(data) {\n const kdf = spelunk(data, \"crypto.kdf:string\");\n if (kdf && typeof (kdf) === \"string\") {\n if (kdf.toLowerCase() === \"scrypt\") {\n const salt = spelunk(data, \"crypto.kdfparams.salt:data!\");\n const N = spelunk(data, \"crypto.kdfparams.n:int!\");\n const r = spelunk(data, \"crypto.kdfparams.r:int!\");\n const p = spelunk(data, \"crypto.kdfparams.p:int!\");\n // Make sure N is a power of 2\n assertArgument(N > 0 && (N & (N - 1)) === 0, \"invalid kdf.N\", \"kdf.N\", N);\n assertArgument(r > 0 && p > 0, \"invalid kdf\", \"kdf\", kdf);\n const dkLen = spelunk(data, \"crypto.kdfparams.dklen:int!\");\n assertArgument(dkLen === 32, \"invalid kdf.dklen\", \"kdf.dflen\", dkLen);\n return { name: \"scrypt\", salt, N, r, p, dkLen: 64 };\n }\n else if (kdf.toLowerCase() === \"pbkdf2\") {\n const salt = spelunk(data, \"crypto.kdfparams.salt:data!\");\n const prf = spelunk(data, \"crypto.kdfparams.prf:string!\");\n const algorithm = prf.split(\"-\").pop();\n assertArgument(algorithm === \"sha256\" || algorithm === \"sha512\", \"invalid kdf.pdf\", \"kdf.pdf\", prf);\n const count = spelunk(data, \"crypto.kdfparams.c:int!\");\n const dkLen = spelunk(data, \"crypto.kdfparams.dklen:int!\");\n assertArgument(dkLen === 32, \"invalid kdf.dklen\", \"kdf.dklen\", dkLen);\n return { name: \"pbkdf2\", salt, count, dkLen, algorithm };\n }\n }\n assertArgument(false, \"unsupported key-derivation function\", \"kdf\", kdf);\n}\n/**\n * Returns the account details for the JSON Keystore Wallet %%json%%\n * using %%password%%.\n *\n * It is preferred to use the [async version](decryptKeystoreJson)\n * instead, which allows a [[ProgressCallback]] to keep the user informed\n * as to the decryption status.\n *\n * This method will block the event loop (freezing all UI) until decryption\n * is complete, which can take quite some time, depending on the wallet\n * paramters and platform.\n */\nexport function decryptKeystoreJsonSync(json, _password) {\n const data = JSON.parse(json);\n const password = getPassword(_password);\n const params = getDecryptKdfParams(data);\n if (params.name === \"pbkdf2\") {\n const { salt, count, dkLen, algorithm } = params;\n const key = pbkdf2(password, salt, count, dkLen, algorithm);\n return getAccount(data, key);\n }\n assert(params.name === \"scrypt\", \"cannot be reached\", \"UNKNOWN_ERROR\", { params });\n const { salt, N, r, p, dkLen } = params;\n const key = scryptSync(password, salt, N, r, p, dkLen);\n return getAccount(data, key);\n}\nfunction stall(duration) {\n return new Promise((resolve) => { setTimeout(() => { resolve(); }, duration); });\n}\n/**\n * Resolves to the decrypted JSON Keystore Wallet %%json%% using the\n * %%password%%.\n *\n * If provided, %%progress%% will be called periodically during the\n * decrpytion to provide feedback, and if the function returns\n * ``false`` will halt decryption.\n *\n * The %%progressCallback%% will **always** receive ``0`` before\n * decryption begins and ``1`` when complete.\n */\nexport async function decryptKeystoreJson(json, _password, progress) {\n const data = JSON.parse(json);\n const password = getPassword(_password);\n const params = getDecryptKdfParams(data);\n if (params.name === \"pbkdf2\") {\n if (progress) {\n progress(0);\n await stall(0);\n }\n const { salt, count, dkLen, algorithm } = params;\n const key = pbkdf2(password, salt, count, dkLen, algorithm);\n if (progress) {\n progress(1);\n await stall(0);\n }\n return getAccount(data, key);\n }\n assert(params.name === \"scrypt\", \"cannot be reached\", \"UNKNOWN_ERROR\", { params });\n const { salt, N, r, p, dkLen } = params;\n const key = await scrypt(password, salt, N, r, p, dkLen, progress);\n return getAccount(data, key);\n}\nfunction getEncryptKdfParams(options) {\n // Check/generate the salt\n const salt = (options.salt != null) ? getBytes(options.salt, \"options.salt\") : randomBytes(32);\n // Override the scrypt password-based key derivation function parameters\n let N = (1 << 17), r = 8, p = 1;\n if (options.scrypt) {\n if (options.scrypt.N) {\n N = options.scrypt.N;\n }\n if (options.scrypt.r) {\n r = options.scrypt.r;\n }\n if (options.scrypt.p) {\n p = options.scrypt.p;\n }\n }\n assertArgument(typeof (N) === \"number\" && N > 0 && Number.isSafeInteger(N) && (BigInt(N) & BigInt(N - 1)) === BigInt(0), \"invalid scrypt N parameter\", \"options.N\", N);\n assertArgument(typeof (r) === \"number\" && r > 0 && Number.isSafeInteger(r), \"invalid scrypt r parameter\", \"options.r\", r);\n assertArgument(typeof (p) === \"number\" && p > 0 && Number.isSafeInteger(p), \"invalid scrypt p parameter\", \"options.p\", p);\n return { name: \"scrypt\", dkLen: 32, salt, N, r, p };\n}\nfunction _encryptKeystore(key, kdf, account, options) {\n const privateKey = getBytes(account.privateKey, \"privateKey\");\n // Override initialization vector\n const iv = (options.iv != null) ? getBytes(options.iv, \"options.iv\") : randomBytes(16);\n assertArgument(iv.length === 16, \"invalid options.iv length\", \"options.iv\", options.iv);\n // Override the uuid\n const uuidRandom = (options.uuid != null) ? getBytes(options.uuid, \"options.uuid\") : randomBytes(16);\n assertArgument(uuidRandom.length === 16, \"invalid options.uuid length\", \"options.uuid\", options.iv);\n // This will be used to encrypt the wallet (as per Web3 secret storage)\n // - 32 bytes As normal for the Web3 secret storage (derivedKey, macPrefix)\n // - 32 bytes AES key to encrypt mnemonic with (required here to be Ethers Wallet)\n const derivedKey = key.slice(0, 16);\n const macPrefix = key.slice(16, 32);\n // Encrypt the private key\n const aesCtr = new CTR(derivedKey, iv);\n const ciphertext = getBytes(aesCtr.encrypt(privateKey));\n // Compute the message authentication code, used to check the password\n const mac = keccak256(concat([macPrefix, ciphertext]));\n // See: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition\n const data = {\n address: account.address.substring(2).toLowerCase(),\n id: uuidV4(uuidRandom),\n version: 3,\n Crypto: {\n cipher: \"aes-128-ctr\",\n cipherparams: {\n iv: hexlify(iv).substring(2),\n },\n ciphertext: hexlify(ciphertext).substring(2),\n kdf: \"scrypt\",\n kdfparams: {\n salt: hexlify(kdf.salt).substring(2),\n n: kdf.N,\n dklen: 32,\n p: kdf.p,\n r: kdf.r\n },\n mac: mac.substring(2)\n }\n };\n // If we have a mnemonic, encrypt it into the JSON wallet\n if (account.mnemonic) {\n const client = (options.client != null) ? options.client : `ethers/${version}`;\n const path = account.mnemonic.path || defaultPath;\n const locale = account.mnemonic.locale || \"en\";\n const mnemonicKey = key.slice(32, 64);\n const entropy = getBytes(account.mnemonic.entropy, \"account.mnemonic.entropy\");\n const mnemonicIv = randomBytes(16);\n const mnemonicAesCtr = new CTR(mnemonicKey, mnemonicIv);\n const mnemonicCiphertext = getBytes(mnemonicAesCtr.encrypt(entropy));\n const now = new Date();\n const timestamp = (now.getUTCFullYear() + \"-\" +\n zpad(now.getUTCMonth() + 1, 2) + \"-\" +\n zpad(now.getUTCDate(), 2) + \"T\" +\n zpad(now.getUTCHours(), 2) + \"-\" +\n zpad(now.getUTCMinutes(), 2) + \"-\" +\n zpad(now.getUTCSeconds(), 2) + \".0Z\");\n const gethFilename = (\"UTC--\" + timestamp + \"--\" + data.address);\n data[\"x-ethers\"] = {\n client, gethFilename, path, locale,\n mnemonicCounter: hexlify(mnemonicIv).substring(2),\n mnemonicCiphertext: hexlify(mnemonicCiphertext).substring(2),\n version: \"0.1\"\n };\n }\n return JSON.stringify(data);\n}\n/**\n * Return the JSON Keystore Wallet for %%account%% encrypted with\n * %%password%%.\n *\n * The %%options%% can be used to tune the password-based key\n * derivation function parameters, explicitly set the random values\n * used. Any provided [[ProgressCallback]] is ignord.\n */\nexport function encryptKeystoreJsonSync(account, password, options) {\n if (options == null) {\n options = {};\n }\n const passwordBytes = getPassword(password);\n const kdf = getEncryptKdfParams(options);\n const key = scryptSync(passwordBytes, kdf.salt, kdf.N, kdf.r, kdf.p, 64);\n return _encryptKeystore(getBytes(key), kdf, account, options);\n}\n/**\n * Resolved to the JSON Keystore Wallet for %%account%% encrypted\n * with %%password%%.\n *\n * The %%options%% can be used to tune the password-based key\n * derivation function parameters, explicitly set the random values\n * used and provide a [[ProgressCallback]] to receive periodic updates\n * on the completion status..\n */\nexport async function encryptKeystoreJson(account, password, options) {\n if (options == null) {\n options = {};\n }\n const passwordBytes = getPassword(password);\n const kdf = getEncryptKdfParams(options);\n const key = await scrypt(passwordBytes, kdf.salt, kdf.N, kdf.r, kdf.p, 64, options.progressCallback);\n return _encryptKeystore(getBytes(key), kdf, account, options);\n}\n//# sourceMappingURL=json-keystore.js.map","/**\n * Explain HD Wallets..\n *\n * @_subsection: api/wallet:HD Wallets [hd-wallets]\n */\nimport { computeHmac, randomBytes, ripemd160, SigningKey, sha256 } from \"../crypto/index.js\";\nimport { VoidSigner } from \"../providers/index.js\";\nimport { computeAddress } from \"../transaction/index.js\";\nimport { concat, dataSlice, decodeBase58, defineProperties, encodeBase58, getBytes, hexlify, isBytesLike, getNumber, toBeArray, toBigInt, toBeHex, assertPrivate, assert, assertArgument } from \"../utils/index.js\";\nimport { LangEn } from \"../wordlists/lang-en.js\";\nimport { BaseWallet } from \"./base-wallet.js\";\nimport { Mnemonic } from \"./mnemonic.js\";\nimport { encryptKeystoreJson, encryptKeystoreJsonSync, } from \"./json-keystore.js\";\n/**\n * The default derivation path for Ethereum HD Nodes. (i.e. ``\"m/44'/60'/0'/0/0\"``)\n */\nexport const defaultPath = \"m/44'/60'/0'/0/0\";\n// \"Bitcoin seed\"\nconst MasterSecret = new Uint8Array([66, 105, 116, 99, 111, 105, 110, 32, 115, 101, 101, 100]);\nconst HardenedBit = 0x80000000;\nconst N = BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\nconst Nibbles = \"0123456789abcdef\";\nfunction zpad(value, length) {\n let result = \"\";\n while (value) {\n result = Nibbles[value % 16] + result;\n value = Math.trunc(value / 16);\n }\n while (result.length < length * 2) {\n result = \"0\" + result;\n }\n return \"0x\" + result;\n}\nfunction encodeBase58Check(_value) {\n const value = getBytes(_value);\n const check = dataSlice(sha256(sha256(value)), 0, 4);\n const bytes = concat([value, check]);\n return encodeBase58(bytes);\n}\nconst _guard = {};\nfunction ser_I(index, chainCode, publicKey, privateKey) {\n const data = new Uint8Array(37);\n if (index & HardenedBit) {\n assert(privateKey != null, \"cannot derive child of neutered node\", \"UNSUPPORTED_OPERATION\", {\n operation: \"deriveChild\"\n });\n // Data = 0x00 || ser_256(k_par)\n data.set(getBytes(privateKey), 1);\n }\n else {\n // Data = ser_p(point(k_par))\n data.set(getBytes(publicKey));\n }\n // Data += ser_32(i)\n for (let i = 24; i >= 0; i -= 8) {\n data[33 + (i >> 3)] = ((index >> (24 - i)) & 0xff);\n }\n const I = getBytes(computeHmac(\"sha512\", chainCode, data));\n return { IL: I.slice(0, 32), IR: I.slice(32) };\n}\nfunction derivePath(node, path) {\n const components = path.split(\"/\");\n assertArgument(components.length > 0, \"invalid path\", \"path\", path);\n if (components[0] === \"m\") {\n assertArgument(node.depth === 0, `cannot derive root path (i.e. path starting with \"m/\") for a node at non-zero depth ${node.depth}`, \"path\", path);\n components.shift();\n }\n let result = node;\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n if (component.match(/^[0-9]+'$/)) {\n const index = parseInt(component.substring(0, component.length - 1));\n assertArgument(index < HardenedBit, \"invalid path index\", `path[${i}]`, component);\n result = result.deriveChild(HardenedBit + index);\n }\n else if (component.match(/^[0-9]+$/)) {\n const index = parseInt(component);\n assertArgument(index < HardenedBit, \"invalid path index\", `path[${i}]`, component);\n result = result.deriveChild(index);\n }\n else {\n assertArgument(false, \"invalid path component\", `path[${i}]`, component);\n }\n }\n return result;\n}\n/**\n * An **HDNodeWallet** is a [[Signer]] backed by the private key derived\n * from an HD Node using the [[link-bip-32]] stantard.\n *\n * An HD Node forms a hierarchal structure with each HD Node having a\n * private key and the ability to derive child HD Nodes, defined by\n * a path indicating the index of each child.\n */\nexport class HDNodeWallet extends BaseWallet {\n /**\n * The compressed public key.\n */\n publicKey;\n /**\n * The fingerprint.\n *\n * A fingerprint allows quick qay to detect parent and child nodes,\n * but developers should be prepared to deal with collisions as it\n * is only 4 bytes.\n */\n fingerprint;\n /**\n * The parent fingerprint.\n */\n parentFingerprint;\n /**\n * The mnemonic used to create this HD Node, if available.\n *\n * Sources such as extended keys do not encode the mnemonic, in\n * which case this will be ``null``.\n */\n mnemonic;\n /**\n * The chaincode, which is effectively a public key used\n * to derive children.\n */\n chainCode;\n /**\n * The derivation path of this wallet.\n *\n * Since extended keys do not provide full path details, this\n * may be ``null``, if instantiated from a source that does not\n * encode it.\n */\n path;\n /**\n * The child index of this wallet. Values over ``2 *\\* 31`` indicate\n * the node is hardened.\n */\n index;\n /**\n * The depth of this wallet, which is the number of components\n * in its path.\n */\n depth;\n /**\n * @private\n */\n constructor(guard, signingKey, parentFingerprint, chainCode, path, index, depth, mnemonic, provider) {\n super(signingKey, provider);\n assertPrivate(guard, _guard, \"HDNodeWallet\");\n defineProperties(this, { publicKey: signingKey.compressedPublicKey });\n const fingerprint = dataSlice(ripemd160(sha256(this.publicKey)), 0, 4);\n defineProperties(this, {\n parentFingerprint, fingerprint,\n chainCode, path, index, depth\n });\n defineProperties(this, { mnemonic });\n }\n connect(provider) {\n return new HDNodeWallet(_guard, this.signingKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, this.mnemonic, provider);\n }\n #account() {\n const account = { address: this.address, privateKey: this.privateKey };\n const m = this.mnemonic;\n if (this.path && m && m.wordlist.locale === \"en\" && m.password === \"\") {\n account.mnemonic = {\n path: this.path,\n locale: \"en\",\n entropy: m.entropy\n };\n }\n return account;\n }\n /**\n * Resolves to a [JSON Keystore Wallet](json-wallets) encrypted with\n * %%password%%.\n *\n * If %%progressCallback%% is specified, it will receive periodic\n * updates as the encryption process progreses.\n */\n async encrypt(password, progressCallback) {\n return await encryptKeystoreJson(this.#account(), password, { progressCallback });\n }\n /**\n * Returns a [JSON Keystore Wallet](json-wallets) encryped with\n * %%password%%.\n *\n * It is preferred to use the [async version](encrypt) instead,\n * which allows a [[ProgressCallback]] to keep the user informed.\n *\n * This method will block the event loop (freezing all UI) until\n * it is complete, which may be a non-trivial duration.\n */\n encryptSync(password) {\n return encryptKeystoreJsonSync(this.#account(), password);\n }\n /**\n * The extended key.\n *\n * This key will begin with the prefix ``xpriv`` and can be used to\n * reconstruct this HD Node to derive its children.\n */\n get extendedKey() {\n // We only support the mainnet values for now, but if anyone needs\n // testnet values, let me know. I believe current sentiment is that\n // we should always use mainnet, and use BIP-44 to derive the network\n // - Mainnet: public=0x0488B21E, private=0x0488ADE4\n // - Testnet: public=0x043587CF, private=0x04358394\n assert(this.depth < 256, \"Depth too deep\", \"UNSUPPORTED_OPERATION\", { operation: \"extendedKey\" });\n return encodeBase58Check(concat([\n \"0x0488ADE4\", zpad(this.depth, 1), this.parentFingerprint,\n zpad(this.index, 4), this.chainCode,\n concat([\"0x00\", this.privateKey])\n ]));\n }\n /**\n * Returns true if this wallet has a path, providing a Type Guard\n * that the path is non-null.\n */\n hasPath() { return (this.path != null); }\n /**\n * Returns a neutered HD Node, which removes the private details\n * of an HD Node.\n *\n * A neutered node has no private key, but can be used to derive\n * child addresses and other public data about the HD Node.\n */\n neuter() {\n return new HDNodeVoidWallet(_guard, this.address, this.publicKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, this.provider);\n }\n /**\n * Return the child for %%index%%.\n */\n deriveChild(_index) {\n const index = getNumber(_index, \"index\");\n assertArgument(index <= 0xffffffff, \"invalid index\", \"index\", index);\n // Base path\n let path = this.path;\n if (path) {\n path += \"/\" + (index & ~HardenedBit);\n if (index & HardenedBit) {\n path += \"'\";\n }\n }\n const { IR, IL } = ser_I(index, this.chainCode, this.publicKey, this.privateKey);\n const ki = new SigningKey(toBeHex((toBigInt(IL) + BigInt(this.privateKey)) % N, 32));\n return new HDNodeWallet(_guard, ki, this.fingerprint, hexlify(IR), path, index, this.depth + 1, this.mnemonic, this.provider);\n }\n /**\n * Return the HDNode for %%path%% from this node.\n */\n derivePath(path) {\n return derivePath(this, path);\n }\n static #fromSeed(_seed, mnemonic) {\n assertArgument(isBytesLike(_seed), \"invalid seed\", \"seed\", \"[REDACTED]\");\n const seed = getBytes(_seed, \"seed\");\n assertArgument(seed.length >= 16 && seed.length <= 64, \"invalid seed\", \"seed\", \"[REDACTED]\");\n const I = getBytes(computeHmac(\"sha512\", MasterSecret, seed));\n const signingKey = new SigningKey(hexlify(I.slice(0, 32)));\n return new HDNodeWallet(_guard, signingKey, \"0x00000000\", hexlify(I.slice(32)), \"m\", 0, 0, mnemonic, null);\n }\n /**\n * Creates a new HD Node from %%extendedKey%%.\n *\n * If the %%extendedKey%% will either have a prefix or ``xpub`` or\n * ``xpriv``, returning a neutered HD Node ([[HDNodeVoidWallet]])\n * or full HD Node ([[HDNodeWallet) respectively.\n */\n static fromExtendedKey(extendedKey) {\n const bytes = toBeArray(decodeBase58(extendedKey)); // @TODO: redact\n assertArgument(bytes.length === 82 || encodeBase58Check(bytes.slice(0, 78)) === extendedKey, \"invalid extended key\", \"extendedKey\", \"[ REDACTED ]\");\n const depth = bytes[4];\n const parentFingerprint = hexlify(bytes.slice(5, 9));\n const index = parseInt(hexlify(bytes.slice(9, 13)).substring(2), 16);\n const chainCode = hexlify(bytes.slice(13, 45));\n const key = bytes.slice(45, 78);\n switch (hexlify(bytes.slice(0, 4))) {\n // Public Key\n case \"0x0488b21e\":\n case \"0x043587cf\": {\n const publicKey = hexlify(key);\n return new HDNodeVoidWallet(_guard, computeAddress(publicKey), publicKey, parentFingerprint, chainCode, null, index, depth, null);\n }\n // Private Key\n case \"0x0488ade4\":\n case \"0x04358394 \":\n if (key[0] !== 0) {\n break;\n }\n return new HDNodeWallet(_guard, new SigningKey(key.slice(1)), parentFingerprint, chainCode, null, index, depth, null, null);\n }\n assertArgument(false, \"invalid extended key prefix\", \"extendedKey\", \"[ REDACTED ]\");\n }\n /**\n * Creates a new random HDNode.\n */\n static createRandom(password, path, wordlist) {\n if (password == null) {\n password = \"\";\n }\n if (path == null) {\n path = defaultPath;\n }\n if (wordlist == null) {\n wordlist = LangEn.wordlist();\n }\n const mnemonic = Mnemonic.fromEntropy(randomBytes(16), password, wordlist);\n return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path);\n }\n /**\n * Create an HD Node from %%mnemonic%%.\n */\n static fromMnemonic(mnemonic, path) {\n if (!path) {\n path = defaultPath;\n }\n return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path);\n }\n /**\n * Creates an HD Node from a mnemonic %%phrase%%.\n */\n static fromPhrase(phrase, password, path, wordlist) {\n if (password == null) {\n password = \"\";\n }\n if (path == null) {\n path = defaultPath;\n }\n if (wordlist == null) {\n wordlist = LangEn.wordlist();\n }\n const mnemonic = Mnemonic.fromPhrase(phrase, password, wordlist);\n return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path);\n }\n /**\n * Creates an HD Node from a %%seed%%.\n */\n static fromSeed(seed) {\n return HDNodeWallet.#fromSeed(seed, null);\n }\n}\n/**\n * A **HDNodeVoidWallet** cannot sign, but provides access to\n * the children nodes of a [[link-bip-32]] HD wallet addresses.\n *\n * The can be created by using an extended ``xpub`` key to\n * [[HDNodeWallet_fromExtendedKey]] or by\n * [nuetering](HDNodeWallet-neuter) a [[HDNodeWallet]].\n */\nexport class HDNodeVoidWallet extends VoidSigner {\n /**\n * The compressed public key.\n */\n publicKey;\n /**\n * The fingerprint.\n *\n * A fingerprint allows quick qay to detect parent and child nodes,\n * but developers should be prepared to deal with collisions as it\n * is only 4 bytes.\n */\n fingerprint;\n /**\n * The parent node fingerprint.\n */\n parentFingerprint;\n /**\n * The chaincode, which is effectively a public key used\n * to derive children.\n */\n chainCode;\n /**\n * The derivation path of this wallet.\n *\n * Since extended keys do not provider full path details, this\n * may be ``null``, if instantiated from a source that does not\n * enocde it.\n */\n path;\n /**\n * The child index of this wallet. Values over ``2 *\\* 31`` indicate\n * the node is hardened.\n */\n index;\n /**\n * The depth of this wallet, which is the number of components\n * in its path.\n */\n depth;\n /**\n * @private\n */\n constructor(guard, address, publicKey, parentFingerprint, chainCode, path, index, depth, provider) {\n super(address, provider);\n assertPrivate(guard, _guard, \"HDNodeVoidWallet\");\n defineProperties(this, { publicKey });\n const fingerprint = dataSlice(ripemd160(sha256(publicKey)), 0, 4);\n defineProperties(this, {\n publicKey, fingerprint, parentFingerprint, chainCode, path, index, depth\n });\n }\n connect(provider) {\n return new HDNodeVoidWallet(_guard, this.address, this.publicKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, provider);\n }\n /**\n * The extended key.\n *\n * This key will begin with the prefix ``xpub`` and can be used to\n * reconstruct this neutered key to derive its children addresses.\n */\n get extendedKey() {\n // We only support the mainnet values for now, but if anyone needs\n // testnet values, let me know. I believe current sentiment is that\n // we should always use mainnet, and use BIP-44 to derive the network\n // - Mainnet: public=0x0488B21E, private=0x0488ADE4\n // - Testnet: public=0x043587CF, private=0x04358394\n assert(this.depth < 256, \"Depth too deep\", \"UNSUPPORTED_OPERATION\", { operation: \"extendedKey\" });\n return encodeBase58Check(concat([\n \"0x0488B21E\",\n zpad(this.depth, 1),\n this.parentFingerprint,\n zpad(this.index, 4),\n this.chainCode,\n this.publicKey,\n ]));\n }\n /**\n * Returns true if this wallet has a path, providing a Type Guard\n * that the path is non-null.\n */\n hasPath() { return (this.path != null); }\n /**\n * Return the child for %%index%%.\n */\n deriveChild(_index) {\n const index = getNumber(_index, \"index\");\n assertArgument(index <= 0xffffffff, \"invalid index\", \"index\", index);\n // Base path\n let path = this.path;\n if (path) {\n path += \"/\" + (index & ~HardenedBit);\n if (index & HardenedBit) {\n path += \"'\";\n }\n }\n const { IR, IL } = ser_I(index, this.chainCode, this.publicKey, null);\n const Ki = SigningKey.addPoints(IL, this.publicKey, true);\n const address = computeAddress(Ki);\n return new HDNodeVoidWallet(_guard, address, Ki, this.fingerprint, hexlify(IR), path, index, this.depth + 1, this.provider);\n }\n /**\n * Return the signer for %%path%% from this node.\n */\n derivePath(path) {\n return derivePath(this, path);\n }\n}\n/*\nexport class HDNodeWalletManager {\n #root: HDNodeWallet;\n\n constructor(phrase: string, password?: null | string, path?: null | string, locale?: null | Wordlist) {\n if (password == null) { password = \"\"; }\n if (path == null) { path = \"m/44'/60'/0'/0\"; }\n if (locale == null) { locale = LangEn.wordlist(); }\n this.#root = HDNodeWallet.fromPhrase(phrase, password, path, locale);\n }\n\n getSigner(index?: number): HDNodeWallet {\n return this.#root.deriveChild((index == null) ? 0: index);\n }\n}\n*/\n/**\n * Returns the [[link-bip-32]] path for the account at %%index%%.\n *\n * This is the pattern used by wallets like Ledger.\n *\n * There is also an [alternate pattern](getIndexedAccountPath) used by\n * some software.\n */\nexport function getAccountPath(_index) {\n const index = getNumber(_index, \"index\");\n assertArgument(index >= 0 && index < HardenedBit, \"invalid account index\", \"index\", index);\n return `m/44'/60'/${index}'/0/0`;\n}\n/**\n * Returns the path using an alternative pattern for deriving accounts,\n * at %%index%%.\n *\n * This derivation path uses the //index// component rather than the\n * //account// component to derive sequential accounts.\n *\n * This is the pattern used by wallets like MetaMask.\n */\nexport function getIndexedAccountPath(_index) {\n const index = getNumber(_index, \"index\");\n assertArgument(index >= 0 && index < HardenedBit, \"invalid account index\", \"index\", index);\n return `m/44'/60'/0'/0/${index}`;\n}\n//# sourceMappingURL=hdwallet.js.map","/**\n * @_subsection: api/wallet:JSON Wallets [json-wallets]\n */\nimport { CBC, pkcs7Strip } from \"aes-js\";\nimport { getAddress } from \"../address/index.js\";\nimport { pbkdf2 } from \"../crypto/index.js\";\nimport { id } from \"../hash/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\nimport { getPassword, looseArrayify, spelunk } from \"./utils.js\";\n/**\n * Returns true if %%json%% is a valid JSON Crowdsale wallet.\n */\nexport function isCrowdsaleJson(json) {\n try {\n const data = JSON.parse(json);\n if (data.encseed) {\n return true;\n }\n }\n catch (error) { }\n return false;\n}\n// See: https://github.com/ethereum/pyethsaletool\n/**\n * Before Ethereum launched, it was necessary to create a wallet\n * format for backers to use, which would be used to receive ether\n * as a reward for contributing to the project.\n *\n * The [[link-crowdsale]] format is now obsolete, but it is still\n * useful to support and the additional code is fairly trivial as\n * all the primitives required are used through core portions of\n * the library.\n */\nexport function decryptCrowdsaleJson(json, _password) {\n const data = JSON.parse(json);\n const password = getPassword(_password);\n // Ethereum Address\n const address = getAddress(spelunk(data, \"ethaddr:string!\"));\n // Encrypted Seed\n const encseed = looseArrayify(spelunk(data, \"encseed:string!\"));\n assertArgument(encseed && (encseed.length % 16) === 0, \"invalid encseed\", \"json\", json);\n const key = getBytes(pbkdf2(password, password, 2000, 32, \"sha256\")).slice(0, 16);\n const iv = encseed.slice(0, 16);\n const encryptedSeed = encseed.slice(16);\n // Decrypt the seed\n const aesCbc = new CBC(key, iv);\n const seed = pkcs7Strip(getBytes(aesCbc.decrypt(encryptedSeed)));\n // This wallet format is weird... Convert the binary encoded hex to a string.\n let seedHex = \"\";\n for (let i = 0; i < seed.length; i++) {\n seedHex += String.fromCharCode(seed[i]);\n }\n return { address, privateKey: id(seedHex) };\n}\n//# sourceMappingURL=json-crowdsale.js.map","import { SigningKey } from \"../crypto/index.js\";\nimport { assertArgument } from \"../utils/index.js\";\nimport { BaseWallet } from \"./base-wallet.js\";\nimport { HDNodeWallet } from \"./hdwallet.js\";\nimport { decryptCrowdsaleJson, isCrowdsaleJson } from \"./json-crowdsale.js\";\nimport { decryptKeystoreJson, decryptKeystoreJsonSync, encryptKeystoreJson, encryptKeystoreJsonSync, isKeystoreJson } from \"./json-keystore.js\";\nimport { Mnemonic } from \"./mnemonic.js\";\nfunction stall(duration) {\n return new Promise((resolve) => { setTimeout(() => { resolve(); }, duration); });\n}\n/**\n * A **Wallet** manages a single private key which is used to sign\n * transactions, messages and other common payloads.\n *\n * This class is generally the main entry point for developers\n * that wish to use a private key directly, as it can create\n * instances from a large variety of common sources, including\n * raw private key, [[link-bip-39]] mnemonics and encrypte JSON\n * wallets.\n */\nexport class Wallet extends BaseWallet {\n /**\n * Create a new wallet for the private %%key%%, optionally connected\n * to %%provider%%.\n */\n constructor(key, provider) {\n if (typeof (key) === \"string\" && !key.startsWith(\"0x\")) {\n key = \"0x\" + key;\n }\n let signingKey = (typeof (key) === \"string\") ? new SigningKey(key) : key;\n super(signingKey, provider);\n }\n connect(provider) {\n return new Wallet(this.signingKey, provider);\n }\n /**\n * Resolves to a [JSON Keystore Wallet](json-wallets) encrypted with\n * %%password%%.\n *\n * If %%progressCallback%% is specified, it will receive periodic\n * updates as the encryption process progreses.\n */\n async encrypt(password, progressCallback) {\n const account = { address: this.address, privateKey: this.privateKey };\n return await encryptKeystoreJson(account, password, { progressCallback });\n }\n /**\n * Returns a [JSON Keystore Wallet](json-wallets) encryped with\n * %%password%%.\n *\n * It is preferred to use the [async version](encrypt) instead,\n * which allows a [[ProgressCallback]] to keep the user informed.\n *\n * This method will block the event loop (freezing all UI) until\n * it is complete, which may be a non-trivial duration.\n */\n encryptSync(password) {\n const account = { address: this.address, privateKey: this.privateKey };\n return encryptKeystoreJsonSync(account, password);\n }\n static #fromAccount(account) {\n assertArgument(account, \"invalid JSON wallet\", \"json\", \"[ REDACTED ]\");\n if (\"mnemonic\" in account && account.mnemonic && account.mnemonic.locale === \"en\") {\n const mnemonic = Mnemonic.fromEntropy(account.mnemonic.entropy);\n const wallet = HDNodeWallet.fromMnemonic(mnemonic, account.mnemonic.path);\n if (wallet.address === account.address && wallet.privateKey === account.privateKey) {\n return wallet;\n }\n console.log(\"WARNING: JSON mismatch address/privateKey != mnemonic; fallback onto private key\");\n }\n const wallet = new Wallet(account.privateKey);\n assertArgument(wallet.address === account.address, \"address/privateKey mismatch\", \"json\", \"[ REDACTED ]\");\n return wallet;\n }\n /**\n * Creates (asynchronously) a **Wallet** by decrypting the %%json%%\n * with %%password%%.\n *\n * If %%progress%% is provided, it is called periodically during\n * decryption so that any UI can be updated.\n */\n static async fromEncryptedJson(json, password, progress) {\n let account = null;\n if (isKeystoreJson(json)) {\n account = await decryptKeystoreJson(json, password, progress);\n }\n else if (isCrowdsaleJson(json)) {\n if (progress) {\n progress(0);\n await stall(0);\n }\n account = decryptCrowdsaleJson(json, password);\n if (progress) {\n progress(1);\n await stall(0);\n }\n }\n return Wallet.#fromAccount(account);\n }\n /**\n * Creates a **Wallet** by decrypting the %%json%% with %%password%%.\n *\n * The [[fromEncryptedJson]] method is preferred, as this method\n * will lock up and freeze the UI during decryption, which may take\n * some time.\n */\n static fromEncryptedJsonSync(json, password) {\n let account = null;\n if (isKeystoreJson(json)) {\n account = decryptKeystoreJsonSync(json, password);\n }\n else if (isCrowdsaleJson(json)) {\n account = decryptCrowdsaleJson(json, password);\n }\n else {\n assertArgument(false, \"invalid JSON wallet\", \"json\", \"[ REDACTED ]\");\n }\n return Wallet.#fromAccount(account);\n }\n /**\n * Creates a new random [[HDNodeWallet]] using the available\n * [cryptographic random source](randomBytes).\n *\n * If there is no crytographic random source, this will throw.\n */\n static createRandom(provider) {\n const wallet = HDNodeWallet.createRandom();\n if (provider) {\n return wallet.connect(provider);\n }\n return wallet;\n }\n /**\n * Creates a [[HDNodeWallet]] for %%phrase%%.\n */\n static fromPhrase(phrase, provider) {\n const wallet = HDNodeWallet.fromPhrase(phrase);\n if (provider) {\n return wallet.connect(provider);\n }\n return wallet;\n }\n}\n//# sourceMappingURL=wallet.js.map","const Base64 = \")!@#$%^&*(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_\";\n/**\n * @_ignore\n */\nexport function decodeBits(width, data) {\n const maxValue = (1 << width) - 1;\n const result = [];\n let accum = 0, bits = 0, flood = 0;\n for (let i = 0; i < data.length; i++) {\n // Accumulate 6 bits of data\n accum = ((accum << 6) | Base64.indexOf(data[i]));\n bits += 6;\n // While we have enough for a word...\n while (bits >= width) {\n // ...read the word\n const value = (accum >> (bits - width));\n accum &= (1 << (bits - width)) - 1;\n bits -= width;\n // A value of 0 indicates we exceeded maxValue, it\n // floods over into the next value\n if (value === 0) {\n flood += maxValue;\n }\n else {\n result.push(value + flood);\n flood = 0;\n }\n }\n }\n return result;\n}\n//# sourceMappingURL=bit-reader.js.map","import { assertArgument } from \"../utils/index.js\";\nimport { decodeBits } from \"./bit-reader.js\";\nimport { decodeOwl } from \"./decode-owl.js\";\n/**\n * @_ignore\n */\nexport function decodeOwlA(data, accents) {\n let words = decodeOwl(data).join(\",\");\n // Inject the accents\n accents.split(/,/g).forEach((accent) => {\n const match = accent.match(/^([a-z]*)([0-9]+)([0-9])(.*)$/);\n assertArgument(match !== null, \"internal error parsing accents\", \"accents\", accents);\n let posOffset = 0;\n const positions = decodeBits(parseInt(match[3]), match[4]);\n const charCode = parseInt(match[2]);\n const regex = new RegExp(`([${match[1]}])`, \"g\");\n words = words.replace(regex, (all, letter) => {\n const rem = --positions[posOffset];\n if (rem === 0) {\n letter = String.fromCharCode(letter.charCodeAt(0), charCode);\n posOffset++;\n }\n return letter;\n });\n });\n return words.split(\",\");\n}\n//# sourceMappingURL=decode-owla.js.map","import { WordlistOwl } from \"./wordlist-owl.js\";\nimport { decodeOwlA } from \"./decode-owla.js\";\n/**\n * An OWL-A format Wordlist extends the OWL format to add an\n * overlay onto an OWL format Wordlist to support diacritic\n * marks.\n *\n * This class is generally not useful to most developers as\n * it is used mainly internally to keep Wordlists for languages\n * based on latin-1 small.\n *\n * If necessary, there are tools within the ``generation/`` folder\n * to create the necessary data.\n */\nexport class WordlistOwlA extends WordlistOwl {\n #accent;\n /**\n * Creates a new Wordlist for %%locale%% using the OWLA %%data%%\n * and %%accent%% data and validated against the %%checksum%%.\n */\n constructor(locale, data, accent, checksum) {\n super(locale, data, checksum);\n this.#accent = accent;\n }\n /**\n * The OWLA-encoded accent data.\n */\n get _accent() { return this.#accent; }\n /**\n * Decode all the words for the wordlist.\n */\n _decodeWords() {\n return decodeOwlA(this._data, this._accent);\n }\n}\n//# sourceMappingURL=wordlist-owla.js.map","import { LangEn } from \"./lang-en.js\";\nexport const wordlists = {\n en: LangEn.wordlist(),\n};\n//# sourceMappingURL=wordlists-browser.js.map","/////////////////////////////\n//\nexport { version } from \"./_version.js\";\nexport { decodeBytes32String, encodeBytes32String, AbiCoder, ConstructorFragment, ErrorFragment, EventFragment, Fragment, FallbackFragment, FunctionFragment, NamedFragment, ParamType, StructFragment, checkResultErrors, ErrorDescription, Indexed, Interface, LogDescription, Result, TransactionDescription, Typed, } from \"./abi/index.js\";\nexport { getAddress, getIcapAddress, getCreateAddress, getCreate2Address, isAddressable, isAddress, resolveAddress } from \"./address/index.js\";\nexport { ZeroAddress, WeiPerEther, MaxUint256, MinInt256, MaxInt256, N, ZeroHash, EtherSymbol, MessagePrefix } from \"./constants/index.js\";\nexport { BaseContract, Contract, ContractFactory, ContractEventPayload, ContractTransactionReceipt, ContractTransactionResponse, ContractUnknownEventPayload, EventLog, UndecodedEventLog } from \"./contract/index.js\";\nexport { computeHmac, randomBytes, keccak256, ripemd160, sha256, sha512, pbkdf2, scrypt, scryptSync, lock, Signature, SigningKey } from \"./crypto/index.js\";\nexport { id, ensNormalize, isValidName, namehash, dnsEncode, hashAuthorization, verifyAuthorization, hashMessage, verifyMessage, solidityPacked, solidityPackedKeccak256, solidityPackedSha256, TypedDataEncoder, verifyTypedData } from \"./hash/index.js\";\nexport { getDefaultProvider, Block, FeeData, Log, TransactionReceipt, TransactionResponse, AbstractSigner, NonceManager, VoidSigner, AbstractProvider, FallbackProvider, JsonRpcApiProvider, JsonRpcProvider, JsonRpcSigner, BrowserProvider, AlchemyProvider, AnkrProvider, BlockscoutProvider, ChainstackProvider, CloudflareProvider, EtherscanProvider, InfuraProvider, InfuraWebSocketProvider, PocketProvider, QuickNodeProvider, IpcSocketProvider, SocketProvider, WebSocketProvider, EnsResolver, Network, EnsPlugin, EtherscanPlugin, FeeDataNetworkPlugin, FetchUrlFeeDataNetworkPlugin, GasCostPlugin, NetworkPlugin, MulticoinProviderPlugin, SocketBlockSubscriber, SocketEventSubscriber, SocketPendingSubscriber, SocketSubscriber, UnmanagedSubscriber, copyRequest, showThrottleMessage } from \"./providers/index.js\";\nexport { accessListify, authorizationify, computeAddress, recoverAddress, Transaction } from \"./transaction/index.js\";\nexport { decodeBase58, encodeBase58, decodeBase64, encodeBase64, concat, dataLength, dataSlice, getBytes, getBytesCopy, hexlify, isHexString, isBytesLike, stripZerosLeft, zeroPadBytes, zeroPadValue, defineProperties, resolveProperties, assert, assertArgument, assertArgumentCount, assertNormalize, assertPrivate, makeError, isCallException, isError, EventPayload, FetchRequest, FetchResponse, FetchCancelSignal, FixedNumber, getBigInt, getNumber, getUint, toBeArray, toBigInt, toBeHex, toNumber, toQuantity, fromTwos, toTwos, mask, formatEther, parseEther, formatUnits, parseUnits, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, decodeRlp, encodeRlp, uuidV4, } from \"./utils/index.js\";\nexport { Mnemonic, BaseWallet, HDNodeWallet, HDNodeVoidWallet, Wallet, defaultPath, getAccountPath, getIndexedAccountPath, isCrowdsaleJson, isKeystoreJson, decryptCrowdsaleJson, decryptKeystoreJsonSync, decryptKeystoreJson, encryptKeystoreJson, encryptKeystoreJsonSync, } from \"./wallet/index.js\";\nexport { Wordlist, LangEn, WordlistOwl, WordlistOwlA, wordlists } from \"./wordlists/index.js\";\n// dummy change; to pick-up ws security issue changes\n//# sourceMappingURL=ethers.js.map"],"names":["stringify","BN_0","BN_1","Nibbles","locked","getTime","_guard","Zeros","parseUnits","passProperties","getValue","crypto","u8a","utf8ToBytes","concatBytes","randomBytes","hash","assertHash","assertExists","assertBytes","assertNumber","pbkdf2","sha256","split","sha512","getGlobal","_0n","_1n","_2n","rotl","ripemd160","noble_ripemd160","crypto_random","scrypt","_nobleAsync","_nobleSync","H","_3n","ut.validateObject","ut.concatBytes","ut.bytesToHex","ut.bytesToNumberBE","mod.mod","mod.invert","ut.numberToBytesBE","ut.hexToBytes","mod.getMinHashLength","mod.mapHashToField","ut.bitMask","ut.createHmacDrbg","N","BN_2","BN_27","BN_28","BN_35","BN_MAX_UINT256","T1","_keccak256","_sha256","internal","PanicReasons","copy","isPromise","defaultOptions","stall","defaultApiKey","getHost","__classPrivateFieldGet","this","__classPrivateFieldSet","zpad","defaultPath"],"mappings":"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AAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE;IACA,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC;IACvL;IACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;IACnC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC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,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,SAAS;IACT;IACA;IACA;IACA;IACA,QAAQ,GAAG,CAAC,KAAK,EAAE;IACnB,YAAY,cAAc,CAAC,KAAK,CAAC,CAAC;IAClC,YAAY,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IACpD,YAAY,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACrD,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;IACzD,YAAY,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAC9B,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,E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A,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACzC;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IAC3C;I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A,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C;IACA;IACA;IACA,IAAI,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;IACxC;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IAC1C;IACA;IACA;IACA,IAAI,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CA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;IACnB,QAAQ,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC5C,KAAK;IACL,CAAC;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACO,MAAM,kBAAkB,CAAC;IAChC;IACA;IACA;IACA;IACA,IAAI,QAAQ,CAAC;IACb;IACA;IACA;IACA,IAAI,EAAE,CAAC;IACP;IACA;IACA;IACA,IAAI,IAAI,CAAC;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,eAAe,CAAC;IACpB;IACA;IACA;IACA,IAAI,IAAI,CAAC;IACT;IACA;IACA;IACA,IAAI,KAAK,CAAC;IACV;IACA;IACA;IACA,IAAI,SAAS,CAAC;IACd;IACA;IACA;IACA,IAAI,WAAW,CAAC;IAChB;IACA;IACA;IACA;IACA;IACA,IAAI,SAAS,CAAC;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,OAAO,CAAC;IACZ;IACA;IACA;IACA,IAAI,WAAW,CAAC;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,iBAAiB,CAAC;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,QAAQ,CAAC;IACb;IACA;IACA;IACA,IAAI,YAAY,CAAC;IACjB;IACA;IACA;IACA,IAAI,IAAI,CAAC;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,MAAM,CAAC;IACX;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,IAAI,CAAC;IACT,IAAI,KAAK,CAAC;IACV;IACA;IACA;IACA,IAAI,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE;IAC9B,QAAQ,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;IACxD,YAAY,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,SAAS,CAAC,CAAC,CAAC;IACZ,QAAQ,IAAI,QAAQ,GAAGA,M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AE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3gD,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5gD;IACA,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG;IACA,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG;IACA,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5gG,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,E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","x_google_ignoreList":[17,18,19,20,21,22,23,24,25,28,30,34,37,38,39,40,41,42,70,116,117,118,119,120]} \ No newline at end of file diff --git a/js/ethers.umd.min.js b/js/ethers.umd.min.js new file mode 100644 index 0000000000..36002edde8 --- /dev/null +++ b/js/ethers.umd.min.js @@ -0,0 +1 @@ +const __$G=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(exports):typeof define==="function"&&define.amd?define(["exports"],factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,factory(global.ethers={}))})(this,function(exports){"use strict";const version="6.15.0";function checkType(value,type,name){const types=type.split("|").map(t=>t.trim());for(let i=0;iPromise.resolve(value[k])));return results.reduce((accum,v,index)=>{accum[keys[index]]=v;return accum},{})}function defineProperties(target,values,types){for(let key in values){let value=values[key];const type=types?types[key]:null;if(type){checkType(value,type,key)}Object.defineProperty(target,key,{enumerable:true,value:value,writable:false})}}function stringify$1(value,seen){if(value==null){return"null"}if(seen==null){seen=new Set}if(typeof value==="object"){if(seen.has(value)){return"[Circular]"}seen.add(value)}if(Array.isArray(value)){return"[ "+value.map(v=>stringify$1(v,seen)).join(", ")+" ]"}if(value instanceof Uint8Array){const HEX="0123456789abcdef";let result="0x";for(let i=0;i>4];result+=HEX[value[i]&15]}return result}if(typeof value==="object"&&typeof value.toJSON==="function"){return stringify$1(value.toJSON(),seen)}switch(typeof value){case"boolean":case"number":case"symbol":return value.toString();case"bigint":return BigInt(value).toString();case"string":return JSON.stringify(value);case"object":{const keys=Object.keys(value);keys.sort();return"{ "+keys.map(k=>`${stringify$1(k,seen)}: ${stringify$1(value[k],seen)}`).join(", ")+" }"}}return`[ COULD NOT SERIALIZE ]`}function isError(error,code){return error&&error.code===code}function isCallException(error){return isError(error,"CALL_EXCEPTION")}function makeError(message,code,info){let shortMessage=message;{const details=[];if(info){if("message"in info||"code"in info||"name"in info){throw new Error(`value will overwrite populated values: ${stringify$1(info)}`)}for(const key in info){if(key==="shortMessage"){continue}const value=info[key];details.push(key+"="+stringify$1(value))}}details.push(`code=${code}`);details.push(`version=${version}`);if(details.length){message+=" ("+details.join(", ")+")"}}let error;switch(code){case"INVALID_ARGUMENT":error=new TypeError(message);break;case"NUMERIC_FAULT":case"BUFFER_OVERRUN":error=new RangeError(message);break;default:error=new Error(message)}defineProperties(error,{code:code});if(info){Object.assign(error,info)}if(error.shortMessage==null){defineProperties(error,{shortMessage:shortMessage})}return error}function assert(check,message,code,info){if(!check){throw makeError(message,code,info)}}function assertArgument(check,message,name,value){assert(check,message,"INVALID_ARGUMENT",{argument:name,value:value})}function assertArgumentCount(count,expectedCount,message){if(message==null){message=""}if(message){message=": "+message}assert(count>=expectedCount,"missing argument"+message,"MISSING_ARGUMENT",{count:count,expectedCount:expectedCount});assert(count<=expectedCount,"too many arguments"+message,"UNEXPECTED_ARGUMENT",{count:count,expectedCount:expectedCount})}const _normalizeForms=["NFD","NFC","NFKD","NFKC"].reduce((accum,form)=>{try{if("test".normalize(form)!=="test"){throw new Error("bad")}if(form==="NFD"){const check=String.fromCharCode(233).normalize("NFD");const expected=String.fromCharCode(101,769);if(check!==expected){throw new Error("broken")}}accum.push(form)}catch(error){}return accum},[]);function assertNormalize(form){assert(_normalizeForms.indexOf(form)>=0,"platform missing String.prototype.normalize","UNSUPPORTED_OPERATION",{operation:"String.prototype.normalize",info:{form:form}})}function assertPrivate(givenGuard,guard,className){if(className==null){className=""}if(givenGuard!==guard){let method=className,operation="new";if(className){method+=".";operation+=" "+className}assert(false,`private constructor; use ${method}from* methods`,"UNSUPPORTED_OPERATION",{operation:operation})}}function _getBytes(value,name,copy){if(value instanceof Uint8Array){if(copy){return new Uint8Array(value)}return value}if(typeof value==="string"&&value.match(/^0x(?:[0-9a-f][0-9a-f])*$/i)){const result=new Uint8Array((value.length-2)/2);let offset=2;for(let i=0;i>4]+HexCharacters[v&15]}return result}function concat(datas){return"0x"+datas.map(d=>hexlify(d).substring(2)).join("")}function dataLength(data){if(isHexString(data,true)){return(data.length-2)/2}return getBytes(data).length}function dataSlice(data,start,end){const bytes=getBytes(data);if(end!=null&&end>bytes.length){assert(false,"cannot slice beyond data bounds","BUFFER_OVERRUN",{buffer:bytes,length:bytes.length,offset:end})}return hexlify(bytes.slice(start==null?0:start,end==null?bytes.length:end))}function stripZerosLeft(data){let bytes=hexlify(data).substring(2);while(bytes.startsWith("00")){bytes=bytes.substring(2)}return"0x"+bytes}function zeroPad(data,length,left){const bytes=getBytes(data);assert(length>=bytes.length,"padding exceeds data length","BUFFER_OVERRUN",{buffer:new Uint8Array(bytes),length:length,offset:length+1});const result=new Uint8Array(length);result.fill(0);if(left){result.set(bytes,length-bytes.length)}else{result.set(bytes,0)}return hexlify(result)}function zeroPadValue(data,length){return zeroPad(data,length,true)}function zeroPadBytes(data,length){return zeroPad(data,length,false)}const BN_0$a=BigInt(0);const BN_1$5=BigInt(1);const maxValue=9007199254740991;function fromTwos(_value,_width){const value=getUint(_value,"value");const width=BigInt(getNumber(_width,"width"));assert(value>>width===BN_0$a,"overflow","NUMERIC_FAULT",{operation:"fromTwos",fault:"overflow",value:_value});if(value>>width-BN_1$5){const mask=(BN_1$5<=-maxValue&&value<=maxValue,"overflow",name||"value",value);return BigInt(value);case"string":try{if(value===""){throw new Error("empty string")}if(value[0]==="-"&&value[1]!=="-"){return-BigInt(value.substring(1))}return BigInt(value)}catch(e){assertArgument(false,`invalid BigNumberish string: ${e.message}`,name||"value",value)}}assertArgument(false,"invalid BigNumberish value",name||"value",value)}function getUint(value,name){const result=getBigInt(value,name);assert(result>=BN_0$a,"unsigned value cannot be negative","NUMERIC_FAULT",{fault:"overflow",operation:"getUint",value:value});return result}const Nibbles$1="0123456789abcdef";function toBigInt(value){if(value instanceof Uint8Array){let result="0x0";for(const v of value){result+=Nibbles$1[v>>4];result+=Nibbles$1[v&15]}return BigInt(result)}return getBigInt(value)}function getNumber(value,name){switch(typeof value){case"bigint":assertArgument(value>=-maxValue&&value<=maxValue,"overflow",name||"value",value);return Number(value);case"number":assertArgument(Number.isInteger(value),"underflow",name||"value",value);assertArgument(value>=-maxValue&&value<=maxValue,"overflow",name||"value",value);return value;case"string":try{if(value===""){throw new Error("empty string")}return getNumber(BigInt(value),name)}catch(e){assertArgument(false,`invalid numeric string: ${e.message}`,name||"value",value)}}assertArgument(false,"invalid numeric value",name||"value",value)}function toNumber(value){return getNumber(toBigInt(value))}function toBeHex(_value,_width){const value=getUint(_value,"value");let result=value.toString(16);if(_width==null){if(result.length%2){result="0"+result}}else{const width=getNumber(_width,"width");assert(width*2>=result.length,`value exceeds width (${width} bytes)`,"NUMERIC_FAULT",{operation:"toBeHex",fault:"overflow",value:_value});while(result.length>6!==2){break}i++}return i}if(reason==="OVERRUN"){return bytes.length-offset-1}return 0}function replaceFunc(reason,offset,bytes,output,badCodepoint){if(reason==="OVERLONG"){assertArgument(typeof badCodepoint==="number","invalid bad code point for replacement","badCodepoint",badCodepoint);output.push(badCodepoint);return 0}output.push(65533);return ignoreFunc(reason,offset,bytes)}const Utf8ErrorFuncs=Object.freeze({error:errorFunc,ignore:ignoreFunc,replace:replaceFunc});function getUtf8CodePoints(_bytes,onError){if(onError==null){onError=Utf8ErrorFuncs.error}const bytes=getBytes(_bytes,"bytes");const result=[];let i=0;while(i>7===0){result.push(c);continue}let extraLength=null;let overlongMask=null;if((c&224)===192){extraLength=1;overlongMask=127}else if((c&240)===224){extraLength=2;overlongMask=2047}else if((c&248)===240){extraLength=3;overlongMask=65535}else{if((c&192)===128){i+=onError("UNEXPECTED_CONTINUE",i-1,bytes,result)}else{i+=onError("BAD_PREFIX",i-1,bytes,result)}continue}if(i-1+extraLength>=bytes.length){i+=onError("OVERRUN",i-1,bytes,result);continue}let res=c&(1<<8-extraLength-1)-1;for(let j=0;j1114111){i+=onError("OUT_OF_RANGE",i-1-extraLength,bytes,result,res);continue}if(res>=55296&&res<=57343){i+=onError("UTF16_SURROGATE",i-1-extraLength,bytes,result,res);continue}if(res<=overlongMask){i+=onError("OVERLONG",i-1-extraLength,bytes,result,res);continue}result.push(res)}return result}function toUtf8Bytes(str,form){assertArgument(typeof str==="string","invalid string value","str",str);if(form!=null){assertNormalize(form);str=str.normalize(form)}let result=[];for(let i=0;i>6|192);result.push(c&63|128)}else if((c&64512)==55296){i++;const c2=str.charCodeAt(i);assertArgument(i>18|240);result.push(pair>>12&63|128);result.push(pair>>6&63|128);result.push(pair&63|128)}else{result.push(c>>12|224);result.push(c>>6&63|128);result.push(c&63|128)}}return new Uint8Array(result)}function _toUtf8String(codePoints){return codePoints.map(codePoint=>{if(codePoint<=65535){return String.fromCharCode(codePoint)}codePoint-=65536;return String.fromCharCode((codePoint>>10&1023)+55296,(codePoint&1023)+56320)}).join("")}function toUtf8String(bytes,onError){return _toUtf8String(getUtf8CodePoints(bytes,onError))}function toUtf8CodePoints(str,form){return getUtf8CodePoints(toUtf8Bytes(str,form))}function createGetUrl(options){async function getUrl(req,_signal){assert(_signal==null||!_signal.cancelled,"request cancelled before sending","CANCELLED");const protocol=req.url.split(":")[0].toLowerCase();assert(protocol==="http"||protocol==="https",`unsupported protocol ${protocol}`,"UNSUPPORTED_OPERATION",{info:{protocol:protocol},operation:"request"});assert(protocol==="https"||!req.credentials||req.allowInsecureAuthentication,"insecure authorized connections unsupported","UNSUPPORTED_OPERATION",{operation:"request"});let error=null;const controller=new AbortController;const timer=setTimeout(()=>{error=makeError("request timeout","TIMEOUT");controller.abort()},req.timeout);if(_signal){_signal.addListener(()=>{error=makeError("request cancelled","CANCELLED");controller.abort()})}const init=Object.assign({},options,{method:req.method,headers:new Headers(Array.from(req)),body:req.body||undefined,signal:controller.signal});let resp;try{resp=await fetch(req.url,init)}catch(_error){clearTimeout(timer);if(error){throw error}throw _error}clearTimeout(timer);const headers={};resp.headers.forEach((value,key)=>{headers[key.toLowerCase()]=value});const respBody=await resp.arrayBuffer();const body=respBody==null?null:new Uint8Array(respBody);return{statusCode:resp.status,statusMessage:resp.statusText,headers:headers,body:body}}return getUrl}const MAX_ATTEMPTS=12;const SLOT_INTERVAL=250;let defaultGetUrlFunc=createGetUrl();const reData=new RegExp("^data:([^;:]*)?(;base64)?,(.*)$","i");const reIpfs=new RegExp("^ipfs://(ipfs/)?(.*)$","i");let locked$5=false;async function dataGatewayFunc(url,signal){try{const match=url.match(reData);if(!match){throw new Error("invalid data")}return new FetchResponse(200,"OK",{"content-type":match[1]||"text/plain"},match[2]?decodeBase64(match[3]):unpercent(match[3]))}catch(error){return new FetchResponse(599,"BAD REQUEST (invalid data: URI)",{},null,new FetchRequest(url))}}function getIpfsGatewayFunc(baseUrl){async function gatewayIpfs(url,signal){try{const match=url.match(reIpfs);if(!match){throw new Error("invalid link")}return new FetchRequest(`${baseUrl}${match[2]}`)}catch(error){return new FetchResponse(599,"BAD REQUEST (invalid IPFS URI)",{},null,new FetchRequest(url))}}return gatewayIpfs}const Gateways={data:dataGatewayFunc,ipfs:getIpfsGatewayFunc("https://gateway.ipfs.io/ipfs/")};const fetchSignals=new WeakMap;class FetchCancelSignal{#listeners;#cancelled;constructor(request){this.#listeners=[];this.#cancelled=false;fetchSignals.set(request,()=>{if(this.#cancelled){return}this.#cancelled=true;for(const listener of this.#listeners){setTimeout(()=>{listener()},0)}this.#listeners=[]})}addListener(listener){assert(!this.#cancelled,"singal already cancelled","UNSUPPORTED_OPERATION",{operation:"fetchCancelSignal.addCancelListener"});this.#listeners.push(listener)}get cancelled(){return this.#cancelled}checkSignal(){assert(!this.cancelled,"cancelled","CANCELLED",{})}}function checkSignal(signal){if(signal==null){throw new Error("missing signal; should not happen")}signal.checkSignal();return signal}class FetchRequest{#allowInsecure;#gzip;#headers;#method;#timeout;#url;#body;#bodyType;#creds;#preflight;#process;#retry;#signal;#throttle;#getUrlFunc;get url(){return this.#url}set url(url){this.#url=String(url)}get body(){if(this.#body==null){return null}return new Uint8Array(this.#body)}set body(body){if(body==null){this.#body=undefined;this.#bodyType=undefined}else if(typeof body==="string"){this.#body=toUtf8Bytes(body);this.#bodyType="text/plain"}else if(body instanceof Uint8Array){this.#body=body;this.#bodyType="application/octet-stream"}else if(typeof body==="object"){this.#body=toUtf8Bytes(JSON.stringify(body));this.#bodyType="application/json"}else{throw new Error("invalid body")}}hasBody(){return this.#body!=null}get method(){if(this.#method){return this.#method}if(this.hasBody()){return"POST"}return"GET"}set method(method){if(method==null){method=""}this.#method=String(method).toUpperCase()}get headers(){const headers=Object.assign({},this.#headers);if(this.#creds){headers["authorization"]=`Basic ${encodeBase64(toUtf8Bytes(this.#creds))}`}if(this.allowGzip){headers["accept-encoding"]="gzip"}if(headers["content-type"]==null&&this.#bodyType){headers["content-type"]=this.#bodyType}if(this.body){headers["content-length"]=String(this.body.length)}return headers}getHeader(key){return this.headers[key.toLowerCase()]}setHeader(key,value){this.#headers[String(key).toLowerCase()]=String(value)}clearHeaders(){this.#headers={}}[Symbol.iterator](){const headers=this.headers;const keys=Object.keys(headers);let index=0;return{next:()=>{if(index=0,"timeout must be non-zero","timeout",timeout);this.#timeout=timeout}get preflightFunc(){return this.#preflight||null}set preflightFunc(preflight){this.#preflight=preflight}get processFunc(){return this.#process||null}set processFunc(process){this.#process=process}get retryFunc(){return this.#retry||null}set retryFunc(retry){this.#retry=retry}get getUrlFunc(){return this.#getUrlFunc||defaultGetUrlFunc}set getUrlFunc(value){this.#getUrlFunc=value}constructor(url){this.#url=String(url);this.#allowInsecure=false;this.#gzip=true;this.#headers={};this.#method="";this.#timeout=3e5;this.#throttle={slotInterval:SLOT_INTERVAL,maxAttempts:MAX_ATTEMPTS};this.#getUrlFunc=null}toString(){return``}setThrottleParams(params){if(params.slotInterval!=null){this.#throttle.slotInterval=params.slotInterval}if(params.maxAttempts!=null){this.#throttle.maxAttempts=params.maxAttempts}}async#send(attempt,expires,delay,_request,_response){if(attempt>=this.#throttle.maxAttempts){return _response.makeServerError("exceeded maximum retry limit")}assert(getTime$2()<=expires,"timeout","TIMEOUT",{operation:"request.send",reason:"timeout",request:_request});if(delay>0){await wait(delay)}let req=this.clone();const scheme=(req.url.split(":")[0]||"").toLowerCase();if(scheme in Gateways){const result=await Gateways[scheme](req.url,checkSignal(_request.#signal));if(result instanceof FetchResponse){let response=result;if(this.processFunc){checkSignal(_request.#signal);try{response=await this.processFunc(req,response)}catch(error){if(error.throttle==null||typeof error.stall!=="number"){response.makeServerError("error in post-processing function",error).assertOk()}}}return response}req=result}if(this.preflightFunc){req=await this.preflightFunc(req)}const resp=await this.getUrlFunc(req,checkSignal(_request.#signal));let response=new FetchResponse(resp.statusCode,resp.statusMessage,resp.headers,resp.body,_request);if(response.statusCode===301||response.statusCode===302){try{const location=response.headers.location||"";return req.redirect(location).#send(attempt+1,expires,0,_request,response)}catch(error){}return response}else if(response.statusCode===429){if(this.retryFunc==null||await this.retryFunc(req,response,attempt)){const retryAfter=response.headers["retry-after"];let delay=this.#throttle.slotInterval*Math.trunc(Math.random()*Math.pow(2,attempt));if(typeof retryAfter==="string"&&retryAfter.match(/^[1-9][0-9]*$/)){delay=parseInt(retryAfter)}return req.clone().#send(attempt+1,expires,delay,_request,response)}}if(this.processFunc){checkSignal(_request.#signal);try{response=await this.processFunc(req,response)}catch(error){if(error.throttle==null||typeof error.stall!=="number"){response.makeServerError("error in post-processing function",error).assertOk()}let delay=this.#throttle.slotInterval*Math.trunc(Math.random()*Math.pow(2,attempt));if(error.stall>=0){delay=error.stall}return req.clone().#send(attempt+1,expires,delay,_request,response)}}return response}send(){assert(this.#signal==null,"request already sent","UNSUPPORTED_OPERATION",{operation:"fetchRequest.send"});this.#signal=new FetchCancelSignal(this);return this.#send(0,getTime$2()+this.timeout,0,this,new FetchResponse(0,"",{},null,this))}cancel(){assert(this.#signal!=null,"request has not been sent","UNSUPPORTED_OPERATION",{operation:"fetchRequest.cancel"});const signal=fetchSignals.get(this);if(!signal){throw new Error("missing signal; should not happen")}signal()}redirect(location){const current=this.url.split(":")[0].toLowerCase();const target=location.split(":")[0].toLowerCase();assert(this.method==="GET"&&(current!=="https"||target!=="http")&&location.match(/^https?:/),`unsupported redirect`,"UNSUPPORTED_OPERATION",{operation:`redirect(${this.method} ${JSON.stringify(this.url)} => ${JSON.stringify(location)})`});const req=new FetchRequest(location);req.method="GET";req.allowGzip=this.allowGzip;req.timeout=this.timeout;req.#headers=Object.assign({},this.#headers);if(this.#body){req.#body=new Uint8Array(this.#body)}req.#bodyType=this.#bodyType;return req}clone(){const clone=new FetchRequest(this.url);clone.#method=this.#method;if(this.#body){clone.#body=this.#body}clone.#bodyType=this.#bodyType;clone.#headers=Object.assign({},this.#headers);clone.#creds=this.#creds;if(this.allowGzip){clone.allowGzip=true}clone.timeout=this.timeout;if(this.allowInsecureAuthentication){clone.allowInsecureAuthentication=true}clone.#preflight=this.#preflight;clone.#process=this.#process;clone.#retry=this.#retry;clone.#throttle=Object.assign({},this.#throttle);clone.#getUrlFunc=this.#getUrlFunc;return clone}static lockConfig(){locked$5=true}static getGateway(scheme){return Gateways[scheme.toLowerCase()]||null}static registerGateway(scheme,func){scheme=scheme.toLowerCase();if(scheme==="http"||scheme==="https"){throw new Error(`cannot intercept ${scheme}; use registerGetUrl`)}if(locked$5){throw new Error("gateways locked")}Gateways[scheme]=func}static registerGetUrl(getUrl){if(locked$5){throw new Error("gateways locked")}defaultGetUrlFunc=getUrl}static createGetUrlFunc(options){return createGetUrl(options)}static createDataGateway(){return dataGatewayFunc}static createIpfsGatewayFunc(baseUrl){return getIpfsGatewayFunc(baseUrl)}}class FetchResponse{#statusCode;#statusMessage;#headers;#body;#request;#error;toString(){return``}get statusCode(){return this.#statusCode}get statusMessage(){return this.#statusMessage}get headers(){return Object.assign({},this.#headers)}get body(){return this.#body==null?null:new Uint8Array(this.#body)}get bodyText(){try{return this.#body==null?"":toUtf8String(this.#body)}catch(error){assert(false,"response body is not valid UTF-8 data","UNSUPPORTED_OPERATION",{operation:"bodyText",info:{response:this}})}}get bodyJson(){try{return JSON.parse(this.bodyText)}catch(error){assert(false,"response body is not valid JSON","UNSUPPORTED_OPERATION",{operation:"bodyJson",info:{response:this}})}}[Symbol.iterator](){const headers=this.headers;const keys=Object.keys(headers);let index=0;return{next:()=>{if(index{accum[k.toLowerCase()]=String(headers[k]);return accum},{});this.#body=body==null?null:new Uint8Array(body);this.#request=request||null;this.#error={message:""}}makeServerError(message,error){let statusMessage;if(!message){message=`${this.statusCode} ${this.statusMessage}`;statusMessage=`CLIENT ESCALATED SERVER ERROR (${message})`}else{statusMessage=`CLIENT ESCALATED SERVER ERROR (${this.statusCode} ${this.statusMessage}; ${message})`}const response=new FetchResponse(599,statusMessage,this.headers,this.body,this.#request||undefined);response.#error={message:message,error:error};return response}throwThrottleError(message,stall){if(stall==null){stall=-1}else{assertArgument(Number.isInteger(stall)&&stall>=0,"invalid stall timeout","stall",stall)}const error=new Error(message||"throttling requests");defineProperties(error,{stall:stall,throttle:true});throw error}getHeader(key){return this.headers[key.toLowerCase()]}hasBody(){return this.#body!=null}get request(){return this.#request}ok(){return this.#error.message===""&&this.statusCode>=200&&this.statusCode<300}assertOk(){if(this.ok()){return}let{message,error}=this.#error;if(message===""){message=`server response ${this.statusCode} ${this.statusMessage}`}let requestUrl=null;if(this.request){requestUrl=this.request.url}let responseBody=null;try{if(this.#body){responseBody=toUtf8String(this.#body)}}catch(e){}assert(false,message,"SERVER_ERROR",{request:this.request||"unknown request",response:this,error:error,info:{requestUrl:requestUrl,responseBody:responseBody,responseStatus:`${this.statusCode} ${this.statusMessage}`}})}}function getTime$2(){return(new Date).getTime()}function unpercent(value){return toUtf8Bytes(value.replace(/%([0-9a-f][0-9a-f])/gi,(all,code)=>{return String.fromCharCode(parseInt(code,16))}))}function wait(delay){return new Promise(resolve=>setTimeout(resolve,delay))}const BN_N1=BigInt(-1);const BN_0$8=BigInt(0);const BN_1$4=BigInt(1);const BN_5=BigInt(5);const _guard$5={};let Zeros$1="0000";while(Zeros$1.length<80){Zeros$1+=Zeros$1}function getTens(decimals){let result=Zeros$1;while(result.length=-limit&&valBN_0$8){val=fromTwos(mask(val,width),width)}else{val=-fromTwos(mask(-val,width),width)}}else{const limit=BN_1$4<=0&&val{if(v[key]==null){return defaultValue}assertArgument(typeof v[key]===type,"invalid fixed format ("+key+" not "+type+")","format."+key,v[key]);return v[key]};signed=check("signed","boolean",signed);width=check("width","number",width);decimals=check("decimals","number",decimals)}assertArgument(width%8===0,"invalid FixedNumber width (not byte aligned)","format.width",width);assertArgument(decimals<=80,"invalid FixedNumber decimals (too large)","format.decimals",decimals);const name=(signed?"":"u")+"fixed"+String(width)+"x"+String(decimals);return{signed:signed,width:width,decimals:decimals,name:name}}function toString(val,decimals){let negative="";if(val0){b*=getTens(delta)}else if(delta<0){a*=getTens(-delta)}if(ab){return 1}return 0}eq(other){return this.cmp(other)===0}lt(other){return this.cmp(other)<0}lte(other){return this.cmp(other)<=0}gt(other){return this.cmp(other)>0}gte(other){return this.cmp(other)>=0}floor(){let val=this.#val;if(this.#valBN_0$8){val+=this.#tens-BN_1$4}val=this.#val/this.#tens*this.#tens;return this.#checkValue(val,"ceiling")}round(decimals){if(decimals==null){decimals=0}if(decimals>=this.decimals){return this}const delta=this.decimals-decimals;const bump=BN_5*getTens(delta-1);let value=this.value+bump;const tens=getTens(delta);value=value/tens*tens;checkValue(value,this.#format,"round");return new FixedNumber(_guard$5,value,this.#format)}isZero(){return this.#val===BN_0$8}isNegative(){return this.#val0){const tens=getTens(delta);assert(value%tens===BN_0$8,"value loses precision for format","NUMERIC_FAULT",{operation:"fromValue",fault:"underflow",value:_value});value/=tens}else if(delta<0){value*=getTens(-delta)}checkValue(value,format,"fromValue");return new FixedNumber(_guard$5,value,format)}static fromString(_value,_format){const match=_value.match(/^(-?)([0-9]*)\.?([0-9]*)$/);assertArgument(match&&match[2].length+match[3].length>0,"invalid FixedNumber string value","value",_value);const format=getFormat(_format);let whole=match[2]||"0",decimal=match[3]||"";while(decimal.length{assert(offset<=data.length,"data short segment too short","BUFFER_OVERRUN",{buffer:data,length:data.length,offset:offset})};if(data[offset]>=248){const lengthLength=data[offset]-247;checkOffset(offset+1+lengthLength);const length=unarrayifyInteger(data,offset+1,lengthLength);checkOffset(offset+1+lengthLength+length);return _decodeChildren(data,offset,offset+1+lengthLength,lengthLength+length)}else if(data[offset]>=192){const length=data[offset]-192;checkOffset(offset+1+length);return _decodeChildren(data,offset,offset+1,length)}else if(data[offset]>=184){const lengthLength=data[offset]-183;checkOffset(offset+1+lengthLength);const length=unarrayifyInteger(data,offset+1,lengthLength);checkOffset(offset+1+lengthLength+length);const result=hexlify(data.slice(offset+1+lengthLength,offset+1+lengthLength+length));return{consumed:1+lengthLength+length,result:result}}else if(data[offset]>=128){const length=data[offset]-128;checkOffset(offset+1+length);const result=hexlify(data.slice(offset+1,offset+1+length));return{consumed:1+length,result:result}}return{consumed:1,result:hexlifyByte(data[offset])}}function decodeRlp(_data){const data=getBytes(_data,"data");const decoded=_decode(data,0);assertArgument(decoded.consumed===data.length,"unexpected junk after rlp payload","data",_data);return decoded.result}function arrayifyInteger(value){const result=[];while(value){result.unshift(value&255);value>>=8}return result}function _encode(object){if(Array.isArray(object)){let payload=[];object.forEach(function(child){payload=payload.concat(_encode(child))});if(payload.length<=55){payload.unshift(192+payload.length);return payload}const length=arrayifyInteger(payload.length);length.unshift(247+length.length);return length.concat(payload)}const data=Array.prototype.slice.call(getBytes(object,"object"));if(data.length===1&&data[0]<=127){return data}else if(data.length<=55){data.unshift(128+data.length);return data}const length=arrayifyInteger(data.length);length.unshift(183+length.length);return length.concat(data)}const nibbles="0123456789abcdef";function encodeRlp(object){let result="0x";for(const v of _encode(object)){result+=nibbles[v>>4];result+=nibbles[v&15]}return result}const names=["wei","kwei","mwei","gwei","szabo","finney","ether"];function formatUnits(value,unit){let decimals=18;if(typeof unit==="string"){const index=names.indexOf(unit);assertArgument(index>=0,"invalid unit","unit",unit);decimals=3*index}else if(unit!=null){decimals=getNumber(unit,"unit")}return FixedNumber.fromValue(value,decimals,{decimals:decimals,width:512}).toString()}function parseUnits$1(value,unit){assertArgument(typeof value==="string","value must be a string","value",value);let decimals=18;if(typeof unit==="string"){const index=names.indexOf(unit);assertArgument(index>=0,"invalid unit","unit",unit);decimals=3*index}else if(unit!=null){decimals=getNumber(unit,"unit")}return FixedNumber.fromString(value,{decimals:decimals,width:512}).value}function formatEther(wei){return formatUnits(wei,18)}function parseEther(ether){return parseUnits$1(ether,18)}function uuidV4(randomBytes){const bytes=getBytes(randomBytes,"randomBytes");bytes[6]=bytes[6]&15|64;bytes[8]=bytes[8]&63|128;const value=hexlify(bytes);return[value.substring(2,10),value.substring(10,14),value.substring(14,18),value.substring(18,22),value.substring(22,34)].join("-")}const WordSize=32;const Padding=new Uint8Array(WordSize);const passProperties$1=["then"];const _guard$4={};const resultNames=new WeakMap;function getNames(result){return resultNames.get(result)}function setNames(result,names){resultNames.set(result,names)}function throwError(name,error){const wrapped=new Error(`deferred error during ABI decoding triggered accessing ${name}`);wrapped.error=error;throw wrapped}function toObject(names,items,deep){if(names.indexOf(null)>=0){return items.map((item,index)=>{if(item instanceof Result){return toObject(getNames(item),item,deep)}return item})}return names.reduce((accum,name,index)=>{let item=items.getValue(name);if(!(name in accum)){if(deep&&item instanceof Result){item=toObject(getNames(item),item,deep)}accum[name]=item}return accum},{})}class Result extends Array{#names;constructor(...args){const guard=args[0];let items=args[1];let names=(args[2]||[]).slice();let wrap=true;if(guard!==_guard$4){items=args;names=[];wrap=false}super(items.length);items.forEach((item,index)=>{this[index]=item});const nameCounts=names.reduce((accum,name)=>{if(typeof name==="string"){accum.set(name,(accum.get(name)||0)+1)}return accum},new Map);setNames(this,Object.freeze(items.map((item,index)=>{const name=names[index];if(name!=null&&nameCounts.get(name)===1){return name}return null})));this.#names=[];if(this.#names==null){void this.#names}if(!wrap){return}Object.freeze(this);const proxy=new Proxy(this,{get:(target,prop,receiver)=>{if(typeof prop==="string"){if(prop.match(/^[0-9]+$/)){const index=getNumber(prop,"%index");if(index<0||index>=this.length){throw new RangeError("out of result range")}const item=target[index];if(item instanceof Error){throwError(`index ${index}`,item)}return item}if(passProperties$1.indexOf(prop)>=0){return Reflect.get(target,prop,receiver)}const value=target[prop];if(value instanceof Function){return function(...args){return value.apply(this===receiver?target:this,args)}}else if(!(prop in target)){return target.getValue.apply(this===receiver?target:this,[prop])}}return Reflect.get(target,prop,receiver)}});setNames(proxy,getNames(this));return proxy}toArray(deep){const result=[];this.forEach((item,index)=>{if(item instanceof Error){throwError(`index ${index}`,item)}if(deep&&item instanceof Result){item=item.toArray(deep)}result.push(item)});return result}toObject(deep){const names=getNames(this);return names.reduce((accum,name,index)=>{assert(name!=null,`value at index ${index} unnamed`,"UNSUPPORTED_OPERATION",{operation:"toObject()"});return toObject(names,this,deep)},{})}slice(start,end){if(start==null){start=0}if(start<0){start+=this.length;if(start<0){start=0}}if(end==null){end=this.length}if(end<0){end+=this.length;if(end<0){end=0}}if(end>this.length){end=this.length}const _names=getNames(this);const result=[],names=[];for(let i=start;i{this.#data[offset]=getValue$1(value)}}}class Reader{allowLoose;#data;#offset;#bytesRead;#parent;#maxInflation;constructor(data,allowLoose,maxInflation){defineProperties(this,{allowLoose:!!allowLoose});this.#data=getBytesCopy(data);this.#bytesRead=0;this.#parent=null;this.#maxInflation=maxInflation!=null?maxInflation:1024;this.#offset=0}get data(){return hexlify(this.#data)}get dataLength(){return this.#data.length}get consumed(){return this.#offset}get bytes(){return new Uint8Array(this.#data)}#incrementBytesRead(count){if(this.#parent){return this.#parent.#incrementBytesRead(count)}this.#bytesRead+=count;assert(this.#maxInflation<1||this.#bytesRead<=this.#maxInflation*this.dataLength,`compressed ABI data exceeds inflation ratio of ${this.#maxInflation} ( see: https:/\/github.com/ethers-io/ethers.js/issues/4537 )`,"BUFFER_OVERRUN",{buffer:getBytesCopy(this.#data),offset:this.#offset,length:count,info:{bytesRead:this.#bytesRead,dataLength:this.dataLength}})}#peekBytes(offset,length,loose){let alignedLength=Math.ceil(length/WordSize)*WordSize;if(this.#offset+alignedLength>this.#data.length){if(this.allowLoose&&loose&&this.#offset+length<=this.#data.length){alignedLength=length}else{assert(false,"data out-of-bounds","BUFFER_OVERRUN",{buffer:getBytesCopy(this.#data),length:this.#data.length,offset:this.#offset+alignedLength})}}return this.#data.slice(this.#offset,this.#offset+alignedLength)}subReader(offset){const reader=new Reader(this.#data.slice(this.#offset+offset),this.allowLoose,this.#maxInflation);reader.#parent=this;return reader}readBytes(length,loose){let bytes=this.#peekBytes(0,length,!!loose);this.#incrementBytesRead(length);this.#offset+=bytes.length;return bytes.slice(0,length)}readValue(){return toBigInt(this.readBytes(WordSize))}readIndex(){return toNumber(this.readBytes(WordSize))}}function number(n){if(!Number.isSafeInteger(n)||n<0)throw new Error(`Wrong positive integer: ${n}`)}function bytes(b,...lengths){if(!(b instanceof Uint8Array))throw new Error("Expected Uint8Array");if(lengths.length>0&&!lengths.includes(b.length))throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`)}function hash(hash){if(typeof hash!=="function"||typeof hash.create!=="function")throw new Error("Hash should be wrapped by utils.wrapConstructor");number(hash.outputLen);number(hash.blockLen)}function exists(instance,checkFinished=true){if(instance.destroyed)throw new Error("Hash instance has been destroyed");if(checkFinished&&instance.finished)throw new Error("Hash#digest() has already been called")}function output(out,instance){bytes(out);const min=instance.outputLen;if(out.lengtha instanceof Uint8Array;const u32=arr=>new Uint32Array(arr.buffer,arr.byteOffset,Math.floor(arr.byteLength/4));const createView=arr=>new DataView(arr.buffer,arr.byteOffset,arr.byteLength);const rotr=(word,shift)=>word<<32-shift|word>>>shift;const isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!isLE)throw new Error("Non little-endian hardware is not supported");const nextTick=async()=>{};async function asyncLoop(iters,tick,cb){let ts=Date.now();for(let i=0;i=0&&diffsum+a.length,0));let pad=0;arrays.forEach(a=>{if(!u8a$1(a))throw new Error("Uint8Array expected");r.set(a,pad);pad+=a.length});return r}class Hash{clone(){return this._cloneInto()}}const toStr={}.toString;function checkOpts(defaults,opts){if(opts!==undefined&&toStr.call(opts)!=="[object Object]")throw new Error("Options should be object or undefined");const merged=Object.assign(defaults,opts);return merged}function wrapConstructor(hashCons){const hashC=msg=>hashCons().update(toBytes(msg)).digest();const tmp=hashCons();hashC.outputLen=tmp.outputLen;hashC.blockLen=tmp.blockLen;hashC.create=()=>hashCons();return hashC}function randomBytes$2(bytesLength=32){if(crypto$1&&typeof crypto$1.getRandomValues==="function"){return crypto$1.getRandomValues(new Uint8Array(bytesLength))}throw new Error("crypto.getRandomValues must be defined")}class HMAC extends Hash{constructor(hash$1,_key){super();this.finished=false;this.destroyed=false;hash(hash$1);const key=toBytes(_key);this.iHash=hash$1.create();if(typeof this.iHash.update!=="function")throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen;this.outputLen=this.iHash.outputLen;const blockLen=this.blockLen;const pad=new Uint8Array(blockLen);pad.set(key.length>blockLen?hash$1.create().update(key).digest():key);for(let i=0;inew HMAC(hash,key).update(message).digest();hmac.create=(hash,key)=>new HMAC(hash,key);function pbkdf2Init(hash$1,_password,_salt,_opts){hash(hash$1);const opts=checkOpts({dkLen:32,asyncTick:10},_opts);const{c,dkLen,asyncTick}=opts;number(c);number(dkLen);number(asyncTick);if(c<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const password=toBytes(_password);const salt=toBytes(_salt);const DK=new Uint8Array(dkLen);const PRF=hmac.create(hash$1,password);const PRFSalt=PRF._cloneInto().update(salt);return{c:c,dkLen:dkLen,asyncTick:asyncTick,DK:DK,PRF:PRF,PRFSalt:PRFSalt}}function pbkdf2Output(PRF,PRFSalt,DK,prfW,u){PRF.destroy();PRFSalt.destroy();if(prfW)prfW.destroy();u.fill(0);return DK}function pbkdf2$1(hash,password,salt,opts){const{c,dkLen,DK,PRF,PRFSalt}=pbkdf2Init(hash,password,salt,opts);let prfW;const arr=new Uint8Array(4);const view=createView(arr);const u=new Uint8Array(PRF.outputLen);for(let ti=1,pos=0;pos>_32n&_u32_max);const wl=Number(value&_u32_max);const h=isLE?4:0;const l=isLE?0:4;view.setUint32(byteOffset+h,wh,isLE);view.setUint32(byteOffset+l,wl,isLE)}class SHA2 extends Hash{constructor(blockLen,outputLen,padOffset,isLE){super();this.blockLen=blockLen;this.outputLen=outputLen;this.padOffset=padOffset;this.isLE=isLE;this.finished=false;this.length=0;this.pos=0;this.destroyed=false;this.buffer=new Uint8Array(blockLen);this.view=createView(this.buffer)}update(data){exists(this);const{view,buffer,blockLen}=this;data=toBytes(data);const len=data.length;for(let pos=0;posblockLen-pos){this.process(view,0);pos=0}for(let i=pos;istate.length)throw new Error("_sha2: outputLen bigger than state");for(let i=0;ia&b^~a&c;const Maj=(a,b,c)=>a&b^a&c^b&c;const SHA256_K=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);const IV=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);const SHA256_W=new Uint32Array(64);class SHA256 extends SHA2{constructor(){super(64,32,8,false);this.A=IV[0]|0;this.B=IV[1]|0;this.C=IV[2]|0;this.D=IV[3]|0;this.E=IV[4]|0;this.F=IV[5]|0;this.G=IV[6]|0;this.H=IV[7]|0}get(){const{A,B,C,D,E,F,G,H}=this;return[A,B,C,D,E,F,G,H]}set(A,B,C,D,E,F,G,H){this.A=A|0;this.B=B|0;this.C=C|0;this.D=D|0;this.E=E|0;this.F=F|0;this.G=G|0;this.H=H|0}process(view,offset){for(let i=0;i<16;i++,offset+=4)SHA256_W[i]=view.getUint32(offset,false);for(let i=16;i<64;i++){const W15=SHA256_W[i-15];const W2=SHA256_W[i-2];const s0=rotr(W15,7)^rotr(W15,18)^W15>>>3;const s1=rotr(W2,17)^rotr(W2,19)^W2>>>10;SHA256_W[i]=s1+SHA256_W[i-7]+s0+SHA256_W[i-16]|0}let{A,B,C,D,E,F,G,H}=this;for(let i=0;i<64;i++){const sigma1=rotr(E,6)^rotr(E,11)^rotr(E,25);const T1=H+sigma1+Chi(E,F,G)+SHA256_K[i]+SHA256_W[i]|0;const sigma0=rotr(A,2)^rotr(A,13)^rotr(A,22);const T2=sigma0+Maj(A,B,C)|0;H=G;G=F;F=E;E=D+T1|0;D=C;C=B;B=A;A=T1+T2|0}A=A+this.A|0;B=B+this.B|0;C=C+this.C|0;D=D+this.D|0;E=E+this.E|0;F=F+this.F|0;G=G+this.G|0;H=H+this.H|0;this.set(A,B,C,D,E,F,G,H)}roundClean(){SHA256_W.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0);this.buffer.fill(0)}}const sha256$1=wrapConstructor(()=>new SHA256);const U32_MASK64=BigInt(2**32-1);const _32n=BigInt(32);function fromBig(n,le=false){if(le)return{h:Number(n&U32_MASK64),l:Number(n>>_32n&U32_MASK64)};return{h:Number(n>>_32n&U32_MASK64)|0,l:Number(n&U32_MASK64)|0}}function split$1(lst,le=false){let Ah=new Uint32Array(lst.length);let Al=new Uint32Array(lst.length);for(let i=0;iBigInt(h>>>0)<<_32n|BigInt(l>>>0);const shrSH=(h,_l,s)=>h>>>s;const shrSL=(h,l,s)=>h<<32-s|l>>>s;const rotrSH=(h,l,s)=>h>>>s|l<<32-s;const rotrSL=(h,l,s)=>h<<32-s|l>>>s;const rotrBH=(h,l,s)=>h<<64-s|l>>>s-32;const rotrBL=(h,l,s)=>h>>>s-32|l<<64-s;const rotr32H=(_h,l)=>l;const rotr32L=(h,_l)=>h;const rotlSH=(h,l,s)=>h<>>32-s;const rotlSL=(h,l,s)=>l<>>32-s;const rotlBH=(h,l,s)=>l<>>64-s;const rotlBL=(h,l,s)=>h<>>64-s;function add(Ah,Al,Bh,Bl){const l=(Al>>>0)+(Bl>>>0);return{h:Ah+Bh+(l/2**32|0)|0,l:l|0}}const add3L=(Al,Bl,Cl)=>(Al>>>0)+(Bl>>>0)+(Cl>>>0);const add3H=(low,Ah,Bh,Ch)=>Ah+Bh+Ch+(low/2**32|0)|0;const add4L=(Al,Bl,Cl,Dl)=>(Al>>>0)+(Bl>>>0)+(Cl>>>0)+(Dl>>>0);const add4H=(low,Ah,Bh,Ch,Dh)=>Ah+Bh+Ch+Dh+(low/2**32|0)|0;const add5L=(Al,Bl,Cl,Dl,El)=>(Al>>>0)+(Bl>>>0)+(Cl>>>0)+(Dl>>>0)+(El>>>0);const add5H=(low,Ah,Bh,Ch,Dh,Eh)=>Ah+Bh+Ch+Dh+Eh+(low/2**32|0)|0;const u64={fromBig:fromBig,split:split$1,toBig:toBig,shrSH:shrSH,shrSL:shrSL,rotrSH:rotrSH,rotrSL:rotrSL,rotrBH:rotrBH,rotrBL:rotrBL,rotr32H:rotr32H,rotr32L:rotr32L,rotlSH:rotlSH,rotlSL:rotlSL,rotlBH:rotlBH,rotlBL:rotlBL,add:add,add3L:add3L,add3H:add3H,add4L:add4L,add4H:add4H,add5H:add5H,add5L:add5L};const[SHA512_Kh,SHA512_Kl]=(()=>u64.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(n=>BigInt(n))))();const SHA512_W_H=new Uint32Array(80);const SHA512_W_L=new Uint32Array(80);class SHA512 extends SHA2{constructor(){super(128,64,16,false);this.Ah=1779033703|0;this.Al=4089235720|0;this.Bh=3144134277|0;this.Bl=2227873595|0;this.Ch=1013904242|0;this.Cl=4271175723|0;this.Dh=2773480762|0;this.Dl=1595750129|0;this.Eh=1359893119|0;this.El=2917565137|0;this.Fh=2600822924|0;this.Fl=725511199|0;this.Gh=528734635|0;this.Gl=4215389547|0;this.Hh=1541459225|0;this.Hl=327033209|0}get(){const{Ah,Al,Bh,Bl,Ch,Cl,Dh,Dl,Eh,El,Fh,Fl,Gh,Gl,Hh,Hl}=this;return[Ah,Al,Bh,Bl,Ch,Cl,Dh,Dl,Eh,El,Fh,Fl,Gh,Gl,Hh,Hl]}set(Ah,Al,Bh,Bl,Ch,Cl,Dh,Dl,Eh,El,Fh,Fl,Gh,Gl,Hh,Hl){this.Ah=Ah|0;this.Al=Al|0;this.Bh=Bh|0;this.Bl=Bl|0;this.Ch=Ch|0;this.Cl=Cl|0;this.Dh=Dh|0;this.Dl=Dl|0;this.Eh=Eh|0;this.El=El|0;this.Fh=Fh|0;this.Fl=Fl|0;this.Gh=Gh|0;this.Gl=Gl|0;this.Hh=Hh|0;this.Hl=Hl|0}process(view,offset){for(let i=0;i<16;i++,offset+=4){SHA512_W_H[i]=view.getUint32(offset);SHA512_W_L[i]=view.getUint32(offset+=4)}for(let i=16;i<80;i++){const W15h=SHA512_W_H[i-15]|0;const W15l=SHA512_W_L[i-15]|0;const s0h=u64.rotrSH(W15h,W15l,1)^u64.rotrSH(W15h,W15l,8)^u64.shrSH(W15h,W15l,7);const s0l=u64.rotrSL(W15h,W15l,1)^u64.rotrSL(W15h,W15l,8)^u64.shrSL(W15h,W15l,7);const W2h=SHA512_W_H[i-2]|0;const W2l=SHA512_W_L[i-2]|0;const s1h=u64.rotrSH(W2h,W2l,19)^u64.rotrBH(W2h,W2l,61)^u64.shrSH(W2h,W2l,6);const s1l=u64.rotrSL(W2h,W2l,19)^u64.rotrBL(W2h,W2l,61)^u64.shrSL(W2h,W2l,6);const SUMl=u64.add4L(s0l,s1l,SHA512_W_L[i-7],SHA512_W_L[i-16]);const SUMh=u64.add4H(SUMl,s0h,s1h,SHA512_W_H[i-7],SHA512_W_H[i-16]);SHA512_W_H[i]=SUMh|0;SHA512_W_L[i]=SUMl|0}let{Ah,Al,Bh,Bl,Ch,Cl,Dh,Dl,Eh,El,Fh,Fl,Gh,Gl,Hh,Hl}=this;for(let i=0;i<80;i++){const sigma1h=u64.rotrSH(Eh,El,14)^u64.rotrSH(Eh,El,18)^u64.rotrBH(Eh,El,41);const sigma1l=u64.rotrSL(Eh,El,14)^u64.rotrSL(Eh,El,18)^u64.rotrBL(Eh,El,41);const CHIh=Eh&Fh^~Eh&Gh;const CHIl=El&Fl^~El&Gl;const T1ll=u64.add5L(Hl,sigma1l,CHIl,SHA512_Kl[i],SHA512_W_L[i]);const T1h=u64.add5H(T1ll,Hh,sigma1h,CHIh,SHA512_Kh[i],SHA512_W_H[i]);const T1l=T1ll|0;const sigma0h=u64.rotrSH(Ah,Al,28)^u64.rotrBH(Ah,Al,34)^u64.rotrBH(Ah,Al,39);const sigma0l=u64.rotrSL(Ah,Al,28)^u64.rotrBL(Ah,Al,34)^u64.rotrBL(Ah,Al,39);const MAJh=Ah&Bh^Ah&Ch^Bh&Ch;const MAJl=Al&Bl^Al&Cl^Bl&Cl;Hh=Gh|0;Hl=Gl|0;Gh=Fh|0;Gl=Fl|0;Fh=Eh|0;Fl=El|0;({h:Eh,l:El}=u64.add(Dh|0,Dl|0,T1h|0,T1l|0));Dh=Ch|0;Dl=Cl|0;Ch=Bh|0;Cl=Bl|0;Bh=Ah|0;Bl=Al|0;const All=u64.add3L(T1l,sigma0l,MAJl);Ah=u64.add3H(All,T1h,sigma0h,MAJh);Al=All|0}({h:Ah,l:Al}=u64.add(this.Ah|0,this.Al|0,Ah|0,Al|0));({h:Bh,l:Bl}=u64.add(this.Bh|0,this.Bl|0,Bh|0,Bl|0));({h:Ch,l:Cl}=u64.add(this.Ch|0,this.Cl|0,Ch|0,Cl|0));({h:Dh,l:Dl}=u64.add(this.Dh|0,this.Dl|0,Dh|0,Dl|0));({h:Eh,l:El}=u64.add(this.Eh|0,this.El|0,Eh|0,El|0));({h:Fh,l:Fl}=u64.add(this.Fh|0,this.Fl|0,Fh|0,Fl|0));({h:Gh,l:Gl}=u64.add(this.Gh|0,this.Gl|0,Gh|0,Gl|0));({h:Hh,l:Hl}=u64.add(this.Hh|0,this.Hl|0,Hh|0,Hl|0));this.set(Ah,Al,Bh,Bl,Ch,Cl,Dh,Dl,Eh,El,Fh,Fl,Gh,Gl,Hh,Hl)}roundClean(){SHA512_W_H.fill(0);SHA512_W_L.fill(0)}destroy(){this.buffer.fill(0);this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}const sha512$1=wrapConstructor(()=>new SHA512);function getGlobal$1(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")}const anyGlobal=getGlobal$1();const crypto=anyGlobal.crypto||anyGlobal.msCrypto;function createHash(algo){switch(algo){case"sha256":return sha256$1.create();case"sha512":return sha512$1.create()}assertArgument(false,"invalid hashing algorithm name","algorithm",algo)}function createHmac(_algo,key){const algo={sha256:sha256$1,sha512:sha512$1}[_algo];assertArgument(algo!=null,"invalid hmac algorithm","algorithm",_algo);return hmac.create(algo,key)}function pbkdf2Sync(password,salt,iterations,keylen,_algo){const algo={sha256:sha256$1,sha512:sha512$1}[_algo];assertArgument(algo!=null,"invalid pbkdf2 algorithm","algorithm",_algo);return pbkdf2$1(algo,password,salt,{c:iterations,dkLen:keylen})}function randomBytes$1(length){assert(crypto!=null,"platform does not support secure random numbers","UNSUPPORTED_OPERATION",{operation:"randomBytes"});assertArgument(Number.isInteger(length)&&length>0&&length<=1024,"invalid length","length",length);const result=new Uint8Array(length);crypto.getRandomValues(result);return result}let locked$4=false;const _computeHmac=function(algorithm,key,data){return createHmac(algorithm,key).update(data).digest()};let __computeHmac=_computeHmac;function computeHmac(algorithm,_key,_data){const key=getBytes(_key,"key");const data=getBytes(_data,"data");return hexlify(__computeHmac(algorithm,key,data))}computeHmac._=_computeHmac;computeHmac.lock=function(){locked$4=true};computeHmac.register=function(func){if(locked$4){throw new Error("computeHmac is locked")}__computeHmac=func};Object.freeze(computeHmac);const[SHA3_PI,SHA3_ROTL,_SHA3_IOTA]=[[],[],[]];const _0n$4=BigInt(0);const _1n$5=BigInt(1);const _2n$3=BigInt(2);const _7n=BigInt(7);const _256n=BigInt(256);const _0x71n=BigInt(113);for(let round=0,R=_1n$5,x=1,y=0;round<24;round++){[x,y]=[y,(2*x+3*y)%5];SHA3_PI.push(2*(5*y+x));SHA3_ROTL.push((round+1)*(round+2)/2%64);let t=_0n$4;for(let j=0;j<7;j++){R=(R<<_1n$5^(R>>_7n)*_0x71n)%_256n;if(R&_2n$3)t^=_1n$5<<(_1n$5<s>32?rotlBH(h,l,s):rotlSH(h,l,s);const rotlL=(h,l,s)=>s>32?rotlBL(h,l,s):rotlSL(h,l,s);function keccakP(s,rounds=24){const B=new Uint32Array(5*2);for(let round=24-rounds;round<24;round++){for(let x=0;x<10;x++)B[x]=s[x]^s[x+10]^s[x+20]^s[x+30]^s[x+40];for(let x=0;x<10;x+=2){const idx1=(x+8)%10;const idx0=(x+2)%10;const B0=B[idx0];const B1=B[idx0+1];const Th=rotlH(B0,B1,1)^B[idx1];const Tl=rotlL(B0,B1,1)^B[idx1+1];for(let y=0;y<50;y+=10){s[x+y]^=Th;s[x+y+1]^=Tl}}let curH=s[2];let curL=s[3];for(let t=0;t<24;t++){const shift=SHA3_ROTL[t];const Th=rotlH(curH,curL,shift);const Tl=rotlL(curH,curL,shift);const PI=SHA3_PI[t];curH=s[PI];curL=s[PI+1];s[PI]=Th;s[PI+1]=Tl}for(let y=0;y<50;y+=10){for(let x=0;x<10;x++)B[x]=s[y+x];for(let x=0;x<10;x++)s[y+x]^=~B[(x+2)%10]&B[(x+4)%10]}s[0]^=SHA3_IOTA_H[round];s[1]^=SHA3_IOTA_L[round]}B.fill(0)}class Keccak extends Hash{constructor(blockLen,suffix,outputLen,enableXOF=false,rounds=24){super();this.blockLen=blockLen;this.suffix=suffix;this.outputLen=outputLen;this.enableXOF=enableXOF;this.rounds=rounds;this.pos=0;this.posOut=0;this.finished=false;this.destroyed=false;number(outputLen);if(0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200);this.state32=u32(this.state)}keccak(){keccakP(this.state32,this.rounds);this.posOut=0;this.pos=0}update(data){exists(this);const{blockLen,state}=this;data=toBytes(data);const len=data.length;for(let pos=0;pos=blockLen)this.keccak();const take=Math.min(blockLen-this.posOut,len-pos);out.set(bufferOut.subarray(this.posOut,this.posOut+take),pos);this.posOut+=take;pos+=take}return out}xofInto(out){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(out)}xof(bytes){number(bytes);return this.xofInto(new Uint8Array(bytes))}digestInto(out){output(out,this);if(this.finished)throw new Error("digest() was already called");this.writeInto(out);this.destroy();return out}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=true;this.state.fill(0)}_cloneInto(to){const{blockLen,suffix,outputLen,rounds,enableXOF}=this;to||(to=new Keccak(blockLen,suffix,outputLen,enableXOF,rounds));to.state32.set(this.state32);to.pos=this.pos;to.posOut=this.posOut;to.finished=this.finished;to.rounds=rounds;to.suffix=suffix;to.outputLen=outputLen;to.enableXOF=enableXOF;to.destroyed=this.destroyed;return to}}const gen=(suffix,blockLen,outputLen)=>wrapConstructor(()=>new Keccak(blockLen,suffix,outputLen));const keccak_256=gen(1,136,256/8);let locked$3=false;const _keccak256=function(data){return keccak_256(data)};let __keccak256=_keccak256;function keccak256(_data){const data=getBytes(_data,"data");return hexlify(__keccak256(data))}keccak256._=_keccak256;keccak256.lock=function(){locked$3=true};keccak256.register=function(func){if(locked$3){throw new TypeError("keccak256 is locked")}__keccak256=func};Object.freeze(keccak256);const Rho=new Uint8Array([7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8]);const Id=Uint8Array.from({length:16},(_,i)=>i);const Pi=Id.map(i=>(9*i+5)%16);let idxL=[Id];let idxR=[Pi];for(let i=0;i<4;i++)for(let j of[idxL,idxR])j.push(j[i].map(k=>Rho[k]));const shifts=[[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8],[12,13,11,15,6,9,9,7,12,15,11,13,7,8,7,7],[13,15,14,11,7,7,6,8,13,14,13,12,5,5,6,9],[14,11,12,14,8,6,5,5,15,12,15,14,9,9,8,6],[15,12,13,13,9,5,8,6,14,11,12,11,8,6,5,5]].map(i=>new Uint8Array(i));const shiftsL=idxL.map((idx,i)=>idx.map(j=>shifts[i][j]));const shiftsR=idxR.map((idx,i)=>idx.map(j=>shifts[i][j]));const Kl=new Uint32Array([0,1518500249,1859775393,2400959708,2840853838]);const Kr=new Uint32Array([1352829926,1548603684,1836072691,2053994217,0]);const rotl$1=(word,shift)=>word<>>32-shift;function f(group,x,y,z){if(group===0)return x^y^z;else if(group===1)return x&y|~x&z;else if(group===2)return(x|~y)^z;else if(group===3)return x&z|y&~z;else return x^(y|~z)}const BUF=new Uint32Array(16);class RIPEMD160 extends SHA2{constructor(){super(64,20,8,true);this.h0=1732584193|0;this.h1=4023233417|0;this.h2=2562383102|0;this.h3=271733878|0;this.h4=3285377520|0}get(){const{h0,h1,h2,h3,h4}=this;return[h0,h1,h2,h3,h4]}set(h0,h1,h2,h3,h4){this.h0=h0|0;this.h1=h1|0;this.h2=h2|0;this.h3=h3|0;this.h4=h4|0}process(view,offset){for(let i=0;i<16;i++,offset+=4)BUF[i]=view.getUint32(offset,true);let al=this.h0|0,ar=al,bl=this.h1|0,br=bl,cl=this.h2|0,cr=cl,dl=this.h3|0,dr=dl,el=this.h4|0,er=el;for(let group=0;group<5;group++){const rGroup=4-group;const hbl=Kl[group],hbr=Kr[group];const rl=idxL[group],rr=idxR[group];const sl=shiftsL[group],sr=shiftsR[group];for(let i=0;i<16;i++){const tl=rotl$1(al+f(group,bl,cl,dl)+BUF[rl[i]]+hbl,sl[i])+el|0;al=el,el=dl,dl=rotl$1(cl,10)|0,cl=bl,bl=tl}for(let i=0;i<16;i++){const tr=rotl$1(ar+f(rGroup,br,cr,dr)+BUF[rr[i]]+hbr,sr[i])+er|0;ar=er,er=dr,dr=rotl$1(cr,10)|0,cr=br,br=tr}}this.set(this.h1+cl+dr|0,this.h2+dl+er|0,this.h3+el+ar|0,this.h4+al+br|0,this.h0+bl+cr|0)}roundClean(){BUF.fill(0)}destroy(){this.destroyed=true;this.buffer.fill(0);this.set(0,0,0,0,0)}}const ripemd160$1=wrapConstructor(()=>new RIPEMD160);let locked$2=false;const _ripemd160=function(data){return ripemd160$1(data)};let __ripemd160=_ripemd160;function ripemd160(_data){const data=getBytes(_data,"data");return hexlify(__ripemd160(data))}ripemd160._=_ripemd160;ripemd160.lock=function(){locked$2=true};ripemd160.register=function(func){if(locked$2){throw new TypeError("ripemd160 is locked")}__ripemd160=func};Object.freeze(ripemd160);let locked$1=false;const _pbkdf2=function(password,salt,iterations,keylen,algo){return pbkdf2Sync(password,salt,iterations,keylen,algo)};let __pbkdf2=_pbkdf2;function pbkdf2(_password,_salt,iterations,keylen,algo){const password=getBytes(_password,"password");const salt=getBytes(_salt,"salt");return hexlify(__pbkdf2(password,salt,iterations,keylen,algo))}pbkdf2._=_pbkdf2;pbkdf2.lock=function(){locked$1=true};pbkdf2.register=function(func){if(locked$1){throw new Error("pbkdf2 is locked")}__pbkdf2=func};Object.freeze(pbkdf2);let locked=false;const _randomBytes=function(length){return new Uint8Array(randomBytes$1(length))};let __randomBytes=_randomBytes;function randomBytes(length){return __randomBytes(length)}randomBytes._=_randomBytes;randomBytes.lock=function(){locked=true};randomBytes.register=function(func){if(locked){throw new Error("randomBytes is locked")}__randomBytes=func};Object.freeze(randomBytes);const rotl=(a,b)=>a<>>32-b;function XorAndSalsa(prev,pi,input,ii,out,oi){let y00=prev[pi++]^input[ii++],y01=prev[pi++]^input[ii++];let y02=prev[pi++]^input[ii++],y03=prev[pi++]^input[ii++];let y04=prev[pi++]^input[ii++],y05=prev[pi++]^input[ii++];let y06=prev[pi++]^input[ii++],y07=prev[pi++]^input[ii++];let y08=prev[pi++]^input[ii++],y09=prev[pi++]^input[ii++];let y10=prev[pi++]^input[ii++],y11=prev[pi++]^input[ii++];let y12=prev[pi++]^input[ii++],y13=prev[pi++]^input[ii++];let y14=prev[pi++]^input[ii++],y15=prev[pi++]^input[ii++];let x00=y00,x01=y01,x02=y02,x03=y03,x04=y04,x05=y05,x06=y06,x07=y07,x08=y08,x09=y09,x10=y10,x11=y11,x12=y12,x13=y13,x14=y14,x15=y15;for(let i=0;i<8;i+=2){x04^=rotl(x00+x12|0,7);x08^=rotl(x04+x00|0,9);x12^=rotl(x08+x04|0,13);x00^=rotl(x12+x08|0,18);x09^=rotl(x05+x01|0,7);x13^=rotl(x09+x05|0,9);x01^=rotl(x13+x09|0,13);x05^=rotl(x01+x13|0,18);x14^=rotl(x10+x06|0,7);x02^=rotl(x14+x10|0,9);x06^=rotl(x02+x14|0,13);x10^=rotl(x06+x02|0,18);x03^=rotl(x15+x11|0,7);x07^=rotl(x03+x15|0,9);x11^=rotl(x07+x03|0,13);x15^=rotl(x11+x07|0,18);x01^=rotl(x00+x03|0,7);x02^=rotl(x01+x00|0,9);x03^=rotl(x02+x01|0,13);x00^=rotl(x03+x02|0,18);x06^=rotl(x05+x04|0,7);x07^=rotl(x06+x05|0,9);x04^=rotl(x07+x06|0,13);x05^=rotl(x04+x07|0,18);x11^=rotl(x10+x09|0,7);x08^=rotl(x11+x10|0,9);x09^=rotl(x08+x11|0,13);x10^=rotl(x09+x08|0,18);x12^=rotl(x15+x14|0,7);x13^=rotl(x12+x15|0,9);x14^=rotl(x13+x12|0,13);x15^=rotl(x14+x13|0,18)}out[oi++]=y00+x00|0;out[oi++]=y01+x01|0;out[oi++]=y02+x02|0;out[oi++]=y03+x03|0;out[oi++]=y04+x04|0;out[oi++]=y05+x05|0;out[oi++]=y06+x06|0;out[oi++]=y07+x07|0;out[oi++]=y08+x08|0;out[oi++]=y09+x09|0;out[oi++]=y10+x10|0;out[oi++]=y11+x11|0;out[oi++]=y12+x12|0;out[oi++]=y13+x13|0;out[oi++]=y14+x14|0;out[oi++]=y15+x15|0}function BlockMix(input,ii,out,oi,r){let head=oi+0;let tail=oi+16*r;for(let i=0;i<16;i++)out[tail+i]=input[ii+(2*r-1)*16+i];for(let i=0;i0)tail+=16;XorAndSalsa(out,head,input,ii+=16,out,tail)}}function scryptInit(password,salt,_opts){const opts=checkOpts({dkLen:32,asyncTick:10,maxmem:1024**3+1024},_opts);const{N,r,p,dkLen,asyncTick,maxmem,onProgress}=opts;number(N);number(r);number(p);number(dkLen);number(asyncTick);number(maxmem);if(onProgress!==undefined&&typeof onProgress!=="function")throw new Error("progressCb should be function");const blockSize=128*r;const blockSize32=blockSize/4;if(N<=1||(N&N-1)!==0||N>=2**(blockSize/8)||N>2**32){throw new Error("Scrypt: N must be larger than 1, a power of 2, less than 2^(128 * r / 8) and less than 2^32")}if(p<0||p>(2**32-1)*32/blockSize){throw new Error("Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)")}if(dkLen<0||dkLen>(2**32-1)*32){throw new Error("Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32")}const memUsed=blockSize*(N+p);if(memUsed>maxmem){throw new Error(`Scrypt: parameters too large, ${memUsed} (128 * r * (N + p)) > ${maxmem} (maxmem)`)}const B=pbkdf2$1(sha256$1,password,salt,{c:1,dkLen:blockSize*p});const B32=u32(B);const V=u32(new Uint8Array(blockSize*N));const tmp=u32(new Uint8Array(blockSize));let blockMixCb=()=>{};if(onProgress){const totalBlockMix=2*N*p;const callbackPer=Math.max(Math.floor(totalBlockMix/1e4),1);let blockMixCnt=0;blockMixCb=()=>{blockMixCnt++;if(onProgress&&(!(blockMixCnt%callbackPer)||blockMixCnt===totalBlockMix))onProgress(blockMixCnt/totalBlockMix)}}return{N:N,r:r,p:p,dkLen:dkLen,blockSize32:blockSize32,V:V,B32:B32,B:B,tmp:tmp,blockMixCb:blockMixCb,asyncTick:asyncTick}}function scryptOutput(password,dkLen,B,V,tmp){const res=pbkdf2$1(sha256$1,password,B,{c:1,dkLen:dkLen});B.fill(0);V.fill(0);tmp.fill(0);return res}function scrypt$1(password,salt,opts){const{N,r,p,dkLen,blockSize32,V,B32,B,tmp,blockMixCb}=scryptInit(password,salt,opts);for(let pi=0;pi{BlockMix(V,pos,V,pos+=blockSize32,r);blockMixCb()});BlockMix(V,(N-1)*blockSize32,B32,Pi,r);blockMixCb();await asyncLoop(N,asyncTick,()=>{const j=B32[Pi+blockSize32-16]%N;for(let k=0;ka instanceof Uint8Array;const hexes=Array.from({length:256},(_,i)=>i.toString(16).padStart(2,"0"));function bytesToHex(bytes){if(!u8a(bytes))throw new Error("Uint8Array expected");let hex="";for(let i=0;isum+a.length,0));let pad=0;arrays.forEach(a=>{if(!u8a(a))throw new Error("Uint8Array expected");r.set(a,pad);pad+=a.length});return r}function equalBytes(b1,b2){if(b1.length!==b2.length)return false;for(let i=0;i_0n$3;n>>=_1n$4,len+=1);return len}function bitGet(n,pos){return n>>BigInt(pos)&_1n$4}const bitSet=(n,pos,value)=>{return n|(value?_1n$4:_0n$3)<(_2n$2<new Uint8Array(data);const u8fr=arr=>Uint8Array.from(arr);function createHmacDrbg(hashLen,qByteLen,hmacFn){if(typeof hashLen!=="number"||hashLen<2)throw new Error("hashLen must be a number");if(typeof qByteLen!=="number"||qByteLen<2)throw new Error("qByteLen must be a number");if(typeof hmacFn!=="function")throw new Error("hmacFn must be a function");let v=u8n(hashLen);let k=u8n(hashLen);let i=0;const reset=()=>{v.fill(1);k.fill(0);i=0};const h=(...b)=>hmacFn(k,v,...b);const reseed=(seed=u8n())=>{k=h(u8fr([0]),seed);v=h();if(seed.length===0)return;k=h(u8fr([1]),seed);v=h()};const gen=()=>{if(i++>=1e3)throw new Error("drbg: tried 1000 values");let len=0;const out=[];while(len{reset();reseed(seed);let res=undefined;while(!(res=pred(gen())))reseed();reset();return res};return genUntil}const validatorFns={bigint:val=>typeof val==="bigint",function:val=>typeof val==="function",boolean:val=>typeof val==="boolean",string:val=>typeof val==="string",stringOrUint8Array:val=>typeof val==="string"||val instanceof Uint8Array,isSafeInteger:val=>Number.isSafeInteger(val),array:val=>Array.isArray(val),field:(val,object)=>object.Fp.isValid(val),hash:val=>typeof val==="function"&&Number.isSafeInteger(val.outputLen)};function validateObject(object,validators,optValidators={}){const checkField=(fieldName,type,isOptional)=>{const checkVal=validatorFns[type];if(typeof checkVal!=="function")throw new Error(`Invalid validator "${type}", expected function`);const val=object[fieldName];if(isOptional&&val===undefined)return;if(!checkVal(val,object)){throw new Error(`Invalid param ${String(fieldName)}=${val} (${typeof val}), expected ${type}`)}};for(const[fieldName,type]of Object.entries(validators))checkField(fieldName,type,false);for(const[fieldName,type]of Object.entries(optValidators))checkField(fieldName,type,true);return object}var ut=Object.freeze({__proto__:null,bitGet:bitGet,bitLen:bitLen,bitMask:bitMask,bitSet:bitSet,bytesToHex:bytesToHex,bytesToNumberBE:bytesToNumberBE,bytesToNumberLE:bytesToNumberLE,concatBytes:concatBytes,createHmacDrbg:createHmacDrbg,ensureBytes:ensureBytes,equalBytes:equalBytes,hexToBytes:hexToBytes,hexToNumber:hexToNumber,numberToBytesBE:numberToBytesBE,numberToBytesLE:numberToBytesLE,numberToHexUnpadded:numberToHexUnpadded,numberToVarBytesBE:numberToVarBytesBE,utf8ToBytes:utf8ToBytes,validateObject:validateObject});const _0n$2=BigInt(0),_1n$3=BigInt(1),_2n$1=BigInt(2),_3n$1=BigInt(3);const _4n=BigInt(4),_5n=BigInt(5),_8n=BigInt(8);BigInt(9);BigInt(16);function mod(a,b){const result=a%b;return result>=_0n$2?result:b+result}function pow(num,power,modulo){if(modulo<=_0n$2||power<_0n$2)throw new Error("Expected power/modulo > 0");if(modulo===_1n$3)return _0n$2;let res=_1n$3;while(power>_0n$2){if(power&_1n$3)res=res*num%modulo;num=num*num%modulo;power>>=_1n$3}return res}function pow2(x,power,modulo){let res=x;while(power-- >_0n$2){res*=res;res%=modulo}return res}function invert(number,modulo){if(number===_0n$2||modulo<=_0n$2){throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`)}let a=mod(number,modulo);let b=modulo;let x=_0n$2,u=_1n$3;while(a!==_0n$2){const q=b/a;const r=b%a;const m=x-u*q;b=a,a=r,x=u,u=m}const gcd=b;if(gcd!==_1n$3)throw new Error("invert: does not exist");return mod(x,modulo)}function tonelliShanks(P){const legendreC=(P-_1n$3)/_2n$1;let Q,S,Z;for(Q=P-_1n$3,S=0;Q%_2n$1===_0n$2;Q/=_2n$1,S++);for(Z=_2n$1;Z{map[val]="function";return map},initial);return validateObject(field,opts)}function FpPow(f,num,power){if(power<_0n$2)throw new Error("Expected power > 0");if(power===_0n$2)return f.ONE;if(power===_1n$3)return num;let p=f.ONE;let d=num;while(power>_0n$2){if(power&_1n$3)p=f.mul(p,d);d=f.sqr(d);power>>=_1n$3}return p}function FpInvertBatch(f,nums){const tmp=new Array(nums.length);const lastMultiplied=nums.reduce((acc,num,i)=>{if(f.is0(num))return acc;tmp[i]=acc;return f.mul(acc,num)},f.ONE);const inverted=f.inv(lastMultiplied);nums.reduceRight((acc,num,i)=>{if(f.is0(num))return acc;tmp[i]=f.mul(acc,tmp[i]);return f.mul(acc,num)},inverted);return tmp}function nLength(n,nBitLength){const _nBitLength=nBitLength!==undefined?nBitLength:n.toString(2).length;const nByteLength=Math.ceil(_nBitLength/8);return{nBitLength:_nBitLength,nByteLength:nByteLength}}function Field(ORDER,bitLen,isLE=false,redef={}){if(ORDER<=_0n$2)throw new Error(`Expected Field ORDER > 0, got ${ORDER}`);const{nBitLength:BITS,nByteLength:BYTES}=nLength(ORDER,bitLen);if(BYTES>2048)throw new Error("Field lengths over 2048 bytes are not supported");const sqrtP=FpSqrt(ORDER);const f=Object.freeze({ORDER:ORDER,BITS:BITS,BYTES:BYTES,MASK:bitMask(BITS),ZERO:_0n$2,ONE:_1n$3,create:num=>mod(num,ORDER),isValid:num=>{if(typeof num!=="bigint")throw new Error(`Invalid field element: expected bigint, got ${typeof num}`);return _0n$2<=num&&numnum===_0n$2,isOdd:num=>(num&_1n$3)===_1n$3,neg:num=>mod(-num,ORDER),eql:(lhs,rhs)=>lhs===rhs,sqr:num=>mod(num*num,ORDER),add:(lhs,rhs)=>mod(lhs+rhs,ORDER),sub:(lhs,rhs)=>mod(lhs-rhs,ORDER),mul:(lhs,rhs)=>mod(lhs*rhs,ORDER),pow:(num,power)=>FpPow(f,num,power),div:(lhs,rhs)=>mod(lhs*invert(rhs,ORDER),ORDER),sqrN:num=>num*num,addN:(lhs,rhs)=>lhs+rhs,subN:(lhs,rhs)=>lhs-rhs,mulN:(lhs,rhs)=>lhs*rhs,inv:num=>invert(num,ORDER),sqrt:redef.sqrt||(n=>sqrtP(f,n)),invertBatch:lst=>FpInvertBatch(f,lst),cmov:(a,b,c)=>c?b:a,toBytes:num=>isLE?numberToBytesLE(num,BYTES):numberToBytesBE(num,BYTES),fromBytes:bytes=>{if(bytes.length!==BYTES)throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`);return isLE?bytesToNumberLE(bytes):bytesToNumberBE(bytes)}});return Object.freeze(f)}function getFieldBytesLength(fieldOrder){if(typeof fieldOrder!=="bigint")throw new Error("field order must be bigint");const bitLength=fieldOrder.toString(2).length;return Math.ceil(bitLength/8)}function getMinHashLength(fieldOrder){const length=getFieldBytesLength(fieldOrder);return length+Math.ceil(length/2)}function mapHashToField(key,fieldOrder,isLE=false){const len=key.length;const fieldLen=getFieldBytesLength(fieldOrder);const minLen=getMinHashLength(fieldOrder);if(len<16||len1024)throw new Error(`expected ${minLen}-1024 bytes of input, got ${len}`);const num=isLE?bytesToNumberBE(key):bytesToNumberLE(key);const reduced=mod(num,fieldOrder-_1n$3)+_1n$3;return isLE?numberToBytesLE(reduced,fieldLen):numberToBytesBE(reduced,fieldLen)}const _0n$1=BigInt(0);const _1n$2=BigInt(1);function wNAF(c,bits){const constTimeNegate=(condition,item)=>{const neg=item.negate();return condition?neg:item};const opts=W=>{const windows=Math.ceil(bits/W)+1;const windowSize=2**(W-1);return{windows:windows,windowSize:windowSize}};return{constTimeNegate:constTimeNegate,unsafeLadder(elm,n){let p=c.ZERO;let d=elm;while(n>_0n$1){if(n&_1n$2)p=p.add(d);d=d.double();n>>=_1n$2}return p},precomputeWindow(elm,W){const{windows,windowSize}=opts(W);const points=[];let p=elm;let base=p;for(let window=0;window>=shiftBy;if(wbits>windowSize){wbits-=maxNumber;n+=_1n$2}const offset1=offset;const offset2=offset+Math.abs(wbits)-1;const cond1=window%2!==0;const cond2=wbits<0;if(wbits===0){f=f.add(constTimeNegate(cond1,precomputes[offset1]))}else{p=p.add(constTimeNegate(cond2,precomputes[offset2]))}}return{p:p,f:f}},wNAFCached(P,precomputesMap,n,transform){const W=P._WINDOW_SIZE||1;let comp=precomputesMap.get(P);if(!comp){comp=this.precomputeWindow(P,W);if(W!==1){precomputesMap.set(P,transform(comp))}}return this.wNAF(W,comp,n)}}}function validateBasic(curve){validateField(curve.Fp);validateObject(curve,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"});return Object.freeze({...nLength(curve.n,curve.nBitLength),...curve,...{p:curve.Fp.ORDER}})}function validatePointOpts(curve){const opts=validateBasic(curve);validateObject(opts,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo,Fp,a}=opts;if(endo){if(!Fp.eql(a,Fp.ZERO)){throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0")}if(typeof endo!=="object"||typeof endo.beta!=="bigint"||typeof endo.splitScalar!=="function"){throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}}return Object.freeze({...opts})}const{bytesToNumberBE:b2n,hexToBytes:h2b}=ut;const DER={Err:class DERErr extends Error{constructor(m=""){super(m)}},_parseInt(data){const{Err:E}=DER;if(data.length<2||data[0]!==2)throw new E("Invalid signature integer tag");const len=data[1];const res=data.subarray(2,len+2);if(!len||res.length!==len)throw new E("Invalid signature integer: wrong length");if(res[0]&128)throw new E("Invalid signature integer: negative");if(res[0]===0&&!(res[1]&128))throw new E("Invalid signature integer: unnecessary leading zero");return{d:b2n(res),l:data.subarray(len+2)}},toSig(hex){const{Err:E}=DER;const data=typeof hex==="string"?h2b(hex):hex;if(!(data instanceof Uint8Array))throw new Error("ui8a expected");let l=data.length;if(l<2||data[0]!=48)throw new E("Invalid signature tag");if(data[1]!==l-2)throw new E("Invalid signature: incorrect length");const{d:r,l:sBytes}=DER._parseInt(data.subarray(2));const{d:s,l:rBytesLeft}=DER._parseInt(sBytes);if(rBytesLeft.length)throw new E("Invalid signature: left bytes after parsing");return{r:r,s:s}},hexFromSig(sig){const slice=s=>Number.parseInt(s[0],16)&8?"00"+s:s;const h=num=>{const hex=num.toString(16);return hex.length&1?`0${hex}`:hex};const s=slice(h(sig.s));const r=slice(h(sig.r));const shl=s.length/2;const rhl=r.length/2;const sl=h(shl);const rl=h(rhl);return`30${h(rhl+shl+4)}02${rl}${r}02${sl}${s}`}};const _0n=BigInt(0),_1n$1=BigInt(1);BigInt(2);const _3n=BigInt(3);BigInt(4);function weierstrassPoints(opts){const CURVE=validatePointOpts(opts);const{Fp}=CURVE;const toBytes=CURVE.toBytes||((_c,point,_isCompressed)=>{const a=point.toAffine();return concatBytes(Uint8Array.from([4]),Fp.toBytes(a.x),Fp.toBytes(a.y))});const fromBytes=CURVE.fromBytes||(bytes=>{const tail=bytes.subarray(1);const x=Fp.fromBytes(tail.subarray(0,Fp.BYTES));const y=Fp.fromBytes(tail.subarray(Fp.BYTES,2*Fp.BYTES));return{x:x,y:y}});function weierstrassEquation(x){const{a,b}=CURVE;const x2=Fp.sqr(x);const x3=Fp.mul(x2,x);return Fp.add(Fp.add(x3,Fp.mul(x,a)),b)}if(!Fp.eql(Fp.sqr(CURVE.Gy),weierstrassEquation(CURVE.Gx)))throw new Error("bad generator point: equation left != right");function isWithinCurveOrder(num){return typeof num==="bigint"&&_0nFp.eql(i,Fp.ZERO);if(is0(x)&&is0(y))return Point.ZERO;return new Point(x,y,Fp.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(points){const toInv=Fp.invertBatch(points.map(p=>p.pz));return points.map((p,i)=>p.toAffine(toInv[i])).map(Point.fromAffine)}static fromHex(hex){const P=Point.fromAffine(fromBytes(ensureBytes("pointHex",hex)));P.assertValidity();return P}static fromPrivateKey(privateKey){return Point.BASE.multiply(normPrivateKeyToScalar(privateKey))}_setWindowSize(windowSize){this._WINDOW_SIZE=windowSize;pointPrecomputes.delete(this)}assertValidity(){if(this.is0()){if(CURVE.allowInfinityPoint&&!Fp.is0(this.py))return;throw new Error("bad point: ZERO")}const{x,y}=this.toAffine();if(!Fp.isValid(x)||!Fp.isValid(y))throw new Error("bad point: x or y not FE");const left=Fp.sqr(y);const right=weierstrassEquation(x);if(!Fp.eql(left,right))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y}=this.toAffine();if(Fp.isOdd)return!Fp.isOdd(y);throw new Error("Field doesn't support isOdd")}equals(other){assertPrjPoint(other);const{px:X1,py:Y1,pz:Z1}=this;const{px:X2,py:Y2,pz:Z2}=other;const U1=Fp.eql(Fp.mul(X1,Z2),Fp.mul(X2,Z1));const U2=Fp.eql(Fp.mul(Y1,Z2),Fp.mul(Y2,Z1));return U1&&U2}negate(){return new Point(this.px,Fp.neg(this.py),this.pz)}double(){const{a,b}=CURVE;const b3=Fp.mul(b,_3n);const{px:X1,py:Y1,pz:Z1}=this;let X3=Fp.ZERO,Y3=Fp.ZERO,Z3=Fp.ZERO;let t0=Fp.mul(X1,X1);let t1=Fp.mul(Y1,Y1);let t2=Fp.mul(Z1,Z1);let t3=Fp.mul(X1,Y1);t3=Fp.add(t3,t3);Z3=Fp.mul(X1,Z1);Z3=Fp.add(Z3,Z3);X3=Fp.mul(a,Z3);Y3=Fp.mul(b3,t2);Y3=Fp.add(X3,Y3);X3=Fp.sub(t1,Y3);Y3=Fp.add(t1,Y3);Y3=Fp.mul(X3,Y3);X3=Fp.mul(t3,X3);Z3=Fp.mul(b3,Z3);t2=Fp.mul(a,t2);t3=Fp.sub(t0,t2);t3=Fp.mul(a,t3);t3=Fp.add(t3,Z3);Z3=Fp.add(t0,t0);t0=Fp.add(Z3,t0);t0=Fp.add(t0,t2);t0=Fp.mul(t0,t3);Y3=Fp.add(Y3,t0);t2=Fp.mul(Y1,Z1);t2=Fp.add(t2,t2);t0=Fp.mul(t2,t3);X3=Fp.sub(X3,t0);Z3=Fp.mul(t2,t1);Z3=Fp.add(Z3,Z3);Z3=Fp.add(Z3,Z3);return new Point(X3,Y3,Z3)}add(other){assertPrjPoint(other);const{px:X1,py:Y1,pz:Z1}=this;const{px:X2,py:Y2,pz:Z2}=other;let X3=Fp.ZERO,Y3=Fp.ZERO,Z3=Fp.ZERO;const a=CURVE.a;const b3=Fp.mul(CURVE.b,_3n);let t0=Fp.mul(X1,X2);let t1=Fp.mul(Y1,Y2);let t2=Fp.mul(Z1,Z2);let t3=Fp.add(X1,Y1);let t4=Fp.add(X2,Y2);t3=Fp.mul(t3,t4);t4=Fp.add(t0,t1);t3=Fp.sub(t3,t4);t4=Fp.add(X1,Z1);let t5=Fp.add(X2,Z2);t4=Fp.mul(t4,t5);t5=Fp.add(t0,t2);t4=Fp.sub(t4,t5);t5=Fp.add(Y1,Z1);X3=Fp.add(Y2,Z2);t5=Fp.mul(t5,X3);X3=Fp.add(t1,t2);t5=Fp.sub(t5,X3);Z3=Fp.mul(a,t4);X3=Fp.mul(b3,t2);Z3=Fp.add(X3,Z3);X3=Fp.sub(t1,Z3);Z3=Fp.add(t1,Z3);Y3=Fp.mul(X3,Z3);t1=Fp.add(t0,t0);t1=Fp.add(t1,t0);t2=Fp.mul(a,t2);t4=Fp.mul(b3,t4);t1=Fp.add(t1,t2);t2=Fp.sub(t0,t2);t2=Fp.mul(a,t2);t4=Fp.add(t4,t2);t0=Fp.mul(t1,t4);Y3=Fp.add(Y3,t0);t0=Fp.mul(t5,t4);X3=Fp.mul(t3,X3);X3=Fp.sub(X3,t0);t0=Fp.mul(t3,t1);Z3=Fp.mul(t5,Z3);Z3=Fp.add(Z3,t0);return new Point(X3,Y3,Z3)}subtract(other){return this.add(other.negate())}is0(){return this.equals(Point.ZERO)}wNAF(n){return wnaf.wNAFCached(this,pointPrecomputes,n,comp=>{const toInv=Fp.invertBatch(comp.map(p=>p.pz));return comp.map((p,i)=>p.toAffine(toInv[i])).map(Point.fromAffine)})}multiplyUnsafe(n){const I=Point.ZERO;if(n===_0n)return I;assertGE(n);if(n===_1n$1)return this;const{endo}=CURVE;if(!endo)return wnaf.unsafeLadder(this,n);let{k1neg,k1,k2neg,k2}=endo.splitScalar(n);let k1p=I;let k2p=I;let d=this;while(k1>_0n||k2>_0n){if(k1&_1n$1)k1p=k1p.add(d);if(k2&_1n$1)k2p=k2p.add(d);d=d.double();k1>>=_1n$1;k2>>=_1n$1}if(k1neg)k1p=k1p.negate();if(k2neg)k2p=k2p.negate();k2p=new Point(Fp.mul(k2p.px,endo.beta),k2p.py,k2p.pz);return k1p.add(k2p)}multiply(scalar){assertGE(scalar);let n=scalar;let point,fake;const{endo}=CURVE;if(endo){const{k1neg,k1,k2neg,k2}=endo.splitScalar(n);let{p:k1p,f:f1p}=this.wNAF(k1);let{p:k2p,f:f2p}=this.wNAF(k2);k1p=wnaf.constTimeNegate(k1neg,k1p);k2p=wnaf.constTimeNegate(k2neg,k2p);k2p=new Point(Fp.mul(k2p.px,endo.beta),k2p.py,k2p.pz);point=k1p.add(k2p);fake=f1p.add(f2p)}else{const{p,f}=this.wNAF(n);point=p;fake=f}return Point.normalizeZ([point,fake])[0]}multiplyAndAddUnsafe(Q,a,b){const G=Point.BASE;const mul=(P,a)=>a===_0n||a===_1n$1||!P.equals(G)?P.multiplyUnsafe(a):P.multiply(a);const sum=mul(this,a).add(mul(Q,b));return sum.is0()?undefined:sum}toAffine(iz){const{px:x,py:y,pz:z}=this;const is0=this.is0();if(iz==null)iz=is0?Fp.ONE:Fp.inv(z);const ax=Fp.mul(x,iz);const ay=Fp.mul(y,iz);const zz=Fp.mul(z,iz);if(is0)return{x:Fp.ZERO,y:Fp.ZERO};if(!Fp.eql(zz,Fp.ONE))throw new Error("invZ was invalid");return{x:ax,y:ay}}isTorsionFree(){const{h:cofactor,isTorsionFree}=CURVE;if(cofactor===_1n$1)return true;if(isTorsionFree)return isTorsionFree(Point,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:cofactor,clearCofactor}=CURVE;if(cofactor===_1n$1)return this;if(clearCofactor)return clearCofactor(Point,this);return this.multiplyUnsafe(CURVE.h)}toRawBytes(isCompressed=true){this.assertValidity();return toBytes(Point,this,isCompressed)}toHex(isCompressed=true){return bytesToHex(this.toRawBytes(isCompressed))}}Point.BASE=new Point(CURVE.Gx,CURVE.Gy,Fp.ONE);Point.ZERO=new Point(Fp.ZERO,Fp.ONE,Fp.ZERO);const _bits=CURVE.nBitLength;const wnaf=wNAF(Point,CURVE.endo?Math.ceil(_bits/2):_bits);return{CURVE:CURVE,ProjectivePoint:Point,normPrivateKeyToScalar:normPrivateKeyToScalar,weierstrassEquation:weierstrassEquation,isWithinCurveOrder:isWithinCurveOrder}}function validateOpts(curve){const opts=validateBasic(curve);validateObject(opts,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"});return Object.freeze({lowS:true,...opts})}function weierstrass(curveDef){const CURVE=validateOpts(curveDef);const{Fp,n:CURVE_ORDER}=CURVE;const compressedLen=Fp.BYTES+1;const uncompressedLen=2*Fp.BYTES+1;function isValidFieldElement(num){return _0nbytesToHex(numberToBytesBE(num,CURVE.nByteLength));function isBiggerThanHalfOrder(number){const HALF=CURVE_ORDER>>_1n$1;return number>HALF}function normalizeS(s){return isBiggerThanHalfOrder(s)?modN(-s):s}const slcNum=(b,from,to)=>bytesToNumberBE(b.slice(from,to));class Signature{constructor(r,s,recovery){this.r=r;this.s=s;this.recovery=recovery;this.assertValidity()}static fromCompact(hex){const l=CURVE.nByteLength;hex=ensureBytes("compactSignature",hex,l*2);return new Signature(slcNum(hex,0,l),slcNum(hex,l,2*l))}static fromDER(hex){const{r,s}=DER.toSig(ensureBytes("DER",hex));return new Signature(r,s)}assertValidity(){if(!isWithinCurveOrder(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!isWithinCurveOrder(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(recovery){return new Signature(this.r,this.s,recovery)}recoverPublicKey(msgHash){const{r,s,recovery:rec}=this;const h=bits2int_modN(ensureBytes("msgHash",msgHash));if(rec==null||![0,1,2,3].includes(rec))throw new Error("recovery id invalid");const radj=rec===2||rec===3?r+CURVE.n:r;if(radj>=Fp.ORDER)throw new Error("recovery id 2 or 3 invalid");const prefix=(rec&1)===0?"02":"03";const R=Point.fromHex(prefix+numToNByteStr(radj));const ir=invN(radj);const u1=modN(-h*ir);const u2=modN(s*ir);const Q=Point.BASE.multiplyAndAddUnsafe(R,u1,u2);if(!Q)throw new Error("point at infinify");Q.assertValidity();return Q}hasHighS(){return isBiggerThanHalfOrder(this.s)}normalizeS(){return this.hasHighS()?new Signature(this.r,modN(-this.s),this.recovery):this}toDERRawBytes(){return hexToBytes(this.toDERHex())}toDERHex(){return DER.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return hexToBytes(this.toCompactHex())}toCompactHex(){return numToNByteStr(this.r)+numToNByteStr(this.s)}}const utils={isValidPrivateKey(privateKey){try{normPrivateKeyToScalar(privateKey);return true}catch(error){return false}},normPrivateKeyToScalar:normPrivateKeyToScalar,randomPrivateKey:()=>{const length=getMinHashLength(CURVE.n);return mapHashToField(CURVE.randomBytes(length),CURVE.n)},precompute(windowSize=8,point=Point.BASE){point._setWindowSize(windowSize);point.multiply(BigInt(3));return point}};function getPublicKey(privateKey,isCompressed=true){return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed)}function isProbPub(item){const arr=item instanceof Uint8Array;const str=typeof item==="string";const len=(arr||str)&&item.length;if(arr)return len===compressedLen||len===uncompressedLen;if(str)return len===2*compressedLen||len===2*uncompressedLen;if(item instanceof Point)return true;return false}function getSharedSecret(privateA,publicB,isCompressed=true){if(isProbPub(privateA))throw new Error("first arg must be private key");if(!isProbPub(publicB))throw new Error("second arg must be public key");const b=Point.fromHex(publicB);return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed)}const bits2int=CURVE.bits2int||function(bytes){const num=bytesToNumberBE(bytes);const delta=bytes.length*8-CURVE.nBitLength;return delta>0?num>>BigInt(delta):num};const bits2int_modN=CURVE.bits2int_modN||function(bytes){return modN(bits2int(bytes))};const ORDER_MASK=bitMask(CURVE.nBitLength);function int2octets(num){if(typeof num!=="bigint")throw new Error("bigint expected");if(!(_0n<=num&&numk in opts))throw new Error("sign() legacy options not supported");const{hash,randomBytes}=CURVE;let{lowS,prehash,extraEntropy:ent}=opts;if(lowS==null)lowS=true;msgHash=ensureBytes("msgHash",msgHash);if(prehash)msgHash=ensureBytes("prehashed msgHash",hash(msgHash));const h1int=bits2int_modN(msgHash);const d=normPrivateKeyToScalar(privateKey);const seedArgs=[int2octets(d),int2octets(h1int)];if(ent!=null){const e=ent===true?randomBytes(Fp.BYTES):ent;seedArgs.push(ensureBytes("extraEntropy",e))}const seed=concatBytes(...seedArgs);const m=h1int;function k2sig(kBytes){const k=bits2int(kBytes);if(!isWithinCurveOrder(k))return;const ik=invN(k);const q=Point.BASE.multiply(k).toAffine();const r=modN(q.x);if(r===_0n)return;const s=modN(ik*modN(m+r*d));if(s===_0n)return;let recovery=(q.x===r?0:2)|Number(q.y&_1n$1);let normS=s;if(lowS&&isBiggerThanHalfOrder(s)){normS=normalizeS(s);recovery^=1}return new Signature(r,normS,recovery)}return{seed:seed,k2sig:k2sig}}const defaultSigOpts={lowS:CURVE.lowS,prehash:false};const defaultVerOpts={lowS:CURVE.lowS,prehash:false};function sign(msgHash,privKey,opts=defaultSigOpts){const{seed,k2sig}=prepSig(msgHash,privKey,opts);const C=CURVE;const drbg=createHmacDrbg(C.hash.outputLen,C.nByteLength,C.hmac);return drbg(seed,k2sig)}Point.BASE._setWindowSize(8);function verify(signature,msgHash,publicKey,opts=defaultVerOpts){const sg=signature;msgHash=ensureBytes("msgHash",msgHash);publicKey=ensureBytes("publicKey",publicKey);if("strict"in opts)throw new Error("options.strict was renamed to lowS");const{lowS,prehash}=opts;let _sig=undefined;let P;try{if(typeof sg==="string"||sg instanceof Uint8Array){try{_sig=Signature.fromDER(sg)}catch(derError){if(!(derError instanceof DER.Err))throw derError;_sig=Signature.fromCompact(sg)}}else if(typeof sg==="object"&&typeof sg.r==="bigint"&&typeof sg.s==="bigint"){const{r,s}=sg;_sig=new Signature(r,s)}else{throw new Error("PARSE")}P=Point.fromHex(publicKey)}catch(error){if(error.message==="PARSE")throw new Error(`signature must be Signature instance, Uint8Array or hex string`);return false}if(lowS&&_sig.hasHighS())return false;if(prehash)msgHash=CURVE.hash(msgHash);const{r,s}=_sig;const h=bits2int_modN(msgHash);const is=invN(s);const u1=modN(h*is);const u2=modN(r*is);const R=Point.BASE.multiplyAndAddUnsafe(P,u1,u2)?.toAffine();if(!R)return false;const v=modN(R.x);return v===r}return{CURVE:CURVE,getPublicKey:getPublicKey,getSharedSecret:getSharedSecret,sign:sign,verify:verify,ProjectivePoint:Point,Signature:Signature,utils:utils}}function getHash(hash){return{hash:hash,hmac:(key,...msgs)=>hmac(hash,key,concatBytes$1(...msgs)),randomBytes:randomBytes$2}}function createCurve(curveDef,defHash){const create=hash=>weierstrass({...curveDef,...getHash(hash)});return Object.freeze({...create(defHash),create:create})}const secp256k1P=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f");const secp256k1N=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141");const _1n=BigInt(1);const _2n=BigInt(2);const divNearest=(a,b)=>(a+b/_2n)/b;function sqrtMod(y){const P=secp256k1P;const _3n=BigInt(3),_6n=BigInt(6),_11n=BigInt(11),_22n=BigInt(22);const _23n=BigInt(23),_44n=BigInt(44),_88n=BigInt(88);const b2=y*y*y%P;const b3=b2*b2*y%P;const b6=pow2(b3,_3n,P)*b3%P;const b9=pow2(b6,_3n,P)*b3%P;const b11=pow2(b9,_2n,P)*b2%P;const b22=pow2(b11,_11n,P)*b11%P;const b44=pow2(b22,_22n,P)*b22%P;const b88=pow2(b44,_44n,P)*b44%P;const b176=pow2(b88,_88n,P)*b88%P;const b220=pow2(b176,_44n,P)*b44%P;const b223=pow2(b220,_3n,P)*b3%P;const t1=pow2(b223,_23n,P)*b22%P;const t2=pow2(t1,_6n,P)*b2%P;const root=pow2(t2,_2n,P);if(!Fp.eql(Fp.sqr(root),y))throw new Error("Cannot find square root");return root}const Fp=Field(secp256k1P,undefined,undefined,{sqrt:sqrtMod});const secp256k1=createCurve({a:BigInt(0),b:BigInt(7),Fp:Fp,n:secp256k1N,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:true,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:k=>{const n=secp256k1N;const a1=BigInt("0x3086d221a7d46bcde86c90e49284eb15");const b1=-_1n*BigInt("0xe4437ed6010e88286f547fa90abfe4c3");const a2=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8");const b2=a1;const POW_2_128=BigInt("0x100000000000000000000000000000000");const c1=divNearest(b2*k,n);const c2=divNearest(-b1*k,n);let k1=mod(k-c1*a1-c2*a2,n);let k2=mod(-c1*b1-c2*b2,n);const k1neg=k1>POW_2_128;const k2neg=k2>POW_2_128;if(k1neg)k1=n-k1;if(k2neg)k2=n-k2;if(k1>POW_2_128||k2>POW_2_128){throw new Error("splitScalar: Endomorphism failed, k="+k)}return{k1neg:k1neg,k1:k1,k2neg:k2neg,k2:k2}}}},sha256$1);BigInt(0);secp256k1.ProjectivePoint;const ZeroAddress="0x0000000000000000000000000000000000000000";const ZeroHash="0x0000000000000000000000000000000000000000000000000000000000000000";const N$1=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141");const WeiPerEther=BigInt("1000000000000000000");const MaxUint256=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const MinInt256=BigInt("0x8000000000000000000000000000000000000000000000000000000000000000")*BigInt(-1);const MaxInt256=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const EtherSymbol="Ξ";const MessagePrefix="Ethereum Signed Message:\n";const BN_0$7=BigInt(0);const BN_1$3=BigInt(1);const BN_2$3=BigInt(2);const BN_27$1=BigInt(27);const BN_28$1=BigInt(28);const BN_35$1=BigInt(35);const _guard$3={};function toUint256(value){return zeroPadValue(toBeArray(value),32)}class Signature{#r;#s;#v;#networkV;get r(){return this.#r}set r(value){assertArgument(dataLength(value)===32,"invalid r","value",value);this.#r=hexlify(value)}get s(){assertArgument(parseInt(this.#s.substring(0,3))<8,"non-canonical s; use ._s","s",this.#s);return this.#s}set s(_value){assertArgument(dataLength(_value)===32,"invalid s","value",_value);this.#s=hexlify(_value)}get _s(){return this.#s}isValid(){return parseInt(this.#s.substring(0,3))<8}get v(){return this.#v}set v(value){const v=getNumber(value,"value");assertArgument(v===27||v===28,"invalid v","v",value);this.#v=v}get networkV(){return this.#networkV}get legacyChainId(){const v=this.networkV;if(v==null){return null}return Signature.getChainId(v)}get yParity(){return this.v===27?0:1}get yParityAndS(){const yParityAndS=getBytes(this.s);if(this.yParity){yParityAndS[0]|=128}return hexlify(yParityAndS)}get compactSerialized(){return concat([this.r,this.yParityAndS])}get serialized(){return concat([this.r,this.s,this.yParity?"0x1c":"0x1b"])}constructor(guard,r,s,v){assertPrivate(guard,_guard$3,"Signature");this.#r=r;this.#s=s;this.#v=v;this.#networkV=null}[Symbol.for("nodejs.util.inspect.custom")](){return`Signature { r: "${this.r}", s: "${this._s}"${this.isValid()?"":', valid: "false"'}, yParity: ${this.yParity}, networkV: ${this.networkV} }`}clone(){const clone=new Signature(_guard$3,this.r,this._s,this.v);if(this.networkV){clone.#networkV=this.networkV}return clone}toJSON(){const networkV=this.networkV;return{_type:"signature",networkV:networkV!=null?networkV.toString():null,r:this.r,s:this._s,v:this.v}}static getChainId(v){const bv=getBigInt(v,"v");if(bv==BN_27$1||bv==BN_28$1){return BN_0$7}assertArgument(bv>=BN_35$1,"invalid EIP-155 v","v",v);return(bv-BN_35$1)/BN_2$3}static getChainIdV(chainId,v){return getBigInt(chainId)*BN_2$3+BigInt(35+v-27)}static getNormalizedV(v){const bv=getBigInt(v);if(bv===BN_0$7||bv===BN_27$1){return 27}if(bv===BN_1$3||bv===BN_28$1){return 28}assertArgument(bv>=BN_35$1,"invalid v","v",v);return bv&BN_1$3?27:28}static from(sig){function assertError(check,message){assertArgument(check,message,"signature",sig)}if(sig==null){return new Signature(_guard$3,ZeroHash,ZeroHash,27)}if(typeof sig==="string"){const bytes=getBytes(sig,"signature");if(bytes.length===64){const r=hexlify(bytes.slice(0,32));const s=bytes.slice(32,64);const v=s[0]&128?28:27;s[0]&=127;return new Signature(_guard$3,r,hexlify(s),v)}if(bytes.length===65){const r=hexlify(bytes.slice(0,32));const s=hexlify(bytes.slice(32,64));const v=Signature.getNormalizedV(bytes[64]);return new Signature(_guard$3,r,s,v)}assertError(false,"invalid raw signature length")}if(sig instanceof Signature){return sig.clone()}const _r=sig.r;assertError(_r!=null,"missing r");const r=toUint256(_r);const s=function(s,yParityAndS){if(s!=null){return toUint256(s)}if(yParityAndS!=null){assertError(isHexString(yParityAndS,32),"invalid yParityAndS");const bytes=getBytes(yParityAndS);bytes[0]&=127;return hexlify(bytes)}assertError(false,"missing s")}(sig.s,sig.yParityAndS);const{networkV,v}=function(_v,yParityAndS,yParity){if(_v!=null){const v=getBigInt(_v);return{networkV:v>=BN_35$1?v:undefined,v:Signature.getNormalizedV(v)}}if(yParityAndS!=null){assertError(isHexString(yParityAndS,32),"invalid yParityAndS");return{v:getBytes(yParityAndS)[0]&128?28:27}}if(yParity!=null){switch(getNumber(yParity,"sig.yParity")){case 0:return{v:27};case 1:return{v:28}}assertError(false,"invalid yParity")}assertError(false,"missing v")}(sig.v,sig.yParityAndS,sig.yParity);const result=new Signature(_guard$3,r,s,v);if(networkV){result.#networkV=networkV}assertError(sig.yParity==null||getNumber(sig.yParity,"sig.yParity")===result.yParity,"yParity mismatch");assertError(sig.yParityAndS==null||sig.yParityAndS===result.yParityAndS,"yParityAndS mismatch");return result}}class SigningKey{#privateKey;constructor(privateKey){assertArgument(dataLength(privateKey)===32,"invalid private key","privateKey","[REDACTED]");this.#privateKey=hexlify(privateKey)}get privateKey(){return this.#privateKey}get publicKey(){return SigningKey.computePublicKey(this.#privateKey)}get compressedPublicKey(){return SigningKey.computePublicKey(this.#privateKey,true)}sign(digest){assertArgument(dataLength(digest)===32,"invalid digest length","digest",digest);const sig=secp256k1.sign(getBytesCopy(digest),getBytesCopy(this.#privateKey),{lowS:true});return Signature.from({r:toBeHex(sig.r,32),s:toBeHex(sig.s,32),v:sig.recovery?28:27})}computeSharedSecret(other){const pubKey=SigningKey.computePublicKey(other);return hexlify(secp256k1.getSharedSecret(getBytesCopy(this.#privateKey),getBytes(pubKey),false))}static computePublicKey(key,compressed){let bytes=getBytes(key,"key");if(bytes.length===32){const pubKey=secp256k1.getPublicKey(bytes,!!compressed);return hexlify(pubKey)}if(bytes.length===64){const pub=new Uint8Array(65);pub[0]=4;pub.set(bytes,1);bytes=pub}const point=secp256k1.ProjectivePoint.fromHex(bytes);return hexlify(point.toRawBytes(compressed))}static recoverPublicKey(digest,signature){assertArgument(dataLength(digest)===32,"invalid digest length","digest",digest);const sig=Signature.from(signature);let secpSig=secp256k1.Signature.fromCompact(getBytesCopy(concat([sig.r,sig.s])));secpSig=secpSig.addRecoveryBit(sig.yParity);const pubKey=secpSig.recoverPublicKey(getBytesCopy(digest));assertArgument(pubKey!=null,"invalid signature for digest","signature",signature);return"0x"+pubKey.toHex(false)}static addPoints(p0,p1,compressed){const pub0=secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p0).substring(2));const pub1=secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p1).substring(2));return"0x"+pub0.add(pub1).toHex(!!compressed)}}function lock(){computeHmac.lock();keccak256.lock();pbkdf2.lock();randomBytes.lock();ripemd160.lock();scrypt.lock();scryptSync.lock();sha256.lock();sha512.lock();randomBytes.lock()}const BN_0$6=BigInt(0);const BN_36=BigInt(36);function getChecksumAddress(address){address=address.toLowerCase();const chars=address.substring(2).split("");const expanded=new Uint8Array(40);for(let i=0;i<40;i++){expanded[i]=chars[i].charCodeAt(0)}const hashed=getBytes(keccak256(expanded));for(let i=0;i<40;i+=2){if(hashed[i>>1]>>4>=8){chars[i]=chars[i].toUpperCase()}if((hashed[i>>1]&15)>=8){chars[i+1]=chars[i+1].toUpperCase()}}return"0x"+chars.join("")}const ibanLookup={};for(let i=0;i<10;i++){ibanLookup[String(i)]=String(i)}for(let i=0;i<26;i++){ibanLookup[String.fromCharCode(65+i)]=String(10+i)}const safeDigits=15;function ibanChecksum(address){address=address.toUpperCase();address=address.substring(4)+address.substring(0,2)+"00";let expanded=address.split("").map(c=>{return ibanLookup[c]}).join("");while(expanded.length>=safeDigits){let block=expanded.substring(0,safeDigits);expanded=parseInt(block,10)%97+expanded.substring(block.length)}let checksum=String(98-parseInt(expanded,10)%97);while(checksum.length<2){checksum="0"+checksum}return checksum}const Base36=function(){const result={};for(let i=0;i<36;i++){const key="0123456789abcdefghijklmnopqrstuvwxyz"[i];result[key]=BigInt(i)}return result}();function fromBase36(value){value=value.toLowerCase();let result=BN_0$6;for(let i=0;iv.format()).join(",")})`}return this.type}defaultValue(){return 0}minValue(){return 0}maxValue(){return 0}isBigInt(){return!!this.type.match(/^u?int[0-9]+$/)}isData(){return this.type.startsWith("bytes")}isString(){return this.type==="string"}get tupleName(){if(this.type!=="tuple"){throw TypeError("not a tuple")}return this.#options}get arrayLength(){if(this.type!=="array"){throw TypeError("not an array")}if(this.#options===true){return-1}if(this.#options===false){return this.value.length}return null}static from(type,value){return new Typed(_gaurd,type,value)}static uint8(v){return n(v,8)}static uint16(v){return n(v,16)}static uint24(v){return n(v,24)}static uint32(v){return n(v,32)}static uint40(v){return n(v,40)}static uint48(v){return n(v,48)}static uint56(v){return n(v,56)}static uint64(v){return n(v,64)}static uint72(v){return n(v,72)}static uint80(v){return n(v,80)}static uint88(v){return n(v,88)}static uint96(v){return n(v,96)}static uint104(v){return n(v,104)}static uint112(v){return n(v,112)}static uint120(v){return n(v,120)}static uint128(v){return n(v,128)}static uint136(v){return n(v,136)}static uint144(v){return n(v,144)}static uint152(v){return n(v,152)}static uint160(v){return n(v,160)}static uint168(v){return n(v,168)}static uint176(v){return n(v,176)}static uint184(v){return n(v,184)}static uint192(v){return n(v,192)}static uint200(v){return n(v,200)}static uint208(v){return n(v,208)}static uint216(v){return n(v,216)}static uint224(v){return n(v,224)}static uint232(v){return n(v,232)}static uint240(v){return n(v,240)}static uint248(v){return n(v,248)}static uint256(v){return n(v,256)}static uint(v){return n(v,256)}static int8(v){return n(v,-8)}static int16(v){return n(v,-16)}static int24(v){return n(v,-24)}static int32(v){return n(v,-32)}static int40(v){return n(v,-40)}static int48(v){return n(v,-48)}static int56(v){return n(v,-56)}static int64(v){return n(v,-64)}static int72(v){return n(v,-72)}static int80(v){return n(v,-80)}static int88(v){return n(v,-88)}static int96(v){return n(v,-96)}static int104(v){return n(v,-104)}static int112(v){return n(v,-112)}static int120(v){return n(v,-120)}static int128(v){return n(v,-128)}static int136(v){return n(v,-136)}static int144(v){return n(v,-144)}static int152(v){return n(v,-152)}static int160(v){return n(v,-160)}static int168(v){return n(v,-168)}static int176(v){return n(v,-176)}static int184(v){return n(v,-184)}static int192(v){return n(v,-192)}static int200(v){return n(v,-200)}static int208(v){return n(v,-208)}static int216(v){return n(v,-216)}static int224(v){return n(v,-224)}static int232(v){return n(v,-232)}static int240(v){return n(v,-240)}static int248(v){return n(v,-248)}static int256(v){return n(v,-256)}static int(v){return n(v,-256)}static bytes1(v){return b(v,1)}static bytes2(v){return b(v,2)}static bytes3(v){return b(v,3)}static bytes4(v){return b(v,4)}static bytes5(v){return b(v,5)}static bytes6(v){return b(v,6)}static bytes7(v){return b(v,7)}static bytes8(v){return b(v,8)}static bytes9(v){return b(v,9)}static bytes10(v){return b(v,10)}static bytes11(v){return b(v,11)}static bytes12(v){return b(v,12)}static bytes13(v){return b(v,13)}static bytes14(v){return b(v,14)}static bytes15(v){return b(v,15)}static bytes16(v){return b(v,16)}static bytes17(v){return b(v,17)}static bytes18(v){return b(v,18)}static bytes19(v){return b(v,19)}static bytes20(v){return b(v,20)}static bytes21(v){return b(v,21)}static bytes22(v){return b(v,22)}static bytes23(v){return b(v,23)}static bytes24(v){return b(v,24)}static bytes25(v){return b(v,25)}static bytes26(v){return b(v,26)}static bytes27(v){return b(v,27)}static bytes28(v){return b(v,28)}static bytes29(v){return b(v,29)}static bytes30(v){return b(v,30)}static bytes31(v){return b(v,31)}static bytes32(v){return b(v,32)}static address(v){return new Typed(_gaurd,"address",v)}static bool(v){return new Typed(_gaurd,"bool",!!v)}static bytes(v){return new Typed(_gaurd,"bytes",v)}static string(v){return new Typed(_gaurd,"string",v)}static array(v,dynamic){throw new Error("not implemented yet")}static tuple(v,name){throw new Error("not implemented yet")}static overrides(v){return new Typed(_gaurd,"overrides",Object.assign({},v))}static isTyped(value){return value&&typeof value==="object"&&"_typedSymbol"in value&&value._typedSymbol===_typedSymbol}static dereference(value,type){if(Typed.isTyped(value)){if(value.type!==type){throw new Error(`invalid type: expecetd ${type}, got ${value.type}`)}return value.value}return value}}class AddressCoder extends Coder{constructor(localName){super("address","address",localName,false)}defaultValue(){return"0x0000000000000000000000000000000000000000"}encode(writer,_value){let value=Typed.dereference(_value,"string");try{value=getAddress(value)}catch(error){return this._throwError(error.message,_value)}return writer.writeValue(value)}decode(reader){return getAddress(toBeHex(reader.readValue(),20))}}class AnonymousCoder extends Coder{coder;constructor(coder){super(coder.name,coder.type,"_",coder.dynamic);this.coder=coder}defaultValue(){return this.coder.defaultValue()}encode(writer,value){return this.coder.encode(writer,value)}decode(reader){return this.coder.decode(reader)}}function pack(writer,coders,values){let arrayValues=[];if(Array.isArray(values)){arrayValues=values}else if(values&&typeof values==="object"){let unique={};arrayValues=coders.map(coder=>{const name=coder.localName;assert(name,"cannot encode object for signature with missing names","INVALID_ARGUMENT",{argument:"values",info:{coder:coder},value:values});assert(!unique[name],"cannot encode object for signature with duplicate names","INVALID_ARGUMENT",{argument:"values",info:{coder:coder},value:values});unique[name]=true;return values[name]})}else{assertArgument(false,"invalid tuple value","tuple",values)}assertArgument(coders.length===arrayValues.length,"types/value length mismatch","tuple",values);let staticWriter=new Writer;let dynamicWriter=new Writer;let updateFuncs=[];coders.forEach((coder,index)=>{let value=arrayValues[index];if(coder.dynamic){let dynamicOffset=dynamicWriter.length;coder.encode(dynamicWriter,value);let updateFunc=staticWriter.writeUpdatableValue();updateFuncs.push(baseOffset=>{updateFunc(baseOffset+dynamicOffset)})}else{coder.encode(staticWriter,value)}});updateFuncs.forEach(func=>{func(staticWriter.length)});let length=writer.appendWriter(staticWriter);length+=writer.appendWriter(dynamicWriter);return length}function unpack(reader,coders){let values=[];let keys=[];let baseReader=reader.subReader(0);coders.forEach(coder=>{let value=null;if(coder.dynamic){let offset=reader.readIndex();let offsetReader=baseReader.subReader(offset);try{value=coder.decode(offsetReader)}catch(error){if(isError(error,"BUFFER_OVERRUN")){throw error}value=error;value.baseType=coder.name;value.name=coder.localName;value.type=coder.type}}else{try{value=coder.decode(reader)}catch(error){if(isError(error,"BUFFER_OVERRUN")){throw error}value=error;value.baseType=coder.name;value.name=coder.localName;value.type=coder.type}}if(value==undefined){throw new Error("investigate")}values.push(value);keys.push(coder.localName||null)});return Result.fromItems(values,keys)}class ArrayCoder extends Coder{coder;length;constructor(coder,length,localName){const type=coder.type+"["+(length>=0?length:"")+"]";const dynamic=length===-1||coder.dynamic;super("array",type,localName,dynamic);defineProperties(this,{coder:coder,length:length})}defaultValue(){const defaultChild=this.coder.defaultValue();const result=[];for(let i=0;ibounds||value<-(bounds+BN_1$2)){this._throwError("value out-of-bounds",_value)}value=toTwos(value,8*WordSize)}else if(valuemask(maxUintValue,this.size*8)){this._throwError("value out-of-bounds",_value)}return writer.writeValue(value)}decode(reader){let value=mask(reader.readValue(),this.size*8);if(this.signed){value=fromTwos(value,this.size*8)}return value}}class StringCoder extends DynamicBytesCoder{constructor(localName){super("string",localName)}defaultValue(){return""}encode(writer,_value){return super.encode(writer,toUtf8Bytes(Typed.dereference(_value,"string")))}decode(reader){return toUtf8String(super.decode(reader))}}class TupleCoder extends Coder{coders;constructor(coders,localName){let dynamic=false;const types=[];coders.forEach(coder=>{if(coder.dynamic){dynamic=true}types.push(coder.type)});const type="tuple("+types.join(",")+")";super("tuple",type,localName,dynamic);defineProperties(this,{coders:Object.freeze(coders.slice())})}defaultValue(){const values=[];this.coders.forEach(coder=>{values.push(coder.defaultValue())});const uniqueNames=this.coders.reduce((accum,coder)=>{const name=coder.localName;if(name){if(!accum[name]){accum[name]=0}accum[name]++}return accum},{});this.coders.forEach((coder,index)=>{let name=coder.localName;if(!name||uniqueNames[name]!==1){return}if(name==="length"){name="_length"}if(values[name]!=null){return}values[name]=values[index]});return Object.freeze(values)}encode(writer,_value){const value=Typed.dereference(_value,"tuple");return pack(writer,this.coders,value)}decode(reader){return unpack(reader,this.coders)}}function accessSetify(addr,storageKeys){return{address:getAddress(addr),storageKeys:storageKeys.map((storageKey,index)=>{assertArgument(isHexString(storageKey,32),"invalid slot",`storageKeys[${index}]`,storageKey);return storageKey.toLowerCase()})}}function accessListify(value){if(Array.isArray(value)){return value.map((set,index)=>{if(Array.isArray(set)){assertArgument(set.length===2,"invalid slot set",`value[${index}]`,set);return accessSetify(set[0],set[1])}assertArgument(set!=null&&typeof set==="object","invalid address-slot set","value",value);return accessSetify(set.address,set.storageKeys)})}assertArgument(value!=null&&typeof value==="object","invalid access list","value",value);const result=Object.keys(value).map(addr=>{const storageKeys=value[addr].reduce((accum,storageKey)=>{accum[storageKey]=true;return accum},{});return accessSetify(addr,Object.keys(storageKeys).sort())});result.sort((a,b)=>a.address.localeCompare(b.address));return result}function authorizationify(auth){return{address:getAddress(auth.address),nonce:getBigInt(auth.nonce!=null?auth.nonce:0),chainId:getBigInt(auth.chainId!=null?auth.chainId:0),signature:Signature.from(auth.signature)}}function computeAddress(key){let pubkey;if(typeof key==="string"){pubkey=SigningKey.computePublicKey(key,false)}else{pubkey=key.publicKey}return getAddress(keccak256("0x"+pubkey.substring(4)).substring(26))}function recoverAddress(digest,signature){return computeAddress(SigningKey.recoverPublicKey(digest,signature))}const BN_0$4=BigInt(0);const BN_2$2=BigInt(2);const BN_27=BigInt(27);const BN_28=BigInt(28);const BN_35=BigInt(35);const BN_MAX_UINT=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const BLOB_SIZE=4096*32;function getKzgLibrary(kzg){const blobToKzgCommitment=blob=>{if("computeBlobProof"in kzg){if("blobToKzgCommitment"in kzg&&typeof kzg.blobToKzgCommitment==="function"){return getBytes(kzg.blobToKzgCommitment(hexlify(blob)))}}else if("blobToKzgCommitment"in kzg&&typeof kzg.blobToKzgCommitment==="function"){return getBytes(kzg.blobToKzgCommitment(blob))}if("blobToKZGCommitment"in kzg&&typeof kzg.blobToKZGCommitment==="function"){return getBytes(kzg.blobToKZGCommitment(hexlify(blob)))}assertArgument(false,"unsupported KZG library","kzg",kzg)};const computeBlobKzgProof=(blob,commitment)=>{if("computeBlobProof"in kzg&&typeof kzg.computeBlobProof==="function"){return getBytes(kzg.computeBlobProof(hexlify(blob),hexlify(commitment)))}if("computeBlobKzgProof"in kzg&&typeof kzg.computeBlobKzgProof==="function"){return kzg.computeBlobKzgProof(blob,commitment)}if("computeBlobKZGProof"in kzg&&typeof kzg.computeBlobKZGProof==="function"){return getBytes(kzg.computeBlobKZGProof(hexlify(blob),hexlify(commitment)))}assertArgument(false,"unsupported KZG library","kzg",kzg)};return{blobToKzgCommitment:blobToKzgCommitment,computeBlobKzgProof:computeBlobKzgProof}}function getVersionedHash(version,hash){let versioned=version.toString(16);while(versioned.length<2){versioned="0"+versioned}versioned+=sha256(hash).substring(4);return"0x"+versioned}function handleAddress(value){if(value==="0x"){return null}return getAddress(value)}function handleAccessList(value,param){try{return accessListify(value)}catch(error){assertArgument(false,error.message,param,value)}}function handleAuthorizationList(value,param){try{if(!Array.isArray(value)){throw new Error("authorizationList: invalid array")}const result=[];for(let i=0;i[set.address,set.storageKeys])}function formatAuthorizationList(value){return value.map(a=>{return[formatNumber(a.chainId,"chainId"),a.address,formatNumber(a.nonce,"nonce"),formatNumber(a.signature.yParity,"yParity"),toBeArray(a.signature.r),toBeArray(a.signature.s)]})}function formatHashes(value,param){assertArgument(Array.isArray(value),`invalid ${param}`,"value",value);for(let i=0;ib.data),blobs.map(b=>b.commitment),blobs.map(b=>b.proof)])])}}return concat(["0x03",encodeRlp(fields)])}function _parseEip7702(data){const fields=decodeRlp(getBytes(data).slice(1));assertArgument(Array.isArray(fields)&&(fields.length===10||fields.length===13),"invalid field count for transaction type: 4","data",hexlify(data));const tx={type:4,chainId:handleUint(fields[0],"chainId"),nonce:handleNumber(fields[1],"nonce"),maxPriorityFeePerGas:handleUint(fields[2],"maxPriorityFeePerGas"),maxFeePerGas:handleUint(fields[3],"maxFeePerGas"),gasPrice:null,gasLimit:handleUint(fields[4],"gasLimit"),to:handleAddress(fields[5]),value:handleUint(fields[6],"value"),data:hexlify(fields[7]),accessList:handleAccessList(fields[8],"accessList"),authorizationList:handleAuthorizationList(fields[9],"authorizationList")};if(fields.length===10){return tx}_parseEipSignature(tx,fields.slice(10));return tx}function _serializeEip7702(tx,sig){const fields=[formatNumber(tx.chainId,"chainId"),formatNumber(tx.nonce,"nonce"),formatNumber(tx.maxPriorityFeePerGas||0,"maxPriorityFeePerGas"),formatNumber(tx.maxFeePerGas||0,"maxFeePerGas"),formatNumber(tx.gasLimit,"gasLimit"),tx.to||"0x",formatNumber(tx.value,"value"),tx.data,formatAccessList(tx.accessList||[]),formatAuthorizationList(tx.authorizationList||[])];if(sig){fields.push(formatNumber(sig.yParity,"yParity"));fields.push(toBeArray(sig.r));fields.push(toBeArray(sig.s))}return concat(["0x04",encodeRlp(fields)])}class Transaction{#type;#to;#data;#nonce;#gasLimit;#gasPrice;#maxPriorityFeePerGas;#maxFeePerGas;#value;#chainId;#sig;#accessList;#maxFeePerBlobGas;#blobVersionedHashes;#kzg;#blobs;#auths;get type(){return this.#type}set type(value){switch(value){case null:this.#type=null;break;case 0:case"legacy":this.#type=0;break;case 1:case"berlin":case"eip-2930":this.#type=1;break;case 2:case"london":case"eip-1559":this.#type=2;break;case 3:case"cancun":case"eip-4844":this.#type=3;break;case 4:case"pectra":case"eip-7702":this.#type=4;break;default:assertArgument(false,"unsupported transaction type","type",value)}}get typeName(){switch(this.type){case 0:return"legacy";case 1:return"eip-2930";case 2:return"eip-1559";case 3:return"eip-4844";case 4:return"eip-7702"}return null}get to(){const value=this.#to;if(value==null&&this.type===3){return ZeroAddress}return value}set to(value){this.#to=value==null?null:getAddress(value)}get nonce(){return this.#nonce}set nonce(value){this.#nonce=getNumber(value,"value")}get gasLimit(){return this.#gasLimit}set gasLimit(value){this.#gasLimit=getBigInt(value)}get gasPrice(){const value=this.#gasPrice;if(value==null&&(this.type===0||this.type===1)){return BN_0$4}return value}set gasPrice(value){this.#gasPrice=value==null?null:getBigInt(value,"gasPrice")}get maxPriorityFeePerGas(){const value=this.#maxPriorityFeePerGas;if(value==null){if(this.type===2||this.type===3){return BN_0$4}return null}return value}set maxPriorityFeePerGas(value){this.#maxPriorityFeePerGas=value==null?null:getBigInt(value,"maxPriorityFeePerGas")}get maxFeePerGas(){const value=this.#maxFeePerGas;if(value==null){if(this.type===2||this.type===3){return BN_0$4}return null}return value}set maxFeePerGas(value){this.#maxFeePerGas=value==null?null:getBigInt(value,"maxFeePerGas")}get data(){return this.#data}set data(value){this.#data=hexlify(value)}get value(){return this.#value}set value(value){this.#value=getBigInt(value,"value")}get chainId(){return this.#chainId}set chainId(value){this.#chainId=getBigInt(value)}get signature(){return this.#sig||null}set signature(value){this.#sig=value==null?null:Signature.from(value)}get accessList(){const value=this.#accessList||null;if(value==null){if(this.type===1||this.type===2||this.type===3){return[]}return null}return value}set accessList(value){this.#accessList=value==null?null:accessListify(value)}get authorizationList(){const value=this.#auths||null;if(value==null){if(this.type===4){return[]}}return value}set authorizationList(auths){this.#auths=auths==null?null:auths.map(a=>authorizationify(a))}get maxFeePerBlobGas(){const value=this.#maxFeePerBlobGas;if(value==null&&this.type===3){return BN_0$4}return value}set maxFeePerBlobGas(value){this.#maxFeePerBlobGas=value==null?null:getBigInt(value,"maxFeePerBlobGas")}get blobVersionedHashes(){let value=this.#blobVersionedHashes;if(value==null&&this.type===3){return[]}return value}set blobVersionedHashes(value){if(value!=null){assertArgument(Array.isArray(value),"blobVersionedHashes must be an Array","value",value);value=value.slice();for(let i=0;iObject.assign({},b))}set blobs(_blobs){if(_blobs==null){this.#blobs=null;return}const blobs=[];const versionedHashes=[];for(let i=0;i<_blobs.length;i++){const blob=_blobs[i];if(isBytesLike(blob)){assert(this.#kzg,"adding a raw blob requires a KZG library","UNSUPPORTED_OPERATION",{operation:"set blobs()"});let data=getBytes(blob);assertArgument(data.length<=BLOB_SIZE,"blob is too large",`blobs[${i}]`,blob);if(data.length!==BLOB_SIZE){const padded=new Uint8Array(BLOB_SIZE);padded.set(data);data=padded}const commit=this.#kzg.blobToKzgCommitment(data);const proof=hexlify(this.#kzg.computeBlobKzgProof(data,commit));blobs.push({data:hexlify(data),commitment:hexlify(commit),proof:proof});versionedHashes.push(getVersionedHash(1,commit))}else{const commit=hexlify(blob.commitment);blobs.push({data:hexlify(blob.data),commitment:commit,proof:hexlify(blob.proof)});versionedHashes.push(getVersionedHash(1,commit))}}this.#blobs=blobs;this.#blobVersionedHashes=versionedHashes}get kzg(){return this.#kzg}set kzg(kzg){if(kzg==null){this.#kzg=null}else{this.#kzg=getKzgLibrary(kzg)}}constructor(){this.#type=null;this.#to=null;this.#nonce=0;this.#gasLimit=BN_0$4;this.#gasPrice=null;this.#maxPriorityFeePerGas=null;this.#maxFeePerGas=null;this.#data="0x";this.#value=BN_0$4;this.#chainId=BN_0$4;this.#sig=null;this.#accessList=null;this.#maxFeePerBlobGas=null;this.#blobVersionedHashes=null;this.#kzg=null;this.#blobs=null;this.#auths=null}get hash(){if(this.signature==null){return null}return keccak256(this.#getSerialized(true,false))}get unsignedHash(){return keccak256(this.unsignedSerialized)}get from(){if(this.signature==null){return null}return recoverAddress(this.unsignedHash,this.signature)}get fromPublicKey(){if(this.signature==null){return null}return SigningKey.recoverPublicKey(this.unsignedHash,this.signature)}isSigned(){return this.signature!=null}#getSerialized(signed,sidecar){assert(!signed||this.signature!=null,"cannot serialize unsigned transaction; maybe you meant .unsignedSerialized","UNSUPPORTED_OPERATION",{operation:".serialized"});const sig=signed?this.signature:null;switch(this.inferType()){case 0:return _serializeLegacy(this,sig);case 1:return _serializeEip2930(this,sig);case 2:return _serializeEip1559(this,sig);case 3:return _serializeEip4844(this,sig,sidecar?this.blobs:null);case 4:return _serializeEip7702(this,sig)}assert(false,"unsupported transaction type","UNSUPPORTED_OPERATION",{operation:".serialized"})}get serialized(){return this.#getSerialized(true,true)}get unsignedSerialized(){return this.#getSerialized(false,false)}inferType(){const types=this.inferTypes();if(types.indexOf(2)>=0){return 2}return types.pop()}inferTypes(){const hasGasPrice=this.gasPrice!=null;const hasFee=this.maxFeePerGas!=null||this.maxPriorityFeePerGas!=null;const hasAccessList=this.accessList!=null;const hasBlob=this.#maxFeePerBlobGas!=null||this.#blobVersionedHashes;if(this.maxFeePerGas!=null&&this.maxPriorityFeePerGas!=null){assert(this.maxFeePerGas>=this.maxPriorityFeePerGas,"priorityFee cannot be more than maxFee","BAD_DATA",{value:this})}assert(!hasFee||this.type!==0&&this.type!==1,"transaction type cannot have maxFeePerGas or maxPriorityFeePerGas","BAD_DATA",{value:this});assert(this.type!==0||!hasAccessList,"legacy transaction cannot have accessList","BAD_DATA",{value:this});const types=[];if(this.type!=null){types.push(this.type)}else{if(this.authorizationList&&this.authorizationList.length){types.push(4)}else if(hasFee){types.push(2)}else if(hasGasPrice){types.push(1);if(!hasAccessList){types.push(0)}}else if(hasAccessList){types.push(1);types.push(2)}else if(hasBlob&&this.to){types.push(3)}else{types.push(0);types.push(1);types.push(2);types.push(3)}}types.sort();return types}isLegacy(){return this.type===0}isBerlin(){return this.type===1}isLondon(){return this.type===2}isCancun(){return this.type===3}clone(){return Transaction.from(this)}toJSON(){const s=v=>{if(v==null){return null}return v.toString()};return{type:this.type,to:this.to,data:this.data,nonce:this.nonce,gasLimit:s(this.gasLimit),gasPrice:s(this.gasPrice),maxPriorityFeePerGas:s(this.maxPriorityFeePerGas),maxFeePerGas:s(this.maxFeePerGas),value:s(this.value),chainId:s(this.chainId),sig:this.signature?this.signature.toJSON():null,accessList:this.accessList}}static from(tx){if(tx==null){return new Transaction}if(typeof tx==="string"){const payload=getBytes(tx);if(payload[0]>=127){return Transaction.from(_parseLegacy(payload))}switch(payload[0]){case 1:return Transaction.from(_parseEip2930(payload));case 2:return Transaction.from(_parseEip1559(payload));case 3:return Transaction.from(_parseEip4844(payload));case 4:return Transaction.from(_parseEip7702(payload))}assert(false,"unsupported transaction type","UNSUPPORTED_OPERATION",{operation:"from"})}const result=new Transaction;if(tx.type!=null){result.type=tx.type}if(tx.to!=null){result.to=tx.to}if(tx.nonce!=null){result.nonce=tx.nonce}if(tx.gasLimit!=null){result.gasLimit=tx.gasLimit}if(tx.gasPrice!=null){result.gasPrice=tx.gasPrice}if(tx.maxPriorityFeePerGas!=null){result.maxPriorityFeePerGas=tx.maxPriorityFeePerGas}if(tx.maxFeePerGas!=null){result.maxFeePerGas=tx.maxFeePerGas}if(tx.maxFeePerBlobGas!=null){result.maxFeePerBlobGas=tx.maxFeePerBlobGas}if(tx.data!=null){result.data=tx.data}if(tx.value!=null){result.value=tx.value}if(tx.chainId!=null){result.chainId=tx.chainId}if(tx.signature!=null){result.signature=Signature.from(tx.signature)}if(tx.accessList!=null){result.accessList=tx.accessList}if(tx.authorizationList!=null){result.authorizationList=tx.authorizationList}if(tx.blobVersionedHashes!=null){result.blobVersionedHashes=tx.blobVersionedHashes}if(tx.kzg!=null){result.kzg=tx.kzg}if(tx.blobs!=null){result.blobs=tx.blobs}if(tx.hash!=null){assertArgument(result.isSigned(),"unsigned transaction cannot define '.hash'","tx",tx);assertArgument(result.hash===tx.hash,"hash mismatch","tx",tx)}if(tx.from!=null){assertArgument(result.isSigned(),"unsigned transaction cannot define '.from'","tx",tx);assertArgument(result.from.toLowerCase()===(tx.from||"").toLowerCase(),"from mismatch","tx",tx)}return result}}function hashAuthorization(auth){assertArgument(typeof auth.address==="string","invalid address for hashAuthorization","auth.address",auth);return keccak256(concat(["0x05",encodeRlp([auth.chainId!=null?toBeArray(auth.chainId):"0x",getAddress(auth.address),auth.nonce!=null?toBeArray(auth.nonce):"0x"])]))}function verifyAuthorization(auth,sig){return recoverAddress(hashAuthorization(auth),sig)}function id(value){return keccak256(toUtf8Bytes(value))}var COMPRESSED$1="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";const FENCED=new Map([[8217,"apostrophe"],[8260,"fraction slash"],[12539,"middle dot"]]);const NSM_MAX=4;function decode_arithmetic(bytes){let pos=0;function u16(){return bytes[pos++]<<8|bytes[pos++]}let symbol_count=u16();let total=1;let acc=[0,1];for(let i=1;i>--read_width&1}const N=31;const FULL=2**N;const HALF=FULL>>>1;const QRTR=HALF>>1;const MASK=FULL-1;let register=0;for(let i=0;i1){let mid=start+end>>>1;if(value>>1|read_bit();a=a<<1^HALF;b=(b^HALF)<<1|HALF|1}low=a;range=1+b-a}let offset=symbol_count-4;return symbols.map(x=>{switch(x-offset){case 3:return offset+65792+(bytes[pos_payload++]<<16|bytes[pos_payload++]<<8|bytes[pos_payload++]);case 2:return offset+256+(bytes[pos_payload++]<<8|bytes[pos_payload++]);case 1:return offset+bytes[pos_payload++];default:return x-1}})}function read_payload(v){let pos=0;return()=>v[pos++]}function read_compressed_payload(s){return read_payload(decode_arithmetic(unsafe_atob(s)))}function unsafe_atob(s){let lookup=[];[..."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"].forEach((c,i)=>lookup[c.charCodeAt(0)]=i);let n=s.length;let ret=new Uint8Array(6*n>>3);for(let i=0,pos=0,width=0,carry=0;i=8){ret[pos++]=carry>>(width-=8)}}return ret}function signed(i){return i&1?~i>>1:i>>1}function read_deltas(n,next){let v=Array(n);for(let i=0,x=0;i{let v=read_sorted(next);if(v.length)return v})}function read_mapped(next){let ret=[];while(true){let w=next();if(w==0)break;ret.push(read_linear_table(w,next))}while(true){let w=next()-1;if(w<0)break;ret.push(read_replacement_table(w,next))}return ret.flat()}function read_array_while(next){let v=[];while(true){let x=next(v.length);if(!x)break;v.push(x)}return v}function read_transposed(n,w,next){let m=Array(n).fill().map(()=>[]);for(let i=0;im[j].push(x))}return m}function read_linear_table(w,next){let dx=1+next();let dy=next();let vN=read_array_while(next);let m=read_transposed(vN.length,1+w,next);return m.flatMap((v,i)=>{let[x,...ys]=v;return Array(vN[i]).fill().map((_,j)=>{let j_dy=j*dy;return[x+j*dx,ys.map(y=>y+j_dy)]})})}function read_replacement_table(w,next){let n=1+next();let m=read_transposed(n,1+w,next);return m.map(v=>[v[0],v.slice(1)])}function read_trie(next){let ret=[];let sorted=read_sorted(next);expand(decode([]),[]);return ret;function decode(Q){let S=next();let B=read_array_while(()=>{let cps=read_sorted(next).map(i=>sorted[i]);if(cps.length)return decode(cps)});return{S:S,B:B,Q:Q}}function expand({S,B},cps,saved){if(S&4&&saved===cps[cps.length-1])return;if(S&2)saved=cps[cps.length-1];if(S&1)ret.push(cps);for(let br of B){for(let cp of br.Q){expand(br,[...cps,cp],saved)}}}}function hex_cp(cp){return cp.toString(16).toUpperCase().padStart(2,"0")}function quote_cp(cp){return`{${hex_cp(cp)}}`}function explode_cp(s){let cps=[];for(let pos=0,len=s.length;pos>24&255}function unpack_cp(packed){return packed&16777215}let SHIFTED_RANK,EXCLUSIONS,DECOMP,RECOMP;function init$1(){let r=read_compressed_payload(COMPRESSED);SHIFTED_RANK=new Map(read_sorted_arrays(r).flatMap((v,i)=>v.map(x=>[x,i+1<<24])));EXCLUSIONS=new Set(read_sorted(r));DECOMP=new Map;RECOMP=new Map;for(let[cp,cps]of read_mapped(r)){if(!EXCLUSIONS.has(cp)&&cps.length==2){let[a,b]=cps;let bucket=RECOMP.get(a);if(!bucket){bucket=new Map;RECOMP.set(a,bucket)}bucket.set(b,cp)}DECOMP.set(cp,cps.reverse())}}function is_hangul(cp){return cp>=S0&&cp=L0&&a=V0&&bT0&&b0)add(T0+t_index)}else{let mapped=DECOMP.get(cp);if(mapped){buf.push(...mapped)}else{add(cp)}}if(!buf.length)break;cp=buf.pop()}}if(check_order&&ret.length>1){let prev_cc=unpack_cc(ret[0]);for(let i=1;i0&&prev_cc>=cc){if(cc==0){ret.push(prev_cp,...stack);stack.length=0;prev_cp=cp}else{stack.push(cp)}prev_cc=cc}else{let composed=compose_pair(prev_cp,cp);if(composed>=0){prev_cp=composed}else if(prev_cc==0&&cc==0){ret.push(prev_cp);prev_cp=cp}else{stack.push(cp);prev_cc=cc}}}if(prev_cp>=0){ret.push(prev_cp,...stack)}return ret}function nfd(cps){return decomposed(cps).map(unpack_cp)}function nfc(cps){return composed_from_decomposed(decomposed(cps))}const HYPHEN=45;const STOP_CH=".";const FE0F=65039;const UNIQUE_PH=1;const Array_from=x=>Array.from(x);function group_has_cp(g,cp){return g.P.has(cp)||g.Q.has(cp)}class Emoji extends Array{get is_emoji(){return true}}let MAPPED,IGNORED,CM,NSM,ESCAPE,GROUPS,WHOLE_VALID,WHOLE_MAP,VALID,EMOJI_LIST,EMOJI_ROOT;function init(){if(MAPPED)return;let r=read_compressed_payload(COMPRESSED$1);const read_sorted_array=()=>read_sorted(r);const read_sorted_set=()=>new Set(read_sorted_array());const set_add_many=(set,v)=>v.forEach(x=>set.add(x));MAPPED=new Map(read_mapped(r));IGNORED=read_sorted_set();CM=read_sorted_array();NSM=new Set(read_sorted_array().map(i=>CM[i]));CM=new Set(CM);ESCAPE=read_sorted_set();read_sorted_set();let chunks=read_sorted_arrays(r);let unrestricted=r();const read_chunked=()=>{let set=new Set;read_sorted_array().forEach(i=>set_add_many(set,chunks[i]));set_add_many(set,read_sorted_array());return set};GROUPS=read_array_while(i=>{let N=read_array_while(r).map(x=>x+96);if(N.length){let R=i>=unrestricted;N[0]-=32;N=str_from_cps(N);if(R)N=`Restricted[${N}]`;let P=read_chunked();let Q=read_chunked();let M=!r();return{N:N,P:P,Q:Q,M:M,R:R}}});WHOLE_VALID=read_sorted_set();WHOLE_MAP=new Map;let wholes=read_sorted_array().concat(Array_from(WHOLE_VALID)).sort((a,b)=>a-b);wholes.forEach((cp,i)=>{let d=r();let w=wholes[i]=d?wholes[i-d]:{V:[],M:new Map};w.V.push(cp);if(!WHOLE_VALID.has(cp)){WHOLE_MAP.set(cp,w)}});for(let{V,M}of new Set(WHOLE_MAP.values())){let recs=[];for(let cp of V){let gs=GROUPS.filter(g=>group_has_cp(g,cp));let rec=recs.find(({G})=>gs.some(g=>G.has(g)));if(!rec){rec={G:new Set,V:[]};recs.push(rec)}rec.V.push(cp);set_add_many(rec.G,gs)}let union=recs.flatMap(x=>Array_from(x.G));for(let{G,V}of recs){let complement=new Set(union.filter(g=>!G.has(g)));for(let cp of V){M.set(cp,complement)}}}VALID=new Set;let multi=new Set;const add_to_union=cp=>VALID.has(cp)?multi.add(cp):VALID.add(cp);for(let g of GROUPS){for(let cp of g.P)add_to_union(cp);for(let cp of g.Q)add_to_union(cp)}for(let cp of VALID){if(!WHOLE_MAP.has(cp)&&!multi.has(cp)){WHOLE_MAP.set(cp,UNIQUE_PH)}}set_add_many(VALID,nfd(VALID));EMOJI_LIST=read_trie(r).map(v=>Emoji.from(v)).sort(compare_arrays);EMOJI_ROOT=new Map;for(let cps of EMOJI_LIST){let prev=[EMOJI_ROOT];for(let cp of cps){let next=prev.map(node=>{let child=node.get(cp);if(!child){child=new Map;node.set(cp,child)}return child});if(cp===FE0F){prev.push(...next)}else{prev=next}}for(let x of prev){x.V=cps}}}function quoted_cp(cp){return(should_escape(cp)?"":`${bidi_qq(safe_str_from_cps([cp]))} `)+quote_cp(cp)}function bidi_qq(s){return`"${s}"\u200E`}function check_label_extension(cps){if(cps.length>=4&&cps[2]==HYPHEN&&cps[3]==HYPHEN){throw new Error(`invalid label extension: "${str_from_cps(cps.slice(0,4))}"`)}}function check_leading_underscore(cps){const UNDERSCORE=95;for(let i=cps.lastIndexOf(UNDERSCORE);i>0;){if(cps[--i]!==UNDERSCORE){throw new Error("underscore allowed only at start")}}}function check_fenced(cps){let cp=cps[0];let prev=FENCED.get(cp);if(prev)throw error_placement(`leading ${prev}`);let n=cps.length;let last=-1;for(let i=1;imax){max>>=1;cps=[...cps.slice(0,max),8230,...cps.slice(-max)]}let prev=0;let n=cps.length;for(let i=0;i{let input=explode_cp(label);let info={input:input,offset:offset};offset+=input.length+1;try{let tokens=info.tokens=tokens_from_str(input,nf,ef);let token_count=tokens.length;let type;if(!token_count){throw new Error(`empty label`)}let norm=info.output=tokens.flat();check_leading_underscore(norm);let emoji=info.emoji=token_count>1||tokens[0].is_emoji;if(!emoji&&norm.every(cp=>cp<128)){check_label_extension(norm);type="ASCII"}else{let chars=tokens.flatMap(x=>x.is_emoji?[]:x);if(!chars.length){type="Emoji"}else{if(CM.has(norm[0]))throw error_placement("leading combining mark");for(let i=1;iset.has(g)):Array_from(set);if(!maker.length)return}else{shared.push(cp)}}if(maker){for(let g of maker){if(shared.every(cp=>group_has_cp(g,cp))){throw new Error(`whole-script confusable: ${group.N}/${g.N}`)}}}}function determine_group(unique){let groups=GROUPS;for(let cp of unique){let gs=groups.filter(g=>group_has_cp(g,cp));if(!gs.length){if(!GROUPS.some(g=>group_has_cp(g,cp))){throw error_disallowed(cp)}else{throw error_group_member(groups[0],cp)}}groups=gs;if(gs.length==1)break}return groups}function flatten(split){return split.map(({input,error,output})=>{if(error){let msg=error.message;throw new Error(split.length==1?msg:`Invalid label ${bidi_qq(safe_str_from_cps(input,63))}: ${msg}`)}return str_from_cps(output)}).join(STOP_CH)}function error_disallowed(cp){return new Error(`disallowed character: ${quoted_cp(cp)}`)}function error_group_member(g,cp){let quoted=quoted_cp(cp);let gg=GROUPS.find(g=>g.P.has(cp));if(gg){quoted=`${gg.N} ${quoted}`}return new Error(`illegal mixture: ${g.N} + ${quoted}`)}function error_placement(where){return new Error(`illegal placement: ${where}`)}function check_group(g,cps){for(let cp of cps){if(!group_has_cp(g,cp)){throw error_group_member(g,cp)}}if(g.M){let decomposed=nfd(cps);for(let i=1,e=decomposed.length;iNSM_MAX){throw new Error(`excessive non-spacing marks: ${bidi_qq(safe_str_from_cps(decomposed.slice(i-1,j)))} (${j-i}/${NSM_MAX})`)}i=j}}}}function tokens_from_str(input,nf,ef){let ret=[];let chars=[];input=input.slice().reverse();while(input.length){let emoji=consume_emoji_reversed(input);if(emoji){if(chars.length){ret.push(nf(chars));chars=[]}ret.push(ef(emoji))}else{let cp=input.pop();if(VALID.has(cp)){chars.push(cp)}else{let cps=MAPPED.get(cp);if(cps){chars.push(...cps)}else if(!IGNORED.has(cp)){throw error_disallowed(cp)}}}}if(chars.length){ret.push(nf(chars))}return ret}function filter_fe0f(cps){return cps.filter(cp=>cp!=FE0F)}function consume_emoji_reversed(cps,eaten){let node=EMOJI_ROOT;let emoji;let pos=cps.length;while(pos){node=node.get(cps[--pos]);if(!node)break;let{V}=node;if(V){emoji=V;cps.length=pos}}return emoji}const Zeros=new Uint8Array(32);Zeros.fill(0);function checkComponent(comp){assertArgument(comp.length!==0,"invalid ENS name; empty component","comp",comp);return comp}function ensNameSplit(name){const bytes=toUtf8Bytes(ensNormalize(name));const comps=[];if(name.length===0){return comps}let last=0;for(let i=0;i{assertArgument(comp.length<=length,`label ${JSON.stringify(name)} exceeds ${length} bytes`,"name",name);const bytes=new Uint8Array(comp.length+1);bytes.set(comp,1);bytes[0]=bytes.length-1;return bytes})))+"00"}function hashMessage(message){if(typeof message==="string"){message=toUtf8Bytes(message)}return keccak256(concat([toUtf8Bytes(MessagePrefix),toUtf8Bytes(String(message.length)),message]))}function verifyMessage(message,sig){const digest=hashMessage(message);return recoverAddress(digest,sig)}const regexBytes=new RegExp("^bytes([0-9]+)$");const regexNumber=new RegExp("^(u?int)([0-9]*)$");const regexArray=new RegExp("^(.*)\\[([0-9]*)\\]$");function _pack(type,value,isArray){switch(type){case"address":if(isArray){return getBytes(zeroPadValue(value,32))}return getBytes(getAddress(value));case"string":return toUtf8Bytes(value);case"bytes":return getBytes(value);case"bool":value=!!value?"0x01":"0x00";if(isArray){return getBytes(zeroPadValue(value,32))}return getBytes(value)}let match=type.match(regexNumber);if(match){let signed=match[1]==="int";let size=parseInt(match[2]||"256");assertArgument((!match[2]||match[2]===String(size))&&size%8===0&&size!==0&&size<=256,"invalid number type","type",type);if(isArray){size=256}if(signed){value=toTwos(value,size)}return getBytes(zeroPadValue(toBeArray(value),size/8))}match=type.match(regexBytes);if(match){const size=parseInt(match[1]);assertArgument(String(size)===match[1]&&size!==0&&size<=32,"invalid bytes type","type",type);assertArgument(dataLength(value)===size,`invalid value for ${type}`,"value",value);if(isArray){return getBytes(zeroPadBytes(value,32))}return value}match=type.match(regexArray);if(match&&Array.isArray(value)){const baseType=match[1];const count=parseInt(match[2]||String(value.length));assertArgument(count===value.length,`invalid array length for ${type}`,"value",value);const result=[];value.forEach(function(value){result.push(_pack(baseType,value,true))});return getBytes(concat(result))}assertArgument(false,"invalid type","type",type)}function solidityPacked(types,values){assertArgument(types.length===values.length,"wrong number of values; expected ${ types.length }","values",values);const tight=[];types.forEach(function(type,index){tight.push(_pack(type,values[index]))});return hexlify(concat(tight))}function solidityPackedKeccak256(types,values){return keccak256(solidityPacked(types,values))}function solidityPackedSha256(types,values){return sha256(solidityPacked(types,values))}const padding=new Uint8Array(32);padding.fill(0);const BN__1=BigInt(-1);const BN_0$3=BigInt(0);const BN_1$1=BigInt(1);const BN_MAX_UINT256=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function hexPadRight(value){const bytes=getBytes(value);const padOffset=bytes.length%32;if(padOffset){return concat([bytes,padding.slice(padOffset)])}return hexlify(bytes)}const hexTrue=toBeHex(BN_1$1,32);const hexFalse=toBeHex(BN_0$3,32);const domainFieldTypes={name:"string",version:"string",chainId:"uint256",verifyingContract:"address",salt:"bytes32"};const domainFieldNames=["name","version","chainId","verifyingContract","salt"];function checkString(key){return function(value){assertArgument(typeof value==="string",`invalid domain value for ${JSON.stringify(key)}`,`domain.${key}`,value);return value}}const domainChecks={name:checkString("name"),version:checkString("version"),chainId:function(_value){const value=getBigInt(_value,"domain.chainId");assertArgument(value>=0,"invalid chain ID","domain.chainId",_value);if(Number.isSafeInteger(value)){return Number(value)}return toQuantity(value)},verifyingContract:function(value){try{return getAddress(value).toLowerCase()}catch(error){}assertArgument(false,`invalid domain value "verifyingContract"`,"domain.verifyingContract",value)},salt:function(value){const bytes=getBytes(value,"domain.salt");assertArgument(bytes.length===32,`invalid domain value "salt"`,"domain.salt",value);return hexlify(bytes)}};function getBaseEncoder(type){{const match=type.match(/^(u?)int(\d+)$/);if(match){const signed=match[1]==="";const width=parseInt(match[2]);assertArgument(width%8===0&&width!==0&&width<=256&&match[2]===String(width),"invalid numeric width","type",type);const boundsUpper=mask(BN_MAX_UINT256,signed?width-1:width);const boundsLower=signed?(boundsUpper+BN_1$1)*BN__1:BN_0$3;return function(_value){const value=getBigInt(_value,"value");assertArgument(value>=boundsLower&&value<=boundsUpper,`value out-of-bounds for ${type}`,"value",value);return toBeHex(signed?toTwos(value,256):value,32)}}}{const match=type.match(/^bytes(\d+)$/);if(match){const width=parseInt(match[1]);assertArgument(width!==0&&width<=32&&match[1]===String(width),"invalid bytes width","type",type);return function(value){const bytes=getBytes(value);assertArgument(bytes.length===width,`invalid length for ${type}`,"value",value);return hexPadRight(value)}}}switch(type){case"address":return function(value){return zeroPadValue(getAddress(value),32)};case"bool":return function(value){return!value?hexFalse:hexTrue};case"bytes":return function(value){return keccak256(value)};case"string":return function(value){return id(value)}}return null}function encodeType(name,fields){return`${name}(${fields.map(({name,type})=>type+" "+name).join(",")})`}function splitArray(type){const match=type.match(/^([^\x5b]*)((\x5b\d*\x5d)*)(\x5b(\d*)\x5d)$/);if(match){return{base:match[1],index:match[2]+match[4],array:{base:match[1],prefix:match[1]+match[2],count:match[5]?parseInt(match[5]):-1}}}return{base:type}}class TypedDataEncoder{primaryType;#types;get types(){return JSON.parse(this.#types)}#fullTypes;#encoderCache;constructor(_types){this.#fullTypes=new Map;this.#encoderCache=new Map;const links=new Map;const parents=new Map;const subtypes=new Map;const types={};Object.keys(_types).forEach(type=>{types[type]=_types[type].map(({name,type})=>{let{base,index}=splitArray(type);if(base==="int"&&!_types["int"]){base="int256"}if(base==="uint"&&!_types["uint"]){base="uint256"}return{name:name,type:base+(index||"")}});links.set(type,new Set);parents.set(type,[]);subtypes.set(type,new Set)});this.#types=JSON.stringify(types);for(const name in types){const uniqueNames=new Set;for(const field of types[name]){assertArgument(!uniqueNames.has(field.name),`duplicate variable name ${JSON.stringify(field.name)} in ${JSON.stringify(name)}`,"types",_types);uniqueNames.add(field.name);const baseType=splitArray(field.type).base;assertArgument(baseType!==name,`circular type reference to ${JSON.stringify(baseType)}`,"types",_types);const encoder=getBaseEncoder(baseType);if(encoder){continue}assertArgument(parents.has(baseType),`unknown type ${JSON.stringify(baseType)}`,"types",_types);parents.get(baseType).push(name);links.get(name).add(baseType)}}const primaryTypes=Array.from(parents.keys()).filter(n=>parents.get(n).length===0);assertArgument(primaryTypes.length!==0,"missing primary type","types",_types);assertArgument(primaryTypes.length===1,`ambiguous primary types or unused types: ${primaryTypes.map(t=>JSON.stringify(t)).join(", ")}`,"types",_types);defineProperties(this,{primaryType:primaryTypes[0]});function checkCircular(type,found){assertArgument(!found.has(type),`circular type reference to ${JSON.stringify(type)}`,"types",_types);found.add(type);for(const child of links.get(type)){if(!parents.has(child)){continue}checkCircular(child,found);for(const subtype of found){subtypes.get(subtype).add(child)}}found.delete(type)}checkCircular(this.primaryType,new Set);for(const[name,set]of subtypes){const st=Array.from(set);st.sort();this.#fullTypes.set(name,encodeType(name,types[name])+st.map(t=>encodeType(t,types[t])).join(""))}}getEncoder(type){let encoder=this.#encoderCache.get(type);if(!encoder){encoder=this.#getEncoder(type);this.#encoderCache.set(type,encoder)}return encoder}#getEncoder(type){{const encoder=getBaseEncoder(type);if(encoder){return encoder}}const array=splitArray(type).array;if(array){const subtype=array.prefix;const subEncoder=this.getEncoder(subtype);return value=>{assertArgument(array.count===-1||array.count===value.length,`array length mismatch; expected length ${array.count}`,"value",value);let result=value.map(subEncoder);if(this.#fullTypes.has(subtype)){result=result.map(keccak256)}return keccak256(concat(result))}}const fields=this.types[type];if(fields){const encodedType=id(this.#fullTypes.get(type));return value=>{const values=fields.map(({name,type})=>{const result=this.getEncoder(type)(value[name]);if(this.#fullTypes.has(type)){return keccak256(result)}return result});values.unshift(encodedType);return concat(values)}}assertArgument(false,`unknown type: ${type}`,"type",type)}encodeType(name){const result=this.#fullTypes.get(name);assertArgument(result,`unknown type: ${JSON.stringify(name)}`,"name",name);return result}encodeData(type,value){return this.getEncoder(type)(value)}hashStruct(name,value){return keccak256(this.encodeData(name,value))}encode(value){return this.encodeData(this.primaryType,value)}hash(value){return this.hashStruct(this.primaryType,value)}_visit(type,value,callback){{const encoder=getBaseEncoder(type);if(encoder){return callback(type,value)}}const array=splitArray(type).array;if(array){assertArgument(array.count===-1||array.count===value.length,`array length mismatch; expected length ${array.count}`,"value",value);return value.map(v=>this._visit(array.prefix,v,callback))}const fields=this.types[type];if(fields){return fields.reduce((accum,{name,type})=>{accum[name]=this._visit(type,value[name],callback);return accum},{})}assertArgument(false,`unknown type: ${type}`,"type",type)}visit(value,callback){return this._visit(this.primaryType,value,callback)}static from(types){return new TypedDataEncoder(types)}static getPrimaryType(types){return TypedDataEncoder.from(types).primaryType}static hashStruct(name,types,value){return TypedDataEncoder.from(types).hashStruct(name,value)}static hashDomain(domain){const domainFields=[];for(const name in domain){if(domain[name]==null){continue}const type=domainFieldTypes[name];assertArgument(type,`invalid typed-data domain key: ${JSON.stringify(name)}`,"domain",domain);domainFields.push({name:name,type:type})}domainFields.sort((a,b)=>{return domainFieldNames.indexOf(a.name)-domainFieldNames.indexOf(b.name)});return TypedDataEncoder.hashStruct("EIP712Domain",{EIP712Domain:domainFields},domain)}static encode(domain,types,value){return concat(["0x1901",TypedDataEncoder.hashDomain(domain),TypedDataEncoder.from(types).hash(value)])}static hash(domain,types,value){return keccak256(TypedDataEncoder.encode(domain,types,value))}static async resolveNames(domain,types,value,resolveName){domain=Object.assign({},domain);for(const key in domain){if(domain[key]==null){delete domain[key]}}const ensCache={};if(domain.verifyingContract&&!isHexString(domain.verifyingContract,20)){ensCache[domain.verifyingContract]="0x"}const encoder=TypedDataEncoder.from(types);encoder.visit(value,(type,value)=>{if(type==="address"&&!isHexString(value,20)){ensCache[value]="0x"}return value});for(const name in ensCache){ensCache[name]=await resolveName(name)}if(domain.verifyingContract&&ensCache[domain.verifyingContract]){domain.verifyingContract=ensCache[domain.verifyingContract]}value=encoder.visit(value,(type,value)=>{if(type==="address"&&ensCache[value]){return ensCache[value]}return value});return{domain:domain,value:value}}static getPayload(domain,types,value){TypedDataEncoder.hashDomain(domain);const domainValues={};const domainTypes=[];domainFieldNames.forEach(name=>{const value=domain[name];if(value==null){return}domainValues[name]=domainChecks[name](value);domainTypes.push({name:name,type:domainFieldTypes[name]})});const encoder=TypedDataEncoder.from(types);types=encoder.types;const typesWithDomain=Object.assign({},types);assertArgument(typesWithDomain.EIP712Domain==null,"types must not contain EIP712Domain type","types.EIP712Domain",types);typesWithDomain.EIP712Domain=domainTypes;encoder.encode(value);return{types:typesWithDomain,domain:domainValues,primaryType:encoder.primaryType,message:encoder.visit(value,(type,value)=>{if(type.match(/^bytes(\d*)/)){return hexlify(getBytes(value))}if(type.match(/^u?int/)){return getBigInt(value).toString()}switch(type){case"address":return value.toLowerCase();case"bool":return!!value;case"string":assertArgument(typeof value==="string","invalid string","value",value);return value}assertArgument(false,"unsupported type","type",type)})}}}function verifyTypedData(domain,types,value,signature){return recoverAddress(TypedDataEncoder.hash(domain,types,value),signature)}function setify(items){const result=new Set;items.forEach(k=>result.add(k));return Object.freeze(result)}const _kwVisibDeploy="external public payable override";const KwVisibDeploy=setify(_kwVisibDeploy.split(" "));const _kwVisib="constant external internal payable private public pure view override";const KwVisib=setify(_kwVisib.split(" "));const _kwTypes="constructor error event fallback function receive struct";const KwTypes=setify(_kwTypes.split(" "));const _kwModifiers="calldata memory storage payable indexed";const KwModifiers=setify(_kwModifiers.split(" "));const _kwOther="tuple returns";const _keywords=[_kwTypes,_kwModifiers,_kwOther,_kwVisib].join(" ");const Keywords=setify(_keywords.split(" "));const SimpleTokens={"(":"OPEN_PAREN",")":"CLOSE_PAREN","[":"OPEN_BRACKET","]":"CLOSE_BRACKET",",":"COMMA","@":"AT"};const regexWhitespacePrefix=new RegExp("^(\\s*)");const regexNumberPrefix=new RegExp("^([0-9]+)");const regexIdPrefix=new RegExp("^([a-zA-Z$_][a-zA-Z0-9$_]*)");const regexId=new RegExp("^([a-zA-Z$_][a-zA-Z0-9$_]*)$");const regexType=new RegExp("^(address|bool|bytes([0-9]*)|string|u?int([0-9]*))$");class TokenString{#offset;#tokens;get offset(){return this.#offset}get length(){return this.#tokens.length-this.#offset}constructor(tokens){this.#offset=0;this.#tokens=tokens.slice()}clone(){return new TokenString(this.#tokens)}reset(){this.#offset=0}#subTokenString(from=0,to=0){return new TokenString(this.#tokens.slice(from,to).map(t=>{return Object.freeze(Object.assign({},t,{match:t.match-from,linkBack:t.linkBack-from,linkNext:t.linkNext-from}))}))}popKeyword(allowed){const top=this.peek();if(top.type!=="KEYWORD"||!allowed.has(top.text)){throw new Error(`expected keyword ${top.text}`)}return this.pop().text}popType(type){if(this.peek().type!==type){const top=this.peek();throw new Error(`expected ${type}; got ${top.type} ${JSON.stringify(top.text)}`)}return this.pop().text}popParen(){const top=this.peek();if(top.type!=="OPEN_PAREN"){throw new Error("bad start")}const result=this.#subTokenString(this.#offset+1,top.match+1);this.#offset=top.match+1;return result}popParams(){const top=this.peek();if(top.type!=="OPEN_PAREN"){throw new Error("bad start")}const result=[];while(this.#offset=this.#tokens.length){throw new Error("out-of-bounds")}return this.#tokens[this.#offset]}peekKeyword(allowed){const top=this.peekType("KEYWORD");return top!=null&&allowed.has(top)?top:null}peekType(type){if(this.length===0){return null}const top=this.peek();return top.type===type?top.text:null}pop(){const result=this.peek();this.#offset++;return result}toString(){const tokens=[];for(let i=this.#offset;i`}}function lex(text){const tokens=[];const throwError=message=>{const token=offset0&&tokens[tokens.length-1].type==="NUMBER"){const value=tokens.pop().text;suffix=value+suffix;tokens[tokens.length-1].value=getNumber(value)}if(tokens.length===0||tokens[tokens.length-1].type!=="BRACKET"){throw new Error("missing opening bracket")}tokens[tokens.length-1].text+=suffix}continue}match=cur.match(regexIdPrefix);if(match){token.text=match[1];offset+=token.text.length;if(Keywords.has(token.text)){token.type="KEYWORD";continue}if(token.text.match(regexType)){token.type="TYPE";continue}token.type="ID";continue}match=cur.match(regexNumberPrefix);if(match){token.text=match[1];token.type="NUMBER";offset+=token.text.length;continue}throw new Error(`unexpected token ${JSON.stringify(cur[0])} at position ${offset}`)}return new TokenString(tokens.map(t=>Object.freeze(t)))}function allowSingle(set,allowed){let included=[];for(const key in allowed.keys()){if(set.has(key)){included.push(key)}}if(included.length>1){throw new Error(`conflicting types: ${included.join(", ")}`)}}function consumeName(type,tokens){if(tokens.peekKeyword(KwTypes)){const keyword=tokens.pop().text;if(keyword!==type){throw new Error(`expected ${type}, got ${keyword}`)}}return tokens.popType("ID")}function consumeKeywords(tokens,allowed){const keywords=new Set;while(true){const keyword=tokens.peekType("KEYWORD");if(keyword==null||allowed&&!allowed.has(keyword)){break}tokens.pop();if(keywords.has(keyword)){throw new Error(`duplicate keywords: ${JSON.stringify(keyword)}`)}keywords.add(keyword)}return Object.freeze(keywords)}function consumeMutability(tokens){let modifiers=consumeKeywords(tokens,KwVisib);allowSingle(modifiers,setify("constant payable nonpayable".split(" ")));allowSingle(modifiers,setify("pure view payable nonpayable".split(" ")));if(modifiers.has("view")){return"view"}if(modifiers.has("pure")){return"pure"}if(modifiers.has("payable")){return"payable"}if(modifiers.has("nonpayable")){return"nonpayable"}if(modifiers.has("constant")){return"view"}return"nonpayable"}function consumeParams(tokens,allowIndexed){return tokens.popParams().map(t=>ParamType.from(t,allowIndexed))}function consumeGas(tokens){if(tokens.peekType("AT")){tokens.pop();if(tokens.peekType("NUMBER")){return getBigInt(tokens.pop().text)}throw new Error("invalid gas")}return null}function consumeEoi(tokens){if(tokens.length){throw new Error(`unexpected tokens at offset ${tokens.offset}: ${tokens.toString()}`)}}const regexArrayType=new RegExp(/^(.*)\[([0-9]*)\]$/);function verifyBasicType(type){const match=type.match(regexType);assertArgument(match,"invalid type","type",type);if(type==="uint"){return"uint256"}if(type==="int"){return"int256"}if(match[2]){const length=parseInt(match[2]);assertArgument(length!==0&&length<=32,"invalid bytes length","type",type)}else if(match[3]){const size=parseInt(match[3]);assertArgument(size!==0&&size<=256&&size%8===0,"invalid numeric width","type",type)}return type}const _guard$2={};const internal$1=Symbol.for("_ethers_internal");const ParamTypeInternal="_ParamTypeInternal";const ErrorFragmentInternal="_ErrorInternal";const EventFragmentInternal="_EventInternal";const ConstructorFragmentInternal="_ConstructorInternal";const FallbackFragmentInternal="_FallbackInternal";const FunctionFragmentInternal="_FunctionInternal";const StructFragmentInternal="_StructInternal";class ParamType{name;type;baseType;indexed;components;arrayLength;arrayChildren;constructor(guard,name,type,baseType,indexed,components,arrayLength,arrayChildren){assertPrivate(guard,_guard$2,"ParamType");Object.defineProperty(this,internal$1,{value:ParamTypeInternal});if(components){components=Object.freeze(components.slice())}if(baseType==="array"){if(arrayLength==null||arrayChildren==null){throw new Error("")}}else if(arrayLength!=null||arrayChildren!=null){throw new Error("")}if(baseType==="tuple"){if(components==null){throw new Error("")}}else if(components!=null){throw new Error("")}defineProperties(this,{name:name,type:type,baseType:baseType,indexed:indexed,components:components,arrayLength:arrayLength,arrayChildren:arrayChildren})}format(format){if(format==null){format="sighash"}if(format==="json"){const name=this.name||"";if(this.isArray()){const result=JSON.parse(this.arrayChildren.format("json"));result.name=name;result.type+=`[${this.arrayLength<0?"":String(this.arrayLength)}]`;return JSON.stringify(result)}const result={type:this.baseType==="tuple"?"tuple":this.type,name:name};if(typeof this.indexed==="boolean"){result.indexed=this.indexed}if(this.isTuple()){result.components=this.components.map(c=>JSON.parse(c.format(format)))}return JSON.stringify(result)}let result="";if(this.isArray()){result+=this.arrayChildren.format(format);result+=`[${this.arrayLength<0?"":String(this.arrayLength)}]`}else{if(this.isTuple()){result+="("+this.components.map(comp=>comp.format(format)).join(format==="full"?", ":",")+")"}else{result+=this.type}}if(format!=="sighash"){if(this.indexed===true){result+=" indexed"}if(format==="full"&&this.name){result+=" "+this.name}}return result}isArray(){return this.baseType==="array"}isTuple(){return this.baseType==="tuple"}isIndexable(){return this.indexed!=null}walk(value,process){if(this.isArray()){if(!Array.isArray(value)){throw new Error("invalid array value")}if(this.arrayLength!==-1&&value.length!==this.arrayLength){throw new Error("array is wrong length")}const _this=this;return value.map(v=>_this.arrayChildren.walk(v,process))}if(this.isTuple()){if(!Array.isArray(value)){throw new Error("invalid tuple value")}if(value.length!==this.components.length){throw new Error("array is wrong length")}const _this=this;return value.map((v,i)=>_this.components[i].walk(v,process))}return process(this.type,value)}#walkAsync(promises,value,process,setValue){if(this.isArray()){if(!Array.isArray(value)){throw new Error("invalid array value")}if(this.arrayLength!==-1&&value.length!==this.arrayLength){throw new Error("array is wrong length")}const childType=this.arrayChildren;const result=value.slice();result.forEach((value,index)=>{childType.#walkAsync(promises,value,process,value=>{result[index]=value})});setValue(result);return}if(this.isTuple()){const components=this.components;let result;if(Array.isArray(value)){result=value.slice()}else{if(value==null||typeof value!=="object"){throw new Error("invalid tuple value")}result=components.map(param=>{if(!param.name){throw new Error("cannot use object value with unnamed components")}if(!(param.name in value)){throw new Error(`missing value for component ${param.name}`)}return value[param.name]})}if(result.length!==this.components.length){throw new Error("array is wrong length")}result.forEach((value,index)=>{components[index].#walkAsync(promises,value,process,value=>{result[index]=value})});setValue(result);return}const result=process(this.type,value);if(result.then){promises.push(async function(){setValue(await result)}())}else{setValue(result)}}async walkAsync(value,process){const promises=[];const result=[value];this.#walkAsync(promises,value,process,value=>{result[0]=value});if(promises.length){await Promise.all(promises)}return result[0]}static from(obj,allowIndexed){if(ParamType.isParamType(obj)){return obj}if(typeof obj==="string"){try{return ParamType.from(lex(obj),allowIndexed)}catch(error){assertArgument(false,"invalid param type","obj",obj)}}else if(obj instanceof TokenString){let type="",baseType="";let comps=null;if(consumeKeywords(obj,setify(["tuple"])).has("tuple")||obj.peekType("OPEN_PAREN")){baseType="tuple";comps=obj.popParams().map(t=>ParamType.from(t));type=`tuple(${comps.map(c=>c.format()).join(",")})`}else{type=verifyBasicType(obj.popType("TYPE"));baseType=type}let arrayChildren=null;let arrayLength=null;while(obj.length&&obj.peekType("BRACKET")){const bracket=obj.pop();arrayChildren=new ParamType(_guard$2,"",type,baseType,null,comps,arrayLength,arrayChildren);arrayLength=bracket.value;type+=bracket.text;baseType="array";comps=null}let indexed=null;const keywords=consumeKeywords(obj,KwModifiers);if(keywords.has("indexed")){if(!allowIndexed){throw new Error("")}indexed=true}const name=obj.peekType("ID")?obj.pop().text:"";if(obj.length){throw new Error("leftover tokens")}return new ParamType(_guard$2,name,type,baseType,indexed,comps,arrayLength,arrayChildren)}const name=obj.name;assertArgument(!name||typeof name==="string"&&name.match(regexId),"invalid name","obj.name",name);let indexed=obj.indexed;if(indexed!=null){assertArgument(allowIndexed,"parameter cannot be indexed","obj.indexed",obj.indexed);indexed=!!indexed}let type=obj.type;let arrayMatch=type.match(regexArrayType);if(arrayMatch){const arrayLength=parseInt(arrayMatch[2]||"-1");const arrayChildren=ParamType.from({type:arrayMatch[1],components:obj.components});return new ParamType(_guard$2,name||"",type,"array",indexed,null,arrayLength,arrayChildren)}if(type==="tuple"||type.startsWith("tuple(")||type.startsWith("(")){const comps=obj.components!=null?obj.components.map(c=>ParamType.from(c)):null;const tuple=new ParamType(_guard$2,name||"",type,"tuple",indexed,comps,null,null);return tuple}type=verifyBasicType(obj.type);return new ParamType(_guard$2,name||"",type,type,indexed,null,null,null)}static isParamType(value){return value&&value[internal$1]===ParamTypeInternal}}class Fragment{type;inputs;constructor(guard,type,inputs){assertPrivate(guard,_guard$2,"Fragment");inputs=Object.freeze(inputs.slice());defineProperties(this,{type:type,inputs:inputs})}static from(obj){if(typeof obj==="string"){try{Fragment.from(JSON.parse(obj))}catch(e){}return Fragment.from(lex(obj))}if(obj instanceof TokenString){const type=obj.peekKeyword(KwTypes);switch(type){case"constructor":return ConstructorFragment.from(obj);case"error":return ErrorFragment.from(obj);case"event":return EventFragment.from(obj);case"fallback":case"receive":return FallbackFragment.from(obj);case"function":return FunctionFragment.from(obj);case"struct":return StructFragment.from(obj)}}else if(typeof obj==="object"){switch(obj.type){case"constructor":return ConstructorFragment.from(obj);case"error":return ErrorFragment.from(obj);case"event":return EventFragment.from(obj);case"fallback":case"receive":return FallbackFragment.from(obj);case"function":return FunctionFragment.from(obj);case"struct":return StructFragment.from(obj)}assert(false,`unsupported type: ${obj.type}`,"UNSUPPORTED_OPERATION",{operation:"Fragment.from"})}assertArgument(false,"unsupported frgament object","obj",obj)}static isConstructor(value){return ConstructorFragment.isFragment(value)}static isError(value){return ErrorFragment.isFragment(value)}static isEvent(value){return EventFragment.isFragment(value)}static isFunction(value){return FunctionFragment.isFragment(value)}static isStruct(value){return StructFragment.isFragment(value)}}class NamedFragment extends Fragment{name;constructor(guard,type,name,inputs){super(guard,type,inputs);assertArgument(typeof name==="string"&&name.match(regexId),"invalid identifier","name",name);inputs=Object.freeze(inputs.slice());defineProperties(this,{name:name})}}function joinParams(format,params){return"("+params.map(p=>p.format(format)).join(format==="full"?", ":",")+")"}class ErrorFragment extends NamedFragment{constructor(guard,name,inputs){super(guard,"error",name,inputs);Object.defineProperty(this,internal$1,{value:ErrorFragmentInternal})}get selector(){return id(this.format("sighash")).substring(0,10)}format(format){if(format==null){format="sighash"}if(format==="json"){return JSON.stringify({type:"error",name:this.name,inputs:this.inputs.map(input=>JSON.parse(input.format(format)))})}const result=[];if(format!=="sighash"){result.push("error")}result.push(this.name+joinParams(format,this.inputs));return result.join(" ")}static from(obj){if(ErrorFragment.isFragment(obj)){return obj}if(typeof obj==="string"){return ErrorFragment.from(lex(obj))}else if(obj instanceof TokenString){const name=consumeName("error",obj);const inputs=consumeParams(obj);consumeEoi(obj);return new ErrorFragment(_guard$2,name,inputs)}return new ErrorFragment(_guard$2,obj.name,obj.inputs?obj.inputs.map(ParamType.from):[])}static isFragment(value){return value&&value[internal$1]===ErrorFragmentInternal}}class EventFragment extends NamedFragment{anonymous;constructor(guard,name,inputs,anonymous){super(guard,"event",name,inputs);Object.defineProperty(this,internal$1,{value:EventFragmentInternal});defineProperties(this,{anonymous:anonymous})}get topicHash(){return id(this.format("sighash"))}format(format){if(format==null){format="sighash"}if(format==="json"){return JSON.stringify({type:"event",anonymous:this.anonymous,name:this.name,inputs:this.inputs.map(i=>JSON.parse(i.format(format)))})}const result=[];if(format!=="sighash"){result.push("event")}result.push(this.name+joinParams(format,this.inputs));if(format!=="sighash"&&this.anonymous){result.push("anonymous")}return result.join(" ")}static getTopicHash(name,params){params=(params||[]).map(p=>ParamType.from(p));const fragment=new EventFragment(_guard$2,name,params,false);return fragment.topicHash}static from(obj){if(EventFragment.isFragment(obj)){return obj}if(typeof obj==="string"){try{return EventFragment.from(lex(obj))}catch(error){assertArgument(false,"invalid event fragment","obj",obj)}}else if(obj instanceof TokenString){const name=consumeName("event",obj);const inputs=consumeParams(obj,true);const anonymous=!!consumeKeywords(obj,setify(["anonymous"])).has("anonymous");consumeEoi(obj);return new EventFragment(_guard$2,name,inputs,anonymous)}return new EventFragment(_guard$2,obj.name,obj.inputs?obj.inputs.map(p=>ParamType.from(p,true)):[],!!obj.anonymous)}static isFragment(value){return value&&value[internal$1]===EventFragmentInternal}}class ConstructorFragment extends Fragment{payable;gas;constructor(guard,type,inputs,payable,gas){super(guard,type,inputs);Object.defineProperty(this,internal$1,{value:ConstructorFragmentInternal});defineProperties(this,{payable:payable,gas:gas})}format(format){assert(format!=null&&format!=="sighash","cannot format a constructor for sighash","UNSUPPORTED_OPERATION",{operation:"format(sighash)"});if(format==="json"){return JSON.stringify({type:"constructor",stateMutability:this.payable?"payable":"undefined",payable:this.payable,gas:this.gas!=null?this.gas:undefined,inputs:this.inputs.map(i=>JSON.parse(i.format(format)))})}const result=[`constructor${joinParams(format,this.inputs)}`];if(this.payable){result.push("payable")}if(this.gas!=null){result.push(`@${this.gas.toString()}`)}return result.join(" ")}static from(obj){if(ConstructorFragment.isFragment(obj)){return obj}if(typeof obj==="string"){try{return ConstructorFragment.from(lex(obj))}catch(error){assertArgument(false,"invalid constuctor fragment","obj",obj)}}else if(obj instanceof TokenString){consumeKeywords(obj,setify(["constructor"]));const inputs=consumeParams(obj);const payable=!!consumeKeywords(obj,KwVisibDeploy).has("payable");const gas=consumeGas(obj);consumeEoi(obj);return new ConstructorFragment(_guard$2,"constructor",inputs,payable,gas)}return new ConstructorFragment(_guard$2,"constructor",obj.inputs?obj.inputs.map(ParamType.from):[],!!obj.payable,obj.gas!=null?obj.gas:null)}static isFragment(value){return value&&value[internal$1]===ConstructorFragmentInternal}}class FallbackFragment extends Fragment{payable;constructor(guard,inputs,payable){super(guard,"fallback",inputs);Object.defineProperty(this,internal$1,{value:FallbackFragmentInternal});defineProperties(this,{payable:payable})}format(format){const type=this.inputs.length===0?"receive":"fallback";if(format==="json"){const stateMutability=this.payable?"payable":"nonpayable";return JSON.stringify({type:type,stateMutability:stateMutability})}return`${type}()${this.payable?" payable":""}`}static from(obj){if(FallbackFragment.isFragment(obj)){return obj}if(typeof obj==="string"){try{return FallbackFragment.from(lex(obj))}catch(error){assertArgument(false,"invalid fallback fragment","obj",obj)}}else if(obj instanceof TokenString){const errorObj=obj.toString();const topIsValid=obj.peekKeyword(setify(["fallback","receive"]));assertArgument(topIsValid,"type must be fallback or receive","obj",errorObj);const type=obj.popKeyword(setify(["fallback","receive"]));if(type==="receive"){const inputs=consumeParams(obj);assertArgument(inputs.length===0,`receive cannot have arguments`,"obj.inputs",inputs);consumeKeywords(obj,setify(["payable"]));consumeEoi(obj);return new FallbackFragment(_guard$2,[],true)}let inputs=consumeParams(obj);if(inputs.length){assertArgument(inputs.length===1&&inputs[0].type==="bytes","invalid fallback inputs","obj.inputs",inputs.map(i=>i.format("minimal")).join(", "))}else{inputs=[ParamType.from("bytes")]}const mutability=consumeMutability(obj);assertArgument(mutability==="nonpayable"||mutability==="payable","fallback cannot be constants","obj.stateMutability",mutability);if(consumeKeywords(obj,setify(["returns"])).has("returns")){const outputs=consumeParams(obj);assertArgument(outputs.length===1&&outputs[0].type==="bytes","invalid fallback outputs","obj.outputs",outputs.map(i=>i.format("minimal")).join(", "))}consumeEoi(obj);return new FallbackFragment(_guard$2,inputs,mutability==="payable")}if(obj.type==="receive"){return new FallbackFragment(_guard$2,[],true)}if(obj.type==="fallback"){const inputs=[ParamType.from("bytes")];const payable=obj.stateMutability==="payable";return new FallbackFragment(_guard$2,inputs,payable)}assertArgument(false,"invalid fallback description","obj",obj)}static isFragment(value){return value&&value[internal$1]===FallbackFragmentInternal}}class FunctionFragment extends NamedFragment{constant;outputs;stateMutability;payable;gas;constructor(guard,name,stateMutability,inputs,outputs,gas){super(guard,"function",name,inputs);Object.defineProperty(this,internal$1,{value:FunctionFragmentInternal});outputs=Object.freeze(outputs.slice());const constant=stateMutability==="view"||stateMutability==="pure";const payable=stateMutability==="payable";defineProperties(this,{constant:constant,gas:gas,outputs:outputs,payable:payable,stateMutability:stateMutability})}get selector(){return id(this.format("sighash")).substring(0,10)}format(format){if(format==null){format="sighash"}if(format==="json"){return JSON.stringify({type:"function",name:this.name,constant:this.constant,stateMutability:this.stateMutability!=="nonpayable"?this.stateMutability:undefined,payable:this.payable,gas:this.gas!=null?this.gas:undefined,inputs:this.inputs.map(i=>JSON.parse(i.format(format))),outputs:this.outputs.map(o=>JSON.parse(o.format(format)))})}const result=[];if(format!=="sighash"){result.push("function")}result.push(this.name+joinParams(format,this.inputs));if(format!=="sighash"){if(this.stateMutability!=="nonpayable"){result.push(this.stateMutability)}if(this.outputs&&this.outputs.length){result.push("returns");result.push(joinParams(format,this.outputs))}if(this.gas!=null){result.push(`@${this.gas.toString()}`)}}return result.join(" ")}static getSelector(name,params){params=(params||[]).map(p=>ParamType.from(p));const fragment=new FunctionFragment(_guard$2,name,"view",params,[],null);return fragment.selector}static from(obj){if(FunctionFragment.isFragment(obj)){return obj}if(typeof obj==="string"){try{return FunctionFragment.from(lex(obj))}catch(error){assertArgument(false,"invalid function fragment","obj",obj)}}else if(obj instanceof TokenString){const name=consumeName("function",obj);const inputs=consumeParams(obj);const mutability=consumeMutability(obj);let outputs=[];if(consumeKeywords(obj,setify(["returns"])).has("returns")){outputs=consumeParams(obj)}const gas=consumeGas(obj);consumeEoi(obj);return new FunctionFragment(_guard$2,name,mutability,inputs,outputs,gas)}let stateMutability=obj.stateMutability;if(stateMutability==null){stateMutability="payable";if(typeof obj.constant==="boolean"){stateMutability="view";if(!obj.constant){stateMutability="payable";if(typeof obj.payable==="boolean"&&!obj.payable){stateMutability="nonpayable"}}}else if(typeof obj.payable==="boolean"&&!obj.payable){stateMutability="nonpayable"}}return new FunctionFragment(_guard$2,obj.name,stateMutability,obj.inputs?obj.inputs.map(ParamType.from):[],obj.outputs?obj.outputs.map(ParamType.from):[],obj.gas!=null?obj.gas:null)}static isFragment(value){return value&&value[internal$1]===FunctionFragmentInternal}}class StructFragment extends NamedFragment{constructor(guard,name,inputs){super(guard,"struct",name,inputs);Object.defineProperty(this,internal$1,{value:StructFragmentInternal})}format(){throw new Error("@TODO")}static from(obj){if(typeof obj==="string"){try{return StructFragment.from(lex(obj))}catch(error){assertArgument(false,"invalid struct fragment","obj",obj)}}else if(obj instanceof TokenString){const name=consumeName("struct",obj);const inputs=consumeParams(obj);consumeEoi(obj);return new StructFragment(_guard$2,name,inputs)}return new StructFragment(_guard$2,obj.name,obj.inputs?obj.inputs.map(ParamType.from):[])}static isFragment(value){return value&&value[internal$1]===StructFragmentInternal}}const PanicReasons$1=new Map;PanicReasons$1.set(0,"GENERIC_PANIC");PanicReasons$1.set(1,"ASSERT_FALSE");PanicReasons$1.set(17,"OVERFLOW");PanicReasons$1.set(18,"DIVIDE_BY_ZERO");PanicReasons$1.set(33,"ENUM_RANGE_ERROR");PanicReasons$1.set(34,"BAD_STORAGE_DATA");PanicReasons$1.set(49,"STACK_UNDERFLOW");PanicReasons$1.set(50,"ARRAY_RANGE_ERROR");PanicReasons$1.set(65,"OUT_OF_MEMORY");PanicReasons$1.set(81,"UNINITIALIZED_FUNCTION_CALL");const paramTypeBytes=new RegExp(/^bytes([0-9]*)$/);const paramTypeNumber=new RegExp(/^(u?int)([0-9]*)$/);let defaultCoder=null;let defaultMaxInflation=1024;function getBuiltinCallException(action,tx,data,abiCoder){let message="missing revert data";let reason=null;const invocation=null;let revert=null;if(data){message="execution reverted";const bytes=getBytes(data);data=hexlify(data);if(bytes.length===0){message+=" (no data present; likely require(false) occurred";reason="require(false)"}else if(bytes.length%32!==4){message+=" (could not decode reason; invalid data length)"}else if(hexlify(bytes.slice(0,4))==="0x08c379a0"){try{reason=abiCoder.decode(["string"],bytes.slice(4))[0];revert={signature:"Error(string)",name:"Error",args:[reason]};message+=`: ${JSON.stringify(reason)}`}catch(error){message+=" (could not decode reason; invalid string data)"}}else if(hexlify(bytes.slice(0,4))==="0x4e487b71"){try{const code=Number(abiCoder.decode(["uint256"],bytes.slice(4))[0]);revert={signature:"Panic(uint256)",name:"Panic",args:[code]};reason=`Panic due to ${PanicReasons$1.get(code)||"UNKNOWN"}(${code})`;message+=`: ${reason}`}catch(error){message+=" (could not decode panic code)"}}else{message+=" (unknown custom error)"}}const transaction={to:tx.to?getAddress(tx.to):null,data:tx.data||"0x"};if(tx.from){transaction.from=getAddress(tx.from)}return makeError(message,"CALL_EXCEPTION",{action:action,data:data,reason:reason,transaction:transaction,invocation:invocation,revert:revert})}class AbiCoder{#getCoder(param){if(param.isArray()){return new ArrayCoder(this.#getCoder(param.arrayChildren),param.arrayLength,param.name)}if(param.isTuple()){return new TupleCoder(param.components.map(c=>this.#getCoder(c)),param.name)}switch(param.baseType){case"address":return new AddressCoder(param.name);case"bool":return new BooleanCoder(param.name);case"string":return new StringCoder(param.name);case"bytes":return new BytesCoder(param.name);case"":return new NullCoder(param.name)}let match=param.type.match(paramTypeNumber);if(match){let size=parseInt(match[2]||"256");assertArgument(size!==0&&size<=256&&size%8===0,"invalid "+match[1]+" bit length","param",param);return new NumberCoder(size/8,match[1]==="int",param.name)}match=param.type.match(paramTypeBytes);if(match){let size=parseInt(match[1]);assertArgument(size!==0&&size<=32,"invalid bytes length","param",param);return new FixedBytesCoder(size,param.name)}assertArgument(false,"invalid type","type",param.type)}getDefaultValue(types){const coders=types.map(type=>this.#getCoder(ParamType.from(type)));const coder=new TupleCoder(coders,"_");return coder.defaultValue()}encode(types,values){assertArgumentCount(values.length,types.length,"types/values length mismatch");const coders=types.map(type=>this.#getCoder(ParamType.from(type)));const coder=new TupleCoder(coders,"_");const writer=new Writer;coder.encode(writer,values);return writer.data}decode(types,data,loose){const coders=types.map(type=>this.#getCoder(ParamType.from(type)));const coder=new TupleCoder(coders,"_");return coder.decode(new Reader(data,loose,defaultMaxInflation))}static _setDefaultMaxInflation(value){assertArgument(typeof value==="number"&&Number.isInteger(value),"invalid defaultMaxInflation factor","value",value);defaultMaxInflation=value}static defaultAbiCoder(){if(defaultCoder==null){defaultCoder=new AbiCoder}return defaultCoder}static getBuiltinCallException(action,tx,data){return getBuiltinCallException(action,tx,data,AbiCoder.defaultAbiCoder())}}function encodeBytes32String(text){const bytes=toUtf8Bytes(text);if(bytes.length>31){throw new Error("bytes32 string must be less than 32 bytes")}return zeroPadBytes(bytes,32)}function decodeBytes32String(_bytes){const data=getBytes(_bytes,"bytes");if(data.length!==32){throw new Error("invalid bytes32 - not 32 bytes long")}if(data[31]!==0){throw new Error("invalid bytes32 string - no null terminator")}let length=31;while(data[length-1]===0){length--}return toUtf8String(data.slice(0,length))}class LogDescription{fragment;name;signature;topic;args;constructor(fragment,topic,args){const name=fragment.name,signature=fragment.format();defineProperties(this,{fragment:fragment,name:name,signature:signature,topic:topic,args:args})}}class TransactionDescription{fragment;name;args;signature;selector;value;constructor(fragment,selector,args,value){const name=fragment.name,signature=fragment.format();defineProperties(this,{fragment:fragment,name:name,args:args,signature:signature,selector:selector,value:value})}}class ErrorDescription{fragment;name;args;signature;selector;constructor(fragment,selector,args){const name=fragment.name,signature=fragment.format();defineProperties(this,{fragment:fragment,name:name,args:args,signature:signature,selector:selector})}}class Indexed{hash;_isIndexed;static isIndexed(value){return!!(value&&value._isIndexed)}constructor(hash){defineProperties(this,{hash:hash,_isIndexed:true})}}const PanicReasons={0:"generic panic",1:"assert(false)",17:"arithmetic overflow",18:"division or modulo by zero",33:"enum overflow",34:"invalid encoded storage byte array accessed",49:"out-of-bounds array access; popping on an empty array",50:"out-of-bounds access of an array or bytesN",65:"out of memory",81:"uninitialized function"};const BuiltinErrors={"0x08c379a0":{signature:"Error(string)",name:"Error",inputs:["string"],reason:message=>{return`reverted with reason string ${JSON.stringify(message)}`}},"0x4e487b71":{signature:"Panic(uint256)",name:"Panic",inputs:["uint256"],reason:code=>{let reason="unknown panic code";if(code>=0&&code<=255&&PanicReasons[code.toString()]){reason=PanicReasons[code.toString()]}return`reverted with panic code 0x${code.toString(16)} (${reason})`}}};class Interface{fragments;deploy;fallback;receive;#errors;#events;#functions;#abiCoder;constructor(fragments){let abi=[];if(typeof fragments==="string"){abi=JSON.parse(fragments)}else{abi=fragments}this.#functions=new Map;this.#errors=new Map;this.#events=new Map;const frags=[];for(const a of abi){try{frags.push(Fragment.from(a))}catch(error){console.log(`[Warning] Invalid Fragment ${JSON.stringify(a)}:`,error.message)}}defineProperties(this,{fragments:Object.freeze(frags)});let fallback=null;let receive=false;this.#abiCoder=this.getAbiCoder();this.fragments.forEach((fragment,index)=>{let bucket;switch(fragment.type){case"constructor":if(this.deploy){console.log("duplicate definition - constructor");return}defineProperties(this,{deploy:fragment});return;case"fallback":if(fragment.inputs.length===0){receive=true}else{assertArgument(!fallback||fragment.payable!==fallback.payable,"conflicting fallback fragments",`fragments[${index}]`,fragment);fallback=fragment;receive=fallback.payable}return;case"function":bucket=this.#functions;break;case"event":bucket=this.#events;break;case"error":bucket=this.#errors;break;default:return}const signature=fragment.format();if(bucket.has(signature)){return}bucket.set(signature,fragment)});if(!this.deploy){defineProperties(this,{deploy:ConstructorFragment.from("constructor()")})}defineProperties(this,{fallback:fallback,receive:receive})}format(minimal){const format=minimal?"minimal":"full";const abi=this.fragments.map(f=>f.format(format));return abi}formatJson(){const abi=this.fragments.map(f=>f.format("json"));return JSON.stringify(abi.map(j=>JSON.parse(j)))}getAbiCoder(){return AbiCoder.defaultAbiCoder()}#getFunction(key,values,forceUnique){if(isHexString(key)){const selector=key.toLowerCase();for(const fragment of this.#functions.values()){if(selector===fragment.selector){return fragment}}return null}if(key.indexOf("(")===-1){const matching=[];for(const[name,fragment]of this.#functions){if(name.split("(")[0]===key){matching.push(fragment)}}if(values){const lastValue=values.length>0?values[values.length-1]:null;let valueLength=values.length;let allowOptions=true;if(Typed.isTyped(lastValue)&&lastValue.type==="overrides"){allowOptions=false;valueLength--}for(let i=matching.length-1;i>=0;i--){const inputs=matching[i].inputs.length;if(inputs!==valueLength&&(!allowOptions||inputs!==valueLength-1)){matching.splice(i,1)}}for(let i=matching.length-1;i>=0;i--){const inputs=matching[i].inputs;for(let j=0;j=inputs.length){if(values[j].type==="overrides"){continue}matching.splice(i,1);break}if(values[j].type!==inputs[j].baseType){matching.splice(i,1);break}}}}if(matching.length===1&&values&&values.length!==matching[0].inputs.length){const lastArg=values[values.length-1];if(lastArg==null||Array.isArray(lastArg)||typeof lastArg!=="object"){matching.splice(0,1)}}if(matching.length===0){return null}if(matching.length>1&&forceUnique){const matchStr=matching.map(m=>JSON.stringify(m.format())).join(", ");assertArgument(false,`ambiguous function description (i.e. matches ${matchStr})`,"key",key)}return matching[0]}const result=this.#functions.get(FunctionFragment.from(key).format());if(result){return result}return null}getFunctionName(key){const fragment=this.#getFunction(key,null,false);assertArgument(fragment,"no matching function","key",key);return fragment.name}hasFunction(key){return!!this.#getFunction(key,null,false)}getFunction(key,values){return this.#getFunction(key,values||null,true)}forEachFunction(callback){const names=Array.from(this.#functions.keys());names.sort((a,b)=>a.localeCompare(b));for(let i=0;i=0;i--){if(matching[i].inputs.length=0;i--){const inputs=matching[i].inputs;for(let j=0;j1&&forceUnique){const matchStr=matching.map(m=>JSON.stringify(m.format())).join(", ");assertArgument(false,`ambiguous event description (i.e. matches ${matchStr})`,"key",key)}return matching[0]}const result=this.#events.get(EventFragment.from(key).format());if(result){return result}return null}getEventName(key){const fragment=this.#getEvent(key,null,false);assertArgument(fragment,"no matching event","key",key);return fragment.name}hasEvent(key){return!!this.#getEvent(key,null,false)}getEvent(key,values){return this.#getEvent(key,values||null,true)}forEachEvent(callback){const names=Array.from(this.#events.keys());names.sort((a,b)=>a.localeCompare(b));for(let i=0;i1){const matchStr=matching.map(m=>JSON.stringify(m.format())).join(", ");assertArgument(false,`ambiguous error description (i.e. ${matchStr})`,"name",key)}return matching[0]}key=ErrorFragment.from(key).format();if(key==="Error(string)"){return ErrorFragment.from("error Error(string)")}if(key==="Panic(uint256)"){return ErrorFragment.from("error Panic(uint256)")}const result=this.#errors.get(key);if(result){return result}return null}forEachError(callback){const names=Array.from(this.#errors.keys());names.sort((a,b)=>a.localeCompare(b));for(let i=0;i{if(param.type==="string"){return id(value)}else if(param.type==="bytes"){return keccak256(hexlify(value))}if(param.type==="bool"&&typeof value==="boolean"){value=value?"0x01":"0x00"}else if(param.type.match(/^u?int/)){value=toBeHex(value)}else if(param.type.match(/^bytes/)){value=zeroPadBytes(value,32)}else if(param.type==="address"){this.#abiCoder.encode(["address"],[value])}return zeroPadValue(hexlify(value),32)};values.forEach((value,index)=>{const param=fragment.inputs[index];if(!param.indexed){assertArgument(value==null,"cannot filter non-indexed parameters; must be null","contract."+param.name,value);return}if(value==null){topics.push(null)}else if(param.baseType==="array"||param.baseType==="tuple"){assertArgument(false,"filtering with tuples or arrays not supported","contract."+param.name,value)}else if(Array.isArray(value)){topics.push(value.map(value=>encodeTopic(param,value)))}else{topics.push(encodeTopic(param,value))}});while(topics.length&&topics[topics.length-1]===null){topics.pop()}return topics}encodeEventLog(fragment,values){if(typeof fragment==="string"){const f=this.getEvent(fragment);assertArgument(f,"unknown event","eventFragment",fragment);fragment=f}const topics=[];const dataTypes=[];const dataValues=[];if(!fragment.anonymous){topics.push(fragment.topicHash)}assertArgument(values.length===fragment.inputs.length,"event arguments/values mismatch","values",values);fragment.inputs.forEach((param,index)=>{const value=values[index];if(param.indexed){if(param.type==="string"){topics.push(id(value))}else if(param.type==="bytes"){topics.push(keccak256(value))}else if(param.baseType==="tuple"||param.baseType==="array"){throw new Error("not implemented")}else{topics.push(this.#abiCoder.encode([param.type],[value]))}}else{dataTypes.push(param);dataValues.push(value)}});return{data:this.#abiCoder.encode(dataTypes,dataValues),topics:topics}}decodeEventLog(fragment,data,topics){if(typeof fragment==="string"){const f=this.getEvent(fragment);assertArgument(f,"unknown event","eventFragment",fragment);fragment=f}if(topics!=null&&!fragment.anonymous){const eventTopic=fragment.topicHash;assertArgument(isHexString(topics[0],32)&&topics[0].toLowerCase()===eventTopic,"fragment/topic mismatch","topics[0]",topics[0]);topics=topics.slice(1)}const indexed=[];const nonIndexed=[];const dynamic=[];fragment.inputs.forEach((param,index)=>{if(param.indexed){if(param.type==="string"||param.type==="bytes"||param.baseType==="tuple"||param.baseType==="array"){indexed.push(ParamType.from({type:"bytes32",name:param.name}));dynamic.push(true)}else{indexed.push(param);dynamic.push(false)}}else{nonIndexed.push(param);dynamic.push(false)}});const resultIndexed=topics!=null?this.#abiCoder.decode(indexed,concat(topics)):null;const resultNonIndexed=this.#abiCoder.decode(nonIndexed,data,true);const values=[];const keys=[];let nonIndexedIndex=0,indexedIndex=0;fragment.inputs.forEach((param,index)=>{let value=null;if(param.indexed){if(resultIndexed==null){value=new Indexed(null)}else if(dynamic[index]){value=new Indexed(resultIndexed[indexedIndex++])}else{try{value=resultIndexed[indexedIndex++]}catch(error){value=error}}}else{try{value=resultNonIndexed[nonIndexedIndex++]}catch(error){value=error}}values.push(value);keys.push(param.name||null)});return Result.fromItems(values,keys)}parseTransaction(tx){const data=getBytes(tx.data,"tx.data");const value=getBigInt(tx.value!=null?tx.value:0,"tx.value");const fragment=this.getFunction(hexlify(data.slice(0,4)));if(!fragment){return null}const args=this.#abiCoder.decode(fragment.inputs,data.slice(4));return new TransactionDescription(fragment,fragment.selector,args,value)}parseCallResult(data){throw new Error("@TODO")}parseLog(log){const fragment=this.getEvent(log.topics[0]);if(!fragment||fragment.anonymous){return null}return new LogDescription(fragment,fragment.topicHash,this.decodeEventLog(fragment,log.data,log.topics))}parseError(data){const hexData=hexlify(data);const fragment=this.getError(dataSlice(hexData,0,4));if(!fragment){return null}const args=this.#abiCoder.decode(fragment.inputs,dataSlice(hexData,4));return new ErrorDescription(fragment,fragment.selector,args)}static from(value){if(value instanceof Interface){return value}if(typeof value==="string"){return new Interface(JSON.parse(value))}if(typeof value.formatJson==="function"){return new Interface(value.formatJson())}if(typeof value.format==="function"){return new Interface(value.format("json"))}return new Interface(value)}}const BN_0$2=BigInt(0);function getValue(value){if(value==null){return null}return value}function toJson(value){if(value==null){return null}return value.toString()}class FeeData{gasPrice;maxFeePerGas;maxPriorityFeePerGas;constructor(gasPrice,maxFeePerGas,maxPriorityFeePerGas){defineProperties(this,{gasPrice:getValue(gasPrice),maxFeePerGas:getValue(maxFeePerGas),maxPriorityFeePerGas:getValue(maxPriorityFeePerGas)})}toJSON(){const{gasPrice,maxFeePerGas,maxPriorityFeePerGas}=this;return{_type:"FeeData",gasPrice:toJson(gasPrice),maxFeePerGas:toJson(maxFeePerGas),maxPriorityFeePerGas:toJson(maxPriorityFeePerGas)}}}function copyRequest(req){const result={};if(req.to){result.to=req.to}if(req.from){result.from=req.from}if(req.data){result.data=hexlify(req.data)}const bigIntKeys="chainId,gasLimit,gasPrice,maxFeePerBlobGas,maxFeePerGas,maxPriorityFeePerGas,value".split(/,/);for(const key of bigIntKeys){if(!(key in req)||req[key]==null){continue}result[key]=getBigInt(req[key],`request.${key}`)}const numberKeys="type,nonce".split(/,/);for(const key of numberKeys){if(!(key in req)||req[key]==null){continue}result[key]=getNumber(req[key],`request.${key}`)}if(req.accessList){result.accessList=accessListify(req.accessList)}if(req.authorizationList){result.authorizationList=req.authorizationList.slice()}if("blockTag"in req){result.blockTag=req.blockTag}if("enableCcipRead"in req){result.enableCcipRead=!!req.enableCcipRead}if("customData"in req){result.customData=req.customData}if("blobVersionedHashes"in req&&req.blobVersionedHashes){result.blobVersionedHashes=req.blobVersionedHashes.slice()}if("kzg"in req){result.kzg=req.kzg}if("blobs"in req&&req.blobs){result.blobs=req.blobs.map(b=>{if(isBytesLike(b)){return hexlify(b)}return Object.assign({},b)})}return result}class Block{provider;number;hash;timestamp;parentHash;parentBeaconBlockRoot;nonce;difficulty;gasLimit;gasUsed;stateRoot;receiptsRoot;blobGasUsed;excessBlobGas;miner;prevRandao;extraData;baseFeePerGas;#transactions;constructor(block,provider){this.#transactions=block.transactions.map(tx=>{if(typeof tx!=="string"){return new TransactionResponse(tx,provider)}return tx});defineProperties(this,{provider:provider,hash:getValue(block.hash),number:block.number,timestamp:block.timestamp,parentHash:block.parentHash,parentBeaconBlockRoot:block.parentBeaconBlockRoot,nonce:block.nonce,difficulty:block.difficulty,gasLimit:block.gasLimit,gasUsed:block.gasUsed,blobGasUsed:block.blobGasUsed,excessBlobGas:block.excessBlobGas,miner:block.miner,prevRandao:getValue(block.prevRandao),extraData:block.extraData,baseFeePerGas:getValue(block.baseFeePerGas),stateRoot:block.stateRoot,receiptsRoot:block.receiptsRoot})}get transactions(){return this.#transactions.map(tx=>{if(typeof tx==="string"){return tx}return tx.hash})}get prefetchedTransactions(){const txs=this.#transactions.slice();if(txs.length===0){return[]}assert(typeof txs[0]==="object","transactions were not prefetched with block request","UNSUPPORTED_OPERATION",{operation:"transactionResponses()"});return txs}toJSON(){const{baseFeePerGas,difficulty,extraData,gasLimit,gasUsed,hash,miner,prevRandao,nonce,number,parentHash,parentBeaconBlockRoot,stateRoot,receiptsRoot,timestamp,transactions}=this;return{_type:"Block",baseFeePerGas:toJson(baseFeePerGas),difficulty:toJson(difficulty),extraData:extraData,gasLimit:toJson(gasLimit),gasUsed:toJson(gasUsed),blobGasUsed:toJson(this.blobGasUsed),excessBlobGas:toJson(this.excessBlobGas),hash:hash,miner:miner,prevRandao:prevRandao,nonce:nonce,number:number,parentHash:parentHash,timestamp:timestamp,parentBeaconBlockRoot:parentBeaconBlockRoot,stateRoot:stateRoot,receiptsRoot:receiptsRoot,transactions:transactions}}[Symbol.iterator](){let index=0;const txs=this.transactions;return{next:()=>{if(index{return new Log(log,provider)}));let gasPrice=BN_0$2;if(tx.effectiveGasPrice!=null){gasPrice=tx.effectiveGasPrice}else if(tx.gasPrice!=null){gasPrice=tx.gasPrice}defineProperties(this,{provider:provider,to:tx.to,from:tx.from,contractAddress:tx.contractAddress,hash:tx.hash,index:tx.index,blockHash:tx.blockHash,blockNumber:tx.blockNumber,logsBloom:tx.logsBloom,gasUsed:tx.gasUsed,cumulativeGasUsed:tx.cumulativeGasUsed,blobGasUsed:tx.blobGasUsed,gasPrice:gasPrice,blobGasPrice:tx.blobGasPrice,type:tx.type,status:tx.status,root:tx.root})}get logs(){return this.#logs}toJSON(){const{to,from,contractAddress,hash,index,blockHash,blockNumber,logsBloom,logs,status,root}=this;return{_type:"TransactionReceipt",blockHash:blockHash,blockNumber:blockNumber,contractAddress:contractAddress,cumulativeGasUsed:toJson(this.cumulativeGasUsed),from:from,gasPrice:toJson(this.gasPrice),blobGasUsed:toJson(this.blobGasUsed),blobGasPrice:toJson(this.blobGasPrice),gasUsed:toJson(this.gasUsed),hash:hash,index:index,logs:logs,logsBloom:logsBloom,root:root,status:status,to:to}}get length(){return this.logs.length}[Symbol.iterator](){let index=0;return{next:()=>{if(index{if(stopScanning){return null}const{blockNumber,nonce}=await resolveProperties({blockNumber:this.provider.getBlockNumber(),nonce:this.provider.getTransactionCount(this.from)});if(nonce{if(receipt==null||receipt.status!==0){return receipt}assert(false,"transaction execution reverted","CALL_EXCEPTION",{action:"sendTransaction",data:null,reason:null,invocation:null,revert:null,transaction:{to:receipt.to,from:receipt.from,data:""},receipt:receipt})};const receipt=await this.provider.getTransactionReceipt(this.hash);if(confirms===0){return checkReceipt(receipt)}if(receipt){if(confirms===1||await receipt.confirmations()>=confirms){return checkReceipt(receipt)}}else{await checkReplacement();if(confirms===0){return null}}const waiter=new Promise((resolve,reject)=>{const cancellers=[];const cancel=()=>{cancellers.forEach(c=>c())};cancellers.push(()=>{stopScanning=true});if(timeout>0){const timer=setTimeout(()=>{cancel();reject(makeError("wait for transaction timeout","TIMEOUT"))},timeout);cancellers.push(()=>{clearTimeout(timer)})}const txListener=async receipt=>{if(await receipt.confirmations()>=confirms){cancel();try{resolve(checkReceipt(receipt))}catch(error){reject(error)}}};cancellers.push(()=>{this.provider.off(this.hash,txListener)});this.provider.on(this.hash,txListener);if(startBlock>=0){const replaceListener=async()=>{try{await checkReplacement()}catch(error){if(isError(error,"TRANSACTION_REPLACED")){cancel();reject(error);return}}if(!stopScanning){this.provider.once("block",replaceListener)}};cancellers.push(()=>{this.provider.off("block",replaceListener)});this.provider.once("block",replaceListener)}});return await waiter}isMined(){return this.blockHash!=null}isLegacy(){return this.type===0}isBerlin(){return this.type===1}isLondon(){return this.type===2}isCancun(){return this.type===3}removedEvent(){assert(this.isMined(),"unmined transaction canot be orphaned","UNSUPPORTED_OPERATION",{operation:"removeEvent()"});return createRemovedTransactionFilter(this)}reorderedEvent(other){assert(this.isMined(),"unmined transaction canot be orphaned","UNSUPPORTED_OPERATION",{operation:"removeEvent()"});assert(!other||other.isMined(),"unmined 'other' transaction canot be orphaned","UNSUPPORTED_OPERATION",{operation:"removeEvent()"});return createReorderedTransactionFilter(this,other)}replaceableTransaction(startBlock){assertArgument(Number.isInteger(startBlock)&&startBlock>=0,"invalid startBlock","startBlock",startBlock);const tx=new TransactionResponse(this,this.provider);tx.#startBlock=startBlock;return tx}}function createOrphanedBlockFilter(block){return{orphan:"drop-block",hash:block.hash,number:block.number}}function createReorderedTransactionFilter(tx,other){return{orphan:"reorder-transaction",tx:tx,other:other}}function createRemovedTransactionFilter(tx){return{orphan:"drop-transaction",tx:tx}}function createRemovedLogFilter(log){return{orphan:"drop-log",log:{transactionHash:log.transactionHash,blockHash:log.blockHash,blockNumber:log.blockNumber,address:log.address,data:log.data,topics:Object.freeze(log.topics.slice()),index:log.index}}}class EventLog extends Log{interface;fragment;args;constructor(log,iface,fragment){super(log,log.provider);const args=iface.decodeEventLog(fragment,log.data,log.topics);defineProperties(this,{args:args,fragment:fragment,interface:iface})}get eventName(){return this.fragment.name}get eventSignature(){return this.fragment.format()}}class UndecodedEventLog extends Log{error;constructor(log,error){super(log,log.provider);defineProperties(this,{error:error})}}class ContractTransactionReceipt extends TransactionReceipt{#iface;constructor(iface,provider,tx){super(tx,provider);this.#iface=iface}get logs(){return super.logs.map(log=>{const fragment=log.topics.length?this.#iface.getEvent(log.topics[0]):null;if(fragment){try{return new EventLog(log,this.#iface,fragment)}catch(error){return new UndecodedEventLog(log,error)}}return log})}}class ContractTransactionResponse extends TransactionResponse{#iface;constructor(iface,provider,tx){super(tx,provider);this.#iface=iface}async wait(confirms,timeout){const receipt=await super.wait(confirms,timeout);if(receipt==null){return null}return new ContractTransactionReceipt(this.#iface,this.provider,receipt)}}class ContractUnknownEventPayload extends EventPayload{log;constructor(contract,listener,filter,log){super(contract,listener,filter);defineProperties(this,{log:log})}async getBlock(){return await this.log.getBlock()}async getTransaction(){return await this.log.getTransaction()}async getTransactionReceipt(){return await this.log.getTransactionReceipt()}}class ContractEventPayload extends ContractUnknownEventPayload{constructor(contract,listener,filter,fragment,_log){super(contract,listener,filter,new EventLog(_log,contract.interface,fragment));const args=contract.interface.decodeEventLog(fragment,this.log.data,this.log.topics);defineProperties(this,{args:args,fragment:fragment})}get eventName(){return this.fragment.name}get eventSignature(){return this.fragment.format()}}const BN_0$1=BigInt(0);function canCall(value){return value&&typeof value.call==="function"}function canEstimate(value){return value&&typeof value.estimateGas==="function"}function canResolve(value){return value&&typeof value.resolveName==="function"}function canSend(value){return value&&typeof value.sendTransaction==="function"}function getResolver(value){if(value!=null){if(canResolve(value)){return value}if(value.provider){return value.provider}}return undefined}class PreparedTopicFilter{#filter;fragment;constructor(contract,fragment,args){defineProperties(this,{fragment:fragment});if(fragment.inputs.length{const arg=args[index];if(arg==null){return null}return param.walkAsync(args[index],(type,value)=>{if(type==="address"){if(Array.isArray(value)){return Promise.all(value.map(v=>resolveAddress(v,resolver)))}return resolveAddress(value,resolver)}return value})}));return contract.interface.encodeFilterTopics(fragment,resolvedArgs)}()}getTopicFilter(){return this.#filter}}function getRunner(value,feature){if(value==null){return null}if(typeof value[feature]==="function"){return value}if(value.provider&&typeof value.provider[feature]==="function"){return value.provider}return null}function getProvider(value){if(value==null){return null}return value.provider||null}async function copyOverrides(arg,allowed){const _overrides=Typed.dereference(arg,"overrides");assertArgument(typeof _overrides==="object","invalid overrides parameter","overrides",arg);const overrides=copyRequest(_overrides);assertArgument(overrides.to==null||(allowed||[]).indexOf("to")>=0,"cannot override to","overrides.to",overrides.to);assertArgument(overrides.data==null||(allowed||[]).indexOf("data")>=0,"cannot override data","overrides.data",overrides.data);if(overrides.from){overrides.from=overrides.from}return overrides}async function resolveArgs(_runner,inputs,args){const runner=getRunner(_runner,"resolveName");const resolver=canResolve(runner)?runner:null;return await Promise.all(inputs.map((param,index)=>{return param.walkAsync(args[index],(type,value)=>{value=Typed.dereference(value,type);if(type==="address"){return resolveAddress(value,resolver)}return value})}))}function buildWrappedFallback(contract){const populateTransaction=async function(overrides){const tx=await copyOverrides(overrides,["data"]);tx.to=await contract.getAddress();if(tx.from){tx.from=await resolveAddress(tx.from,getResolver(contract.runner))}const iface=contract.interface;const noValue=getBigInt(tx.value||BN_0$1,"overrides.value")===BN_0$1;const noData=(tx.data||"0x")==="0x";if(iface.fallback&&!iface.fallback.payable&&iface.receive&&!noData&&!noValue){assertArgument(false,"cannot send data to receive or send value to non-payable fallback","overrides",overrides)}assertArgument(iface.fallback||noData,"cannot send data to receive-only contract","overrides.data",tx.data);const payable=iface.receive||iface.fallback&&iface.fallback.payable;assertArgument(payable||noValue,"cannot send value to non-payable fallback","overrides.value",tx.value);assertArgument(iface.fallback||noData,"cannot send data to receive-only contract","overrides.data",tx.data);return tx};const staticCall=async function(overrides){const runner=getRunner(contract.runner,"call");assert(canCall(runner),"contract runner does not support calling","UNSUPPORTED_OPERATION",{operation:"call"});const tx=await populateTransaction(overrides);try{return await runner.call(tx)}catch(error){if(isCallException(error)&&error.data){throw contract.interface.makeError(error.data,tx)}throw error}};const send=async function(overrides){const runner=contract.runner;assert(canSend(runner),"contract runner does not support sending transactions","UNSUPPORTED_OPERATION",{operation:"sendTransaction"});const tx=await runner.sendTransaction(await populateTransaction(overrides));const provider=getProvider(contract.runner);return new ContractTransactionResponse(contract.interface,provider,tx)};const estimateGas=async function(overrides){const runner=getRunner(contract.runner,"estimateGas");assert(canEstimate(runner),"contract runner does not support gas estimation","UNSUPPORTED_OPERATION",{operation:"estimateGas"});return await runner.estimateGas(await populateTransaction(overrides))};const method=async overrides=>{return await send(overrides)};defineProperties(method,{_contract:contract,estimateGas:estimateGas,populateTransaction:populateTransaction,send:send,staticCall:staticCall});return method}function buildWrappedMethod(contract,key){const getFragment=function(...args){const fragment=contract.interface.getFunction(key,args);assert(fragment,"no matching fragment","UNSUPPORTED_OPERATION",{operation:"fragment",info:{key:key,args:args}});return fragment};const populateTransaction=async function(...args){const fragment=getFragment(...args);let overrides={};if(fragment.inputs.length+1===args.length){overrides=await copyOverrides(args.pop());if(overrides.from){overrides.from=await resolveAddress(overrides.from,getResolver(contract.runner))}}if(fragment.inputs.length!==args.length){throw new Error("internal error: fragment inputs doesn't match arguments; should not happen")}const resolvedArgs=await resolveArgs(contract.runner,fragment.inputs,args);return Object.assign({},overrides,await resolveProperties({to:contract.getAddress(),data:contract.interface.encodeFunctionData(fragment,resolvedArgs)}))};const staticCall=async function(...args){const result=await staticCallResult(...args);if(result.length===1){return result[0]}return result};const send=async function(...args){const runner=contract.runner;assert(canSend(runner),"contract runner does not support sending transactions","UNSUPPORTED_OPERATION",{operation:"sendTransaction"});const tx=await runner.sendTransaction(await populateTransaction(...args));const provider=getProvider(contract.runner);return new ContractTransactionResponse(contract.interface,provider,tx)};const estimateGas=async function(...args){const runner=getRunner(contract.runner,"estimateGas");assert(canEstimate(runner),"contract runner does not support gas estimation","UNSUPPORTED_OPERATION",{operation:"estimateGas"});return await runner.estimateGas(await populateTransaction(...args))};const staticCallResult=async function(...args){const runner=getRunner(contract.runner,"call");assert(canCall(runner),"contract runner does not support calling","UNSUPPORTED_OPERATION",{operation:"call"});const tx=await populateTransaction(...args);let result="0x";try{result=await runner.call(tx)}catch(error){if(isCallException(error)&&error.data){throw contract.interface.makeError(error.data,tx)}throw error}const fragment=getFragment(...args);return contract.interface.decodeFunctionResult(fragment,result)};const method=async(...args)=>{const fragment=getFragment(...args);if(fragment.constant){return await staticCall(...args)}return await send(...args)};defineProperties(method,{name:contract.interface.getFunctionName(key),_contract:contract,_key:key,getFragment:getFragment,estimateGas:estimateGas,populateTransaction:populateTransaction,send:send,staticCall:staticCall,staticCallResult:staticCallResult});Object.defineProperty(method,"fragment",{configurable:false,enumerable:true,get:()=>{const fragment=contract.interface.getFunction(key);assert(fragment,"no matching fragment","UNSUPPORTED_OPERATION",{operation:"fragment",info:{key:key}});return fragment}});return method}function buildWrappedEvent(contract,key){const getFragment=function(...args){const fragment=contract.interface.getEvent(key,args);assert(fragment,"no matching fragment","UNSUPPORTED_OPERATION",{operation:"fragment",info:{key:key,args:args}});return fragment};const method=function(...args){return new PreparedTopicFilter(contract,getFragment(...args),args)};defineProperties(method,{name:contract.interface.getEventName(key),_contract:contract,_key:key,getFragment:getFragment});Object.defineProperty(method,"fragment",{configurable:false,enumerable:true,get:()=>{const fragment=contract.interface.getEvent(key);assert(fragment,"no matching fragment","UNSUPPORTED_OPERATION",{operation:"fragment",info:{key:key}});return fragment}});return method}const internal=Symbol.for("_ethersInternal_contract");const internalValues=new WeakMap;function setInternal(contract,values){internalValues.set(contract[internal],values)}function getInternal(contract){return internalValues.get(contract[internal])}function isDeferred(value){return value&&typeof value==="object"&&"getTopicFilter"in value&&typeof value.getTopicFilter==="function"&&value.fragment}async function getSubInfo(contract,event){let topics;let fragment=null;if(Array.isArray(event)){const topicHashify=function(name){if(isHexString(name,32)){return name}const fragment=contract.interface.getEvent(name);assertArgument(fragment,"unknown fragment","name",name);return fragment.topicHash};topics=event.map(e=>{if(e==null){return null}if(Array.isArray(e)){return e.map(topicHashify)}return topicHashify(e)})}else if(event==="*"){topics=[null]}else if(typeof event==="string"){if(isHexString(event,32)){topics=[event]}else{fragment=contract.interface.getEvent(event);assertArgument(fragment,"unknown fragment","event",event);topics=[fragment.topicHash]}}else if(isDeferred(event)){topics=await event.getTopicFilter()}else if("fragment"in event){fragment=event.fragment;topics=[fragment.topicHash]}else{assertArgument(false,"unknown event name","event",event)}topics=topics.map(t=>{if(t==null){return null}if(Array.isArray(t)){const items=Array.from(new Set(t.map(t=>t.toLowerCase())).values());if(items.length===1){return items[0]}items.sort();return items}return t.toLowerCase()});const tag=topics.map(t=>{if(t==null){return"null"}if(Array.isArray(t)){return t.join("|")}return t}).join("&");return{fragment:fragment,tag:tag,topics:topics}}async function hasSub(contract,event){const{subs}=getInternal(contract);return subs.get((await getSubInfo(contract,event)).tag)||null}async function getSub(contract,operation,event){const provider=getProvider(contract.runner);assert(provider,"contract runner does not support subscribing","UNSUPPORTED_OPERATION",{operation:operation});const{fragment,tag,topics}=await getSubInfo(contract,event);const{addr,subs}=getInternal(contract);let sub=subs.get(tag);if(!sub){const address=addr?addr:contract;const filter={address:address,topics:topics};const listener=log=>{let foundFragment=fragment;if(foundFragment==null){try{foundFragment=contract.interface.getEvent(log.topics[0])}catch(error){}}if(foundFragment){const _foundFragment=foundFragment;const args=fragment?contract.interface.decodeEventLog(fragment,log.data,log.topics):[];emit(contract,event,args,listener=>{return new ContractEventPayload(contract,listener,event,_foundFragment,log)})}else{emit(contract,event,[],listener=>{return new ContractUnknownEventPayload(contract,listener,event,log)})}};let starting=[];const start=()=>{if(starting.length){return}starting.push(provider.on(filter,listener))};const stop=async()=>{if(starting.length==0){return}let started=starting;starting=[];await Promise.all(started);provider.off(filter,listener)};sub={tag:tag,listeners:[],start:start,stop:stop};subs.set(tag,sub)}return sub}let lastEmit=Promise.resolve();async function _emit(contract,event,args,payloadFunc){await lastEmit;const sub=await hasSub(contract,event);if(!sub){return false}const count=sub.listeners.length;sub.listeners=sub.listeners.filter(({listener,once})=>{const passArgs=Array.from(args);if(payloadFunc){passArgs.push(payloadFunc(once?null:listener))}try{listener.call(contract,...passArgs)}catch(error){}return!once});if(sub.listeners.length===0){sub.stop();getInternal(contract).subs.delete(sub.tag)}return count>0}async function emit(contract,event,args,payloadFunc){try{await lastEmit}catch(error){}const resultPromise=_emit(contract,event,args,payloadFunc);lastEmit=resultPromise;return await resultPromise}const passProperties=["then"];class BaseContract{target;interface;runner;filters;[internal];fallback;constructor(target,abi,runner,_deployTx){assertArgument(typeof target==="string"||isAddressable(target),"invalid value for Contract target","target",target);if(runner==null){runner=null}const iface=Interface.from(abi);defineProperties(this,{target:target,runner:runner,interface:iface});Object.defineProperty(this,internal,{value:{}});let addrPromise;let addr=null;let deployTx=null;if(_deployTx){const provider=getProvider(runner);deployTx=new ContractTransactionResponse(this.interface,provider,_deployTx)}let subs=new Map;if(typeof target==="string"){if(isHexString(target)){addr=target;addrPromise=Promise.resolve(target)}else{const resolver=getRunner(runner,"resolveName");if(!canResolve(resolver)){throw makeError("contract runner does not support name resolution","UNSUPPORTED_OPERATION",{operation:"resolveName"})}addrPromise=resolver.resolveName(target).then(addr=>{if(addr==null){throw makeError("an ENS name used for a contract target must be correctly configured","UNCONFIGURED_NAME",{value:target})}getInternal(this).addr=addr;return addr})}}else{addrPromise=target.getAddress().then(addr=>{if(addr==null){throw new Error("TODO")}getInternal(this).addr=addr;return addr})}setInternal(this,{addrPromise:addrPromise,addr:addr,deployTx:deployTx,subs:subs});const filters=new Proxy({},{get:(target,prop,receiver)=>{if(typeof prop==="symbol"||passProperties.indexOf(prop)>=0){return Reflect.get(target,prop,receiver)}try{return this.getEvent(prop)}catch(error){if(!isError(error,"INVALID_ARGUMENT")||error.argument!=="key"){throw error}}return undefined},has:(target,prop)=>{if(passProperties.indexOf(prop)>=0){return Reflect.has(target,prop)}return Reflect.has(target,prop)||this.interface.hasEvent(String(prop))}});defineProperties(this,{filters:filters});defineProperties(this,{fallback:iface.receive||iface.fallback?buildWrappedFallback(this):null});return new Proxy(this,{get:(target,prop,receiver)=>{if(typeof prop==="symbol"||prop in target||passProperties.indexOf(prop)>=0){return Reflect.get(target,prop,receiver)}try{return target.getFunction(prop)}catch(error){if(!isError(error,"INVALID_ARGUMENT")||error.argument!=="key"){throw error}}return undefined},has:(target,prop)=>{if(typeof prop==="symbol"||prop in target||passProperties.indexOf(prop)>=0){return Reflect.has(target,prop)}return target.interface.hasFunction(prop)}})}connect(runner){return new BaseContract(this.target,this.interface,runner)}attach(target){return new BaseContract(target,this.interface,this.runner)}async getAddress(){return await getInternal(this).addrPromise}async getDeployedCode(){const provider=getProvider(this.runner);assert(provider,"runner does not support .provider","UNSUPPORTED_OPERATION",{operation:"getDeployedCode"});const code=await provider.getCode(await this.getAddress());if(code==="0x"){return null}return code}async waitForDeployment(){const deployTx=this.deploymentTransaction();if(deployTx){await deployTx.wait();return this}const code=await this.getDeployedCode();if(code!=null){return this}const provider=getProvider(this.runner);assert(provider!=null,"contract runner does not support .provider","UNSUPPORTED_OPERATION",{operation:"waitForDeployment"});return new Promise((resolve,reject)=>{const checkCode=async()=>{try{const code=await this.getDeployedCode();if(code!=null){return resolve(this)}provider.once("block",checkCode)}catch(error){reject(error)}};checkCode()})}deploymentTransaction(){return getInternal(this).deployTx}getFunction(key){if(typeof key!=="string"){key=key.format()}const func=buildWrappedMethod(this,key);return func}getEvent(key){if(typeof key!=="string"){key=key.format()}return buildWrappedEvent(this,key)}async queryTransaction(hash){throw new Error("@TODO")}async queryFilter(event,fromBlock,toBlock){if(fromBlock==null){fromBlock=0}if(toBlock==null){toBlock="latest"}const{addr,addrPromise}=getInternal(this);const address=addr?addr:await addrPromise;const{fragment,topics}=await getSubInfo(this,event);const filter={address:address,topics:topics,fromBlock:fromBlock,toBlock:toBlock};const provider=getProvider(this.runner);assert(provider,"contract runner does not have a provider","UNSUPPORTED_OPERATION",{operation:"queryFilter"});return(await provider.getLogs(filter)).map(log=>{let foundFragment=fragment;if(foundFragment==null){try{foundFragment=this.interface.getEvent(log.topics[0])}catch(error){}}if(foundFragment){try{return new EventLog(log,this.interface,foundFragment)}catch(error){return new UndecodedEventLog(log,error)}}return new Log(log,provider)})}async on(event,listener){const sub=await getSub(this,"on",event);sub.listeners.push({listener:listener,once:false});sub.start();return this}async once(event,listener){const sub=await getSub(this,"once",event);sub.listeners.push({listener:listener,once:true});sub.start();return this}async emit(event,...args){return await emit(this,event,args,null)}async listenerCount(event){if(event){const sub=await hasSub(this,event);if(!sub){return 0}return sub.listeners.length}const{subs}=getInternal(this);let total=0;for(const{listeners}of subs.values()){total+=listeners.length}return total}async listeners(event){if(event){const sub=await hasSub(this,event);if(!sub){return[]}return sub.listeners.map(({listener})=>listener)}const{subs}=getInternal(this);let result=[];for(const{listeners}of subs.values()){result=result.concat(listeners.map(({listener})=>listener))}return result}async off(event,listener){const sub=await hasSub(this,event);if(!sub){return this}if(listener){const index=sub.listeners.map(({listener})=>listener).indexOf(listener);if(index>=0){sub.listeners.splice(index,1)}}if(listener==null||sub.listeners.length===0){sub.stop();getInternal(this).subs.delete(sub.tag)}return this}async removeAllListeners(event){if(event){const sub=await hasSub(this,event);if(!sub){return this}sub.stop();getInternal(this).subs.delete(sub.tag)}else{const{subs}=getInternal(this);for(const{tag,stop}of subs.values()){stop();subs.delete(tag)}}return this}async addListener(event,listener){return await this.on(event,listener)}async removeListener(event,listener){return await this.off(event,listener)}static buildClass(abi){class CustomContract extends BaseContract{constructor(address,runner=null){super(address,abi,runner)}}return CustomContract}static from(target,abi,runner){if(runner==null){runner=null}const contract=new this(target,abi,runner);return contract}}function _ContractBase(){return BaseContract}class Contract extends _ContractBase(){}class ContractFactory{interface;bytecode;runner;constructor(abi,bytecode,runner){const iface=Interface.from(abi);if(bytecode instanceof Uint8Array){bytecode=hexlify(getBytes(bytecode))}else{if(typeof bytecode==="object"){bytecode=bytecode.object}if(!bytecode.startsWith("0x")){bytecode="0x"+bytecode}bytecode=hexlify(getBytes(bytecode))}defineProperties(this,{bytecode:bytecode,interface:iface,runner:runner||null})}attach(target){return new BaseContract(target,this.interface,this.runner)}async getDeployTransaction(...args){let overrides={};const fragment=this.interface.deploy;if(fragment.inputs.length+1===args.length){overrides=await copyOverrides(args.pop())}if(fragment.inputs.length!==args.length){throw new Error("incorrect number of arguments to constructor")}const resolvedArgs=await resolveArgs(this.runner,fragment.inputs,args);const data=concat([this.bytecode,this.interface.encodeDeploy(resolvedArgs)]);return Object.assign({},overrides,{data:data})}async deploy(...args){const tx=await this.getDeployTransaction(...args);assert(this.runner&&typeof this.runner.sendTransaction==="function","factory runner does not support sending transactions","UNSUPPORTED_OPERATION",{operation:"sendTransaction"});const sentTx=await this.runner.sendTransaction(tx);const address=getCreateAddress(sentTx);return new BaseContract(address,this.interface,this.runner,sentTx)}connect(runner){return new ContractFactory(this.interface,this.bytecode,runner)}static fromSolidity(output,runner){assertArgument(output!=null,"bad compiler output","output",output);if(typeof output==="string"){output=JSON.parse(output)}const abi=output.abi;let bytecode="";if(output.bytecode){bytecode=output.bytecode}else if(output.evm&&output.evm.bytecode){bytecode=output.evm.bytecode}return new this(abi,bytecode,runner)}}function getIpfsLink(link){if(link.match(/^ipfs:\/\/ipfs\//i)){link=link.substring(12)}else if(link.match(/^ipfs:\/\//i)){link=link.substring(7)}else{assertArgument(false,"unsupported IPFS format","link",link)}return`https:/\/gateway.ipfs.io/ipfs/${link}`}class MulticoinProviderPlugin{name;constructor(name){defineProperties(this,{name:name})}connect(proivder){return this}supportsCoinType(coinType){return false}async encodeAddress(coinType,address){throw new Error("unsupported coin")}async decodeAddress(coinType,data){throw new Error("unsupported coin")}}const matcherIpfs=new RegExp("^(ipfs)://(.*)$","i");const matchers=[new RegExp("^(https)://(.*)$","i"),new RegExp("^(data):(.*)$","i"),matcherIpfs,new RegExp("^eip155:[0-9]+/(erc[0-9]+):(.*)$","i")];class EnsResolver{provider;address;name;#supports2544;#resolver;constructor(provider,address,name){defineProperties(this,{provider:provider,address:address,name:name});this.#supports2544=null;this.#resolver=new Contract(address,["function supportsInterface(bytes4) view returns (bool)","function resolve(bytes, bytes) view returns (bytes)","function addr(bytes32) view returns (address)","function addr(bytes32, uint) view returns (bytes)","function text(bytes32, string) view returns (string)","function contenthash(bytes32) view returns (bytes)"],provider)}async supportsWildcard(){if(this.#supports2544==null){this.#supports2544=(async()=>{try{return await this.#resolver.supportsInterface("0x9061b923")}catch(error){if(isError(error,"CALL_EXCEPTION")){return false}this.#supports2544=null;throw error}})()}return await this.#supports2544}async#fetch(funcName,params){params=(params||[]).slice();const iface=this.#resolver.interface;params.unshift(namehash(this.name));let fragment=null;if(await this.supportsWildcard()){fragment=iface.getFunction(funcName);assert(fragment,"missing fragment","UNKNOWN_ERROR",{info:{funcName:funcName}});params=[dnsEncode(this.name,255),iface.encodeFunctionData(fragment,params)];funcName="resolve(bytes,bytes)"}params.push({enableCcipRead:true});try{const result=await this.#resolver[funcName](...params);if(fragment){return iface.decodeFunctionResult(fragment,result)[0]}return result}catch(error){if(!isError(error,"CALL_EXCEPTION")){throw error}}return null}async getAddress(coinType){if(coinType==null){coinType=60}if(coinType===60){try{const result=await this.#fetch("addr(bytes32)");if(result==null||result===ZeroAddress){return null}return result}catch(error){if(isError(error,"CALL_EXCEPTION")){return null}throw error}}if(coinType>=0&&coinType<2147483648){let ethCoinType=coinType+2147483648;const data=await this.#fetch("addr(bytes32,uint)",[ethCoinType]);if(isHexString(data,20)){return getAddress(data)}}let coinPlugin=null;for(const plugin of this.provider.plugins){if(!(plugin instanceof MulticoinProviderPlugin)){continue}if(plugin.supportsCoinType(coinType)){coinPlugin=plugin;break}}if(coinPlugin==null){return null}const data=await this.#fetch("addr(bytes32,uint)",[coinType]);if(data==null||data==="0x"){return null}const address=await coinPlugin.decodeAddress(coinType,data);if(address!=null){return address}assert(false,`invalid coin data`,"UNSUPPORTED_OPERATION",{operation:`getAddress(${coinType})`,info:{coinType:coinType,data:data}})}async getText(key){const data=await this.#fetch("text(bytes32,string)",[key]);if(data==null||data==="0x"){return null}return data}async getContentHash(){const data=await this.#fetch("contenthash(bytes32)");if(data==null||data==="0x"){return null}const ipfs=data.match(/^0x(e3010170|e5010172)(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);if(ipfs){const scheme=ipfs[1]==="e3010170"?"ipfs":"ipns";const length=parseInt(ipfs[4],16);if(ipfs[5].length===length*2){return`${scheme}:/\/${encodeBase58("0x"+ipfs[2])}`}}const swarm=data.match(/^0xe40101fa011b20([0-9a-f]*)$/);if(swarm&&swarm[1].length===64){return`bzz:/\/${swarm[1]}`}assert(false,`invalid or unsupported content hash data`,"UNSUPPORTED_OPERATION",{operation:"getContentHash()",info:{data:data}})}async getAvatar(){const avatar=await this._getAvatar();return avatar.url}async _getAvatar(){const linkage=[{type:"name",value:this.name}];try{const avatar=await this.getText("avatar");if(avatar==null){linkage.push({type:"!avatar",value:""});return{url:null,linkage:linkage}}linkage.push({type:"avatar",value:avatar});for(let i=0;i{if(allowNull&&array==null){return null}if(!Array.isArray(array)){throw new Error("not an array")}return array.map(i=>format(i))}}function object(format,altNames){return value=>{const result={};for(const key in format){let srcKey=key;if(altNames&&key in altNames&&!(srcKey in value)){for(const altKey of altNames[key]){if(altKey in value){srcKey=altKey;break}}}try{const nv=format[key](value[srcKey]);if(nv!==undefined){result[key]=nv}}catch(error){const message=error instanceof Error?error.message:"not-an-error";assert(false,`invalid value for value.${key} (${message})`,"BAD_DATA",{value:value})}}return result}}function formatBoolean(value){switch(value){case true:case"true":return true;case false:case"false":return false}assertArgument(false,`invalid boolean; ${JSON.stringify(value)}`,"value",value)}function formatData(value){assertArgument(isHexString(value,true),"invalid data","value",value);return value}function formatHash(value){assertArgument(isHexString(value,32),"invalid hash","value",value);return value}const _formatLog=object({address:getAddress,blockHash:formatHash,blockNumber:getNumber,data:formatData,index:getNumber,removed:allowNull(formatBoolean,false),topics:arrayOf(formatHash),transactionHash:formatHash,transactionIndex:getNumber},{index:["logIndex"]});function formatLog(value){return _formatLog(value)}const _formatBlock=object({hash:allowNull(formatHash),parentHash:formatHash,parentBeaconBlockRoot:allowNull(formatHash,null),number:getNumber,timestamp:getNumber,nonce:allowNull(formatData),difficulty:getBigInt,gasLimit:getBigInt,gasUsed:getBigInt,stateRoot:allowNull(formatHash,null),receiptsRoot:allowNull(formatHash,null),blobGasUsed:allowNull(getBigInt,null),excessBlobGas:allowNull(getBigInt,null),miner:allowNull(getAddress),prevRandao:allowNull(formatHash,null),extraData:formatData,baseFeePerGas:allowNull(getBigInt)},{prevRandao:["mixHash"]});function formatBlock(value){const result=_formatBlock(value);result.transactions=value.transactions.map(tx=>{if(typeof tx==="string"){return tx}return formatTransactionResponse(tx)});return result}const _formatReceiptLog=object({transactionIndex:getNumber,blockNumber:getNumber,transactionHash:formatHash,address:getAddress,topics:arrayOf(formatHash),data:formatData,index:getNumber,blockHash:formatHash},{index:["logIndex"]});function formatReceiptLog(value){return _formatReceiptLog(value)}const _formatTransactionReceipt=object({to:allowNull(getAddress,null),from:allowNull(getAddress,null),contractAddress:allowNull(getAddress,null),index:getNumber,root:allowNull(hexlify),gasUsed:getBigInt,blobGasUsed:allowNull(getBigInt,null),logsBloom:allowNull(formatData),blockHash:formatHash,hash:formatHash,logs:arrayOf(formatReceiptLog),blockNumber:getNumber,cumulativeGasUsed:getBigInt,effectiveGasPrice:allowNull(getBigInt),blobGasPrice:allowNull(getBigInt,null),status:allowNull(getNumber),type:allowNull(getNumber,0)},{effectiveGasPrice:["gasPrice"],hash:["transactionHash"],index:["transactionIndex"]});function formatTransactionReceipt(value){return _formatTransactionReceipt(value)}function formatTransactionResponse(value){if(value.to&&getBigInt(value.to)===BN_0){value.to="0x0000000000000000000000000000000000000000"}const result=object({hash:formatHash,index:allowNull(getNumber,undefined),type:value=>{if(value==="0x"||value==null){return 0}return getNumber(value)},accessList:allowNull(accessListify,null),blobVersionedHashes:allowNull(arrayOf(formatHash,true),null),authorizationList:allowNull(arrayOf(v=>{let sig;if(v.signature){sig=v.signature}else{let yParity=v.yParity;if(yParity==="0x1b"){yParity=0}else if(yParity==="0x1c"){yParity=1}sig=Object.assign({},v,{yParity:yParity})}return{address:getAddress(v.address),chainId:getBigInt(v.chainId),nonce:getBigInt(v.nonce),signature:Signature.from(sig)}},false),null),blockHash:allowNull(formatHash,null),blockNumber:allowNull(getNumber,null),transactionIndex:allowNull(getNumber,null),from:getAddress,gasPrice:allowNull(getBigInt),maxPriorityFeePerGas:allowNull(getBigInt),maxFeePerGas:allowNull(getBigInt),maxFeePerBlobGas:allowNull(getBigInt,null),gasLimit:getBigInt,to:allowNull(getAddress,null),value:getBigInt,nonce:getNumber,data:formatData,creates:allowNull(getAddress,null),chainId:allowNull(getBigInt,null)},{data:["input"],gasLimit:["gas"],index:["transactionIndex"]})(value);if(result.to==null&&result.creates==null){result.creates=getCreateAddress(result)}if((value.type===1||value.type===2)&&value.accessList==null){result.accessList=[]}if(value.signature){result.signature=Signature.from(value.signature)}else{result.signature=Signature.from(value)}if(result.chainId==null){const chainId=result.signature.legacyChainId;if(chainId!=null){result.chainId=chainId}}if(result.blockHash&&getBigInt(result.blockHash)===BN_0){result.blockHash=null}return result}const EnsAddress="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e";class NetworkPlugin{name;constructor(name){defineProperties(this,{name:name})}clone(){return new NetworkPlugin(this.name)}}class GasCostPlugin extends NetworkPlugin{effectiveBlock;txBase;txCreate;txDataZero;txDataNonzero;txAccessListStorageKey;txAccessListAddress;constructor(effectiveBlock,costs){if(effectiveBlock==null){effectiveBlock=0}super(`org.ethers.network.plugins.GasCost#${effectiveBlock||0}`);const props={effectiveBlock:effectiveBlock};function set(name,nullish){let value=(costs||{})[name];if(value==null){value=nullish}assertArgument(typeof value==="number",`invalud value for ${name}`,"costs",costs);props[name]=value}set("txBase",21e3);set("txCreate",32e3);set("txDataZero",4);set("txDataNonzero",16);set("txAccessListStorageKey",1900);set("txAccessListAddress",2400);defineProperties(this,props)}clone(){return new GasCostPlugin(this.effectiveBlock,this)}}class EnsPlugin extends NetworkPlugin{address;targetNetwork;constructor(address,targetNetwork){super("org.ethers.plugins.network.Ens");defineProperties(this,{address:address||EnsAddress,targetNetwork:targetNetwork==null?1:targetNetwork})}clone(){return new EnsPlugin(this.address,this.targetNetwork)}}class FeeDataNetworkPlugin extends NetworkPlugin{#feeDataFunc;get feeDataFunc(){return this.#feeDataFunc}constructor(feeDataFunc){super("org.ethers.plugins.network.FeeData");this.#feeDataFunc=feeDataFunc}async getFeeData(provider){return await this.#feeDataFunc(provider)}clone(){return new FeeDataNetworkPlugin(this.#feeDataFunc)}}class FetchUrlFeeDataNetworkPlugin extends NetworkPlugin{#url;#processFunc;get url(){return this.#url}get processFunc(){return this.#processFunc}constructor(url,processFunc){super("org.ethers.plugins.network.FetchUrlFeeDataPlugin");this.#url=url;this.#processFunc=processFunc}clone(){return this}}const Networks=new Map;class Network{#name;#chainId;#plugins;constructor(name,chainId){this.#name=name;this.#chainId=getBigInt(chainId);this.#plugins=new Map}toJSON(){return{name:this.name,chainId:String(this.chainId)}}get name(){return this.#name}set name(value){this.#name=value}get chainId(){return this.#chainId}set chainId(value){this.#chainId=getBigInt(value,"chainId")}matches(other){if(other==null){return false}if(typeof other==="string"){try{return this.chainId===getBigInt(other)}catch(error){}return this.name===other}if(typeof other==="number"||typeof other==="bigint"){try{return this.chainId===getBigInt(other)}catch(error){}return false}if(typeof other==="object"){if(other.chainId!=null){try{return this.chainId===getBigInt(other.chainId)}catch(error){}return false}if(other.name!=null){return this.name===other.name}return false}return false}get plugins(){return Array.from(this.#plugins.values())}attachPlugin(plugin){if(this.#plugins.get(plugin.name)){throw new Error(`cannot replace existing plugin: ${plugin.name} `)}this.#plugins.set(plugin.name,plugin.clone());return this}getPlugin(name){return this.#plugins.get(name)||null}getPlugins(basename){return this.plugins.filter(p=>p.name.split("#")[0]===basename)}clone(){const clone=new Network(this.name,this.chainId);this.plugins.forEach(plugin=>{clone.attachPlugin(plugin.clone())});return clone}computeIntrinsicGas(tx){const costs=this.getPlugin("org.ethers.plugins.network.GasCost")||new GasCostPlugin;let gas=costs.txBase;if(tx.to==null){gas+=costs.txCreate}if(tx.data){for(let i=2;i9){let frac=BigInt(comps[1].substring(0,9));if(!comps[1].substring(9).match(/^0+$/)){frac++}comps[1]=frac.toString()}return BigInt(comps[0]+comps[1])}function getGasStationPlugin(url){return new FetchUrlFeeDataNetworkPlugin(url,async(fetchFeeData,provider,request)=>{request.setHeader("User-Agent","ethers");let response;try{const[_response,_feeData]=await Promise.all([request.send(),fetchFeeData()]);response=_response;const payload=response.bodyJson.standard;const feeData={gasPrice:_feeData.gasPrice,maxFeePerGas:parseUnits(payload.maxFee,9),maxPriorityFeePerGas:parseUnits(payload.maxPriorityFee,9)};return feeData}catch(error){assert(false,`error encountered with polygon gas station (${JSON.stringify(request.url)})`,"SERVER_ERROR",{request:request,response:response,error:error})}})}let injected=false;function injectCommonNetworks(){if(injected){return}injected=true;function registerEth(name,chainId,options){const func=function(){const network=new Network(name,chainId);if(options.ensNetwork!=null){network.attachPlugin(new EnsPlugin(null,options.ensNetwork))}network.attachPlugin(new GasCostPlugin);(options.plugins||[]).forEach(plugin=>{network.attachPlugin(plugin)});return network};Network.register(name,func);Network.register(chainId,func);if(options.altNames){options.altNames.forEach(name=>{Network.register(name,func)})}}registerEth("mainnet",1,{ensNetwork:1,altNames:["homestead"]});registerEth("ropsten",3,{ensNetwork:3});registerEth("rinkeby",4,{ensNetwork:4});registerEth("goerli",5,{ensNetwork:5});registerEth("kovan",42,{ensNetwork:42});registerEth("sepolia",11155111,{ensNetwork:11155111});registerEth("holesky",17e3,{ensNetwork:17e3});registerEth("classic",61,{});registerEth("classicKotti",6,{});registerEth("arbitrum",42161,{ensNetwork:1});registerEth("arbitrum-goerli",421613,{});registerEth("arbitrum-sepolia",421614,{});registerEth("base",8453,{ensNetwork:1});registerEth("base-goerli",84531,{});registerEth("base-sepolia",84532,{});registerEth("bnb",56,{ensNetwork:1});registerEth("bnbt",97,{});registerEth("linea",59144,{ensNetwork:1});registerEth("linea-goerli",59140,{});registerEth("linea-sepolia",59141,{});registerEth("matic",137,{ensNetwork:1,plugins:[getGasStationPlugin("https://gasstation.polygon.technology/v2")]});registerEth("matic-amoy",80002,{});registerEth("matic-mumbai",80001,{altNames:["maticMumbai","maticmum"],plugins:[getGasStationPlugin("https://gasstation-testnet.polygon.technology/v2")]});registerEth("optimism",10,{ensNetwork:1,plugins:[]});registerEth("optimism-goerli",420,{});registerEth("optimism-sepolia",11155420,{});registerEth("xdai",100,{ensNetwork:1})}function copy$2(obj){return JSON.parse(JSON.stringify(obj))}class PollingBlockSubscriber{#provider;#poller;#interval;#blockNumber;constructor(provider){this.#provider=provider;this.#poller=null;this.#interval=4e3;this.#blockNumber=-2}get pollingInterval(){return this.#interval}set pollingInterval(value){this.#interval=value}async#poll(){try{const blockNumber=await this.#provider.getBlockNumber();if(this.#blockNumber===-2){this.#blockNumber=blockNumber;return}if(blockNumber!==this.#blockNumber){for(let b=this.#blockNumber+1;b<=blockNumber;b++){if(this.#poller==null){return}await this.#provider.emit("block",b)}this.#blockNumber=blockNumber}}catch(error){}if(this.#poller==null){return}this.#poller=this.#provider._setTimeout(this.#poll.bind(this),this.#interval)}start(){if(this.#poller){return}this.#poller=this.#provider._setTimeout(this.#poll.bind(this),this.#interval);this.#poll()}stop(){if(!this.#poller){return}this.#provider._clearTimeout(this.#poller);this.#poller=null}pause(dropWhilePaused){this.stop();if(dropWhilePaused){this.#blockNumber=-2}}resume(){this.start()}}class OnBlockSubscriber{#provider;#poll;#running;constructor(provider){this.#provider=provider;this.#running=false;this.#poll=blockNumber=>{this._poll(blockNumber,this.#provider)}}async _poll(blockNumber,provider){throw new Error("sub-classes must override this")}start(){if(this.#running){return}this.#running=true;this.#poll(-2);this.#provider.on("block",this.#poll)}stop(){if(!this.#running){return}this.#running=false;this.#provider.off("block",this.#poll)}pause(dropWhilePaused){this.stop()}resume(){this.start()}}class PollingBlockTagSubscriber extends OnBlockSubscriber{#tag;#lastBlock;constructor(provider,tag){super(provider);this.#tag=tag;this.#lastBlock=-2}pause(dropWhilePaused){if(dropWhilePaused){this.#lastBlock=-2}super.pause(dropWhilePaused)}async _poll(blockNumber,provider){const block=await provider.getBlock(this.#tag);if(block==null){return}if(this.#lastBlock===-2){this.#lastBlock=block.number}else if(block.number>this.#lastBlock){provider.emit(this.#tag,block.number);this.#lastBlock=block.number}}}class PollingOrphanSubscriber extends OnBlockSubscriber{#filter;constructor(provider,filter){super(provider);this.#filter=copy$2(filter)}async _poll(blockNumber,provider){throw new Error("@TODO")}}class PollingTransactionSubscriber extends OnBlockSubscriber{#hash;constructor(provider,hash){super(provider);this.#hash=hash}async _poll(blockNumber,provider){const tx=await provider.getTransactionReceipt(this.#hash);if(tx){provider.emit(this.#hash,tx)}}}class PollingEventSubscriber{#provider;#filter;#poller;#running;#blockNumber;constructor(provider,filter){this.#provider=provider;this.#filter=copy$2(filter);this.#poller=this.#poll.bind(this);this.#running=false;this.#blockNumber=-2}async#poll(blockNumber){if(this.#blockNumber===-2){return}const filter=copy$2(this.#filter);filter.fromBlock=this.#blockNumber+1;filter.toBlock=blockNumber;const logs=await this.#provider.getLogs(filter);if(logs.length===0){if(this.#blockNumber{this.#blockNumber=blockNumber})}this.#provider.on("block",this.#poller)}stop(){if(!this.#running){return}this.#running=false;this.#provider.off("block",this.#poller)}pause(dropWhilePaused){this.stop();if(dropWhilePaused){this.#blockNumber=-2}}resume(){this.start()}}const BN_2$1=BigInt(2);const MAX_CCIP_REDIRECTS=10;function isPromise$1(value){return value&&typeof value.then==="function"}function getTag(prefix,value){return prefix+":"+JSON.stringify(value,(k,v)=>{if(v==null){return"null"}if(typeof v==="bigint"){return`bigint:${v.toString()}`}if(typeof v==="string"){return v.toLowerCase()}if(typeof v==="object"&&!Array.isArray(v)){const keys=Object.keys(v);keys.sort();return keys.reduce((accum,key)=>{accum[key]=v[key];return accum},{})}return v})}class UnmanagedSubscriber{name;constructor(name){defineProperties(this,{name:name})}start(){}stop(){}pause(dropWhilePaused){}resume(){}}function copy$1(value){return JSON.parse(JSON.stringify(value))}function concisify(items){items=Array.from(new Set(items).values());items.sort();return items}async function getSubscription(_event,provider){if(_event==null){throw new Error("invalid event")}if(Array.isArray(_event)){_event={topics:_event}}if(typeof _event==="string"){switch(_event){case"block":case"debug":case"error":case"finalized":case"network":case"pending":case"safe":{return{type:_event,tag:_event}}}}if(isHexString(_event,32)){const hash=_event.toLowerCase();return{type:"transaction",tag:getTag("tx",{hash:hash}),hash:hash}}if(_event.orphan){const event=_event;return{type:"orphan",tag:getTag("orphan",event),filter:copy$1(event)}}if(_event.address||_event.topics){const event=_event;const filter={topics:(event.topics||[]).map(t=>{if(t==null){return null}if(Array.isArray(t)){return concisify(t.map(t=>t.toLowerCase()))}return t.toLowerCase()})};if(event.address){const addresses=[];const promises=[];const addAddress=addr=>{if(isHexString(addr)){addresses.push(addr)}else{promises.push((async()=>{addresses.push(await resolveAddress(addr,provider))})())}};if(Array.isArray(event.address)){event.address.forEach(addAddress)}else{addAddress(event.address)}if(promises.length){await Promise.all(promises)}filter.address=concisify(addresses.map(a=>a.toLowerCase()))}return{filter:filter,tag:getTag("event",filter),type:"event"}}assertArgument(false,"unknown ProviderEvent","event",_event)}function getTime$1(){return(new Date).getTime()}const defaultOptions$1={cacheTimeout:250,pollingInterval:4e3};class AbstractProvider{#subs;#plugins;#pausedState;#destroyed;#networkPromise;#anyNetwork;#performCache;#lastBlockNumber;#nextTimer;#timers;#disableCcipRead;#options;constructor(_network,options){this.#options=Object.assign({},defaultOptions$1,options||{});if(_network==="any"){this.#anyNetwork=true;this.#networkPromise=null}else if(_network){const network=Network.from(_network);this.#anyNetwork=false;this.#networkPromise=Promise.resolve(network);setTimeout(()=>{this.emit("network",network,null)},0)}else{this.#anyNetwork=false;this.#networkPromise=null}this.#lastBlockNumber=-1;this.#performCache=new Map;this.#subs=new Map;this.#plugins=new Map;this.#pausedState=null;this.#destroyed=false;this.#nextTimer=1;this.#timers=new Map;this.#disableCcipRead=false}get pollingInterval(){return this.#options.pollingInterval}get provider(){return this}get plugins(){return Array.from(this.#plugins.values())}attachPlugin(plugin){if(this.#plugins.get(plugin.name)){throw new Error(`cannot replace existing plugin: ${plugin.name} `)}this.#plugins.set(plugin.name,plugin.connect(this));return this}getPlugin(name){return this.#plugins.get(name)||null}get disableCcipRead(){return this.#disableCcipRead}set disableCcipRead(value){this.#disableCcipRead=!!value}async#perform(req){const timeout=this.#options.cacheTimeout;if(timeout<0){return await this._perform(req)}const tag=getTag(req.method,req);let perform=this.#performCache.get(tag);if(!perform){perform=this._perform(req);this.#performCache.set(tag,perform);setTimeout(()=>{if(this.#performCache.get(tag)===perform){this.#performCache.delete(tag)}},timeout)}return await perform}async ccipReadFetch(tx,calldata,urls){if(this.disableCcipRead||urls.length===0||tx.to==null){return null}const sender=tx.to.toLowerCase();const data=calldata.toLowerCase();const errorMessages=[];for(let i=0;i=500,`response not found during CCIP fetch: ${errorMessage}`,"OFFCHAIN_FAULT",{reason:"404_MISSING_RESOURCE",transaction:tx,info:{url:url,errorMessage:errorMessage}});errorMessages.push(errorMessage)}assert(false,`error encountered during CCIP fetch: ${errorMessages.map(m=>JSON.stringify(m)).join(", ")}`,"OFFCHAIN_FAULT",{reason:"500_SERVER_ERROR",transaction:tx,info:{urls:urls,errorMessages:errorMessages}})}_wrapBlock(value,network){return new Block(formatBlock(value),this)}_wrapLog(value,network){return new Log(formatLog(value),this)}_wrapTransactionReceipt(value,network){return new TransactionReceipt(formatTransactionReceipt(value),this)}_wrapTransactionResponse(tx,network){return new TransactionResponse(formatTransactionResponse(tx),this)}_detectNetwork(){assert(false,"sub-classes must implement this","UNSUPPORTED_OPERATION",{operation:"_detectNetwork"})}async _perform(req){assert(false,`unsupported method: ${req.method}`,"UNSUPPORTED_OPERATION",{operation:req.method,info:req})}async getBlockNumber(){const blockNumber=getNumber(await this.#perform({method:"getBlockNumber"}),"%response");if(this.#lastBlockNumber>=0){this.#lastBlockNumber=blockNumber}return blockNumber}_getAddress(address){return resolveAddress(address,this)}_getBlockTag(blockTag){if(blockTag==null){return"latest"}switch(blockTag){case"earliest":return"0x0";case"finalized":case"latest":case"pending":case"safe":return blockTag}if(isHexString(blockTag)){if(isHexString(blockTag,32)){return blockTag}return toQuantity(blockTag)}if(typeof blockTag==="bigint"){blockTag=getNumber(blockTag,"blockTag")}if(typeof blockTag==="number"){if(blockTag>=0){return toQuantity(blockTag)}if(this.#lastBlockNumber>=0){return toQuantity(this.#lastBlockNumber+blockTag)}return this.getBlockNumber().then(b=>toQuantity(b+blockTag))}assertArgument(false,"invalid blockTag","blockTag",blockTag)}_getFilter(filter){const topics=(filter.topics||[]).map(t=>{if(t==null){return null}if(Array.isArray(t)){return concisify(t.map(t=>t.toLowerCase()))}return t.toLowerCase()});const blockHash="blockHash"in filter?filter.blockHash:undefined;const resolve=(_address,fromBlock,toBlock)=>{let address=undefined;switch(_address.length){case 0:break;case 1:address=_address[0];break;default:_address.sort();address=_address}if(blockHash){if(fromBlock!=null||toBlock!=null){throw new Error("invalid filter")}}const filter={};if(address){filter.address=address}if(topics.length){filter.topics=topics}if(fromBlock){filter.fromBlock=fromBlock}if(toBlock){filter.toBlock=toBlock}if(blockHash){filter.blockHash=blockHash}return filter};let address=[];if(filter.address){if(Array.isArray(filter.address)){for(const addr of filter.address){address.push(this._getAddress(addr))}}else{address.push(this._getAddress(filter.address))}}let fromBlock=undefined;if("fromBlock"in filter){fromBlock=this._getBlockTag(filter.fromBlock)}let toBlock=undefined;if("toBlock"in filter){toBlock=this._getBlockTag(filter.toBlock)}if(address.filter(a=>typeof a!=="string").length||fromBlock!=null&&typeof fromBlock!=="string"||toBlock!=null&&typeof toBlock!=="string"){return Promise.all([Promise.all(address),fromBlock,toBlock]).then(result=>{return resolve(result[0],result[1],result[2])})}return resolve(address,fromBlock,toBlock)}_getTransactionRequest(_request){const request=copyRequest(_request);const promises=[];["to","from"].forEach(key=>{if(request[key]==null){return}const addr=resolveAddress(request[key],this);if(isPromise$1(addr)){promises.push(async function(){request[key]=await addr}())}else{request[key]=addr}});if(request.blockTag!=null){const blockTag=this._getBlockTag(request.blockTag);if(isPromise$1(blockTag)){promises.push(async function(){request.blockTag=await blockTag}())}else{request.blockTag=blockTag}}if(promises.length){return async function(){await Promise.all(promises);return request}()}return request}async getNetwork(){if(this.#networkPromise==null){const detectNetwork=(async()=>{try{const network=await this._detectNetwork();this.emit("network",network,null);return network}catch(error){if(this.#networkPromise===detectNetwork){this.#networkPromise=null}throw error}})();this.#networkPromise=detectNetwork;return(await detectNetwork).clone()}const networkPromise=this.#networkPromise;const[expected,actual]=await Promise.all([networkPromise,this._detectNetwork()]);if(expected.chainId!==actual.chainId){if(this.#anyNetwork){this.emit("network",actual,expected);if(this.#networkPromise===networkPromise){this.#networkPromise=Promise.resolve(actual)}}else{assert(false,`network changed: ${expected.chainId} => ${actual.chainId} `,"NETWORK_ERROR",{event:"changed"})}}return expected.clone()}async getFeeData(){const network=await this.getNetwork();const getFeeDataFunc=async()=>{const{_block,gasPrice,priorityFee}=await resolveProperties({_block:this.#getBlock("latest",false),gasPrice:(async()=>{try{const value=await this.#perform({method:"getGasPrice"});return getBigInt(value,"%response")}catch(error){}return null})(),priorityFee:(async()=>{try{const value=await this.#perform({method:"getPriorityFee"});return getBigInt(value,"%response")}catch(error){}return null})()});let maxFeePerGas=null;let maxPriorityFeePerGas=null;const block=this._wrapBlock(_block,network);if(block&&block.baseFeePerGas){maxPriorityFeePerGas=priorityFee!=null?priorityFee:BigInt("1000000000");maxFeePerGas=block.baseFeePerGas*BN_2$1+maxPriorityFeePerGas}return new FeeData(gasPrice,maxFeePerGas,maxPriorityFeePerGas)};const plugin=network.getPlugin("org.ethers.plugins.network.FetchUrlFeeDataPlugin");if(plugin){const req=new FetchRequest(plugin.url);const feeData=await plugin.processFunc(getFeeDataFunc,this,req);return new FeeData(feeData.gasPrice,feeData.maxFeePerGas,feeData.maxPriorityFeePerGas)}return await getFeeDataFunc()}async estimateGas(_tx){let tx=this._getTransactionRequest(_tx);if(isPromise$1(tx)){tx=await tx}return getBigInt(await this.#perform({method:"estimateGas",transaction:tx}),"%response")}async#call(tx,blockTag,attempt){assert(attempt=0&&blockTag==="latest"&&transaction.to!=null&&dataSlice(error.data,0,4)==="0x556f1830"){const data=error.data;const txSender=await resolveAddress(transaction.to,this);let ccipArgs;try{ccipArgs=parseOffchainLookup(dataSlice(error.data,4))}catch(error){assert(false,error.message,"OFFCHAIN_FAULT",{reason:"BAD_DATA",transaction:transaction,info:{data:data}})}assert(ccipArgs.sender.toLowerCase()===txSender.toLowerCase(),"CCIP Read sender mismatch","CALL_EXCEPTION",{action:"call",data:data,reason:"OffchainLookup",transaction:transaction,invocation:null,revert:{signature:"OffchainLookup(address,string[],bytes,bytes4,bytes)",name:"OffchainLookup",args:ccipArgs.errorArgs}});const ccipResult=await this.ccipReadFetch(transaction,ccipArgs.calldata,ccipArgs.urls);assert(ccipResult!=null,"CCIP Read failed to fetch data","OFFCHAIN_FAULT",{reason:"FETCH_FAILED",transaction:transaction,info:{data:error.data,errorArgs:ccipArgs.errorArgs}});const tx={to:txSender,data:concat([ccipArgs.selector,encodeBytes([ccipResult,ccipArgs.extraData])])};this.emit("debug",{action:"sendCcipReadCall",transaction:tx});try{const result=await this.#call(tx,blockTag,attempt+1);this.emit("debug",{action:"receiveCcipReadCallResult",transaction:Object.assign({},tx),result:result});return result}catch(error){this.emit("debug",{action:"receiveCcipReadCallError",transaction:Object.assign({},tx),error:error});throw error}}throw error}}async#checkNetwork(promise){const{value}=await resolveProperties({network:this.getNetwork(),value:promise});return value}async call(_tx){const{tx,blockTag}=await resolveProperties({tx:this._getTransactionRequest(_tx),blockTag:this._getBlockTag(_tx.blockTag)});return await this.#checkNetwork(this.#call(tx,blockTag,_tx.enableCcipRead?0:-1))}async#getAccountValue(request,_address,_blockTag){let address=this._getAddress(_address);let blockTag=this._getBlockTag(_blockTag);if(typeof address!=="string"||typeof blockTag!=="string"){[address,blockTag]=await Promise.all([address,blockTag])}return await this.#checkNetwork(this.#perform(Object.assign(request,{address:address,blockTag:blockTag})))}async getBalance(address,blockTag){return getBigInt(await this.#getAccountValue({method:"getBalance"},address,blockTag),"%response")}async getTransactionCount(address,blockTag){return getNumber(await this.#getAccountValue({method:"getTransactionCount"},address,blockTag),"%response")}async getCode(address,blockTag){return hexlify(await this.#getAccountValue({method:"getCode"},address,blockTag))}async getStorage(address,_position,blockTag){const position=getBigInt(_position,"position");return hexlify(await this.#getAccountValue({method:"getStorage",position:position},address,blockTag))}async broadcastTransaction(signedTx){const{blockNumber,hash,network}=await resolveProperties({blockNumber:this.getBlockNumber(),hash:this._perform({method:"broadcastTransaction",signedTransaction:signedTx}),network:this.getNetwork()});const tx=Transaction.from(signedTx);if(tx.hash!==hash){throw new Error("@TODO: the returned hash did not match")}return this._wrapTransactionResponse(tx,network).replaceableTransaction(blockNumber)}async#getBlock(block,includeTransactions){if(isHexString(block,32)){return await this.#perform({method:"getBlock",blockHash:block,includeTransactions:includeTransactions})}let blockTag=this._getBlockTag(block);if(typeof blockTag!=="string"){blockTag=await blockTag}return await this.#perform({method:"getBlock",blockTag:blockTag,includeTransactions:includeTransactions})}async getBlock(block,prefetchTxs){const{network,params}=await resolveProperties({network:this.getNetwork(),params:this.#getBlock(block,!!prefetchTxs)});if(params==null){return null}return this._wrapBlock(params,network)}async getTransaction(hash){const{network,params}=await resolveProperties({network:this.getNetwork(),params:this.#perform({method:"getTransaction",hash:hash})});if(params==null){return null}return this._wrapTransactionResponse(params,network)}async getTransactionReceipt(hash){const{network,params}=await resolveProperties({network:this.getNetwork(),params:this.#perform({method:"getTransactionReceipt",hash:hash})});if(params==null){return null}if(params.gasPrice==null&¶ms.effectiveGasPrice==null){const tx=await this.#perform({method:"getTransaction",hash:hash});if(tx==null){throw new Error("report this; could not find tx or effectiveGasPrice")}params.effectiveGasPrice=tx.gasPrice}return this._wrapTransactionReceipt(params,network)}async getTransactionResult(hash){const{result}=await resolveProperties({network:this.getNetwork(),result:this.#perform({method:"getTransactionResult",hash:hash})});if(result==null){return null}return hexlify(result)}async getLogs(_filter){let filter=this._getFilter(_filter);if(isPromise$1(filter)){filter=await filter}const{network,params}=await resolveProperties({network:this.getNetwork(),params:this.#perform({method:"getLogs",filter:filter})});return params.map(p=>this._wrapLog(p,network))}_getProvider(chainId){assert(false,"provider cannot connect to target network","UNSUPPORTED_OPERATION",{operation:"_getProvider()"})}async getResolver(name){return await EnsResolver.fromName(this,name)}async getAvatar(name){const resolver=await this.getResolver(name);if(resolver){return await resolver.getAvatar()}return null}async resolveName(name){const resolver=await this.getResolver(name);if(resolver){return await resolver.getAddress()}return null}async lookupAddress(address){address=getAddress(address);const node=namehash(address.substring(2).toLowerCase()+".addr.reverse");try{const ensAddr=await EnsResolver.getEnsAddress(this);const ensContract=new Contract(ensAddr,["function resolver(bytes32) view returns (address)"],this);const resolver=await ensContract.resolver(node);if(resolver==null||resolver===ZeroAddress){return null}const resolverContract=new Contract(resolver,["function name(bytes32) view returns (string)"],this);const name=await resolverContract.name(node);const check=await this.resolveName(name);if(check!==address){return null}return name}catch(error){if(isError(error,"BAD_DATA")&&error.value==="0x"){return null}if(isError(error,"CALL_EXCEPTION")){return null}throw error}return null}async waitForTransaction(hash,_confirms,timeout){const confirms=_confirms!=null?_confirms:1;if(confirms===0){return this.getTransactionReceipt(hash)}return new Promise(async(resolve,reject)=>{let timer=null;const listener=async blockNumber=>{try{const receipt=await this.getTransactionReceipt(hash);if(receipt!=null){if(blockNumber-receipt.blockNumber+1>=confirms){resolve(receipt);if(timer){clearTimeout(timer);timer=null}return}}}catch(error){console.log("EEE",error)}this.once("block",listener)};if(timeout!=null){timer=setTimeout(()=>{if(timer==null){return}timer=null;this.off("block",listener);reject(makeError("timeout","TIMEOUT",{reason:"timeout"}))},timeout)}listener(await this.getBlockNumber())})}async waitForBlock(blockTag){assert(false,"not implemented yet","NOT_IMPLEMENTED",{operation:"waitForBlock"})}_clearTimeout(timerId){const timer=this.#timers.get(timerId);if(!timer){return}if(timer.timer){clearTimeout(timer.timer)}this.#timers.delete(timerId)}_setTimeout(_func,timeout){if(timeout==null){timeout=0}const timerId=this.#nextTimer++;const func=()=>{this.#timers.delete(timerId);_func()};if(this.paused){this.#timers.set(timerId,{timer:null,func:func,time:timeout})}else{const timer=setTimeout(func,timeout);this.#timers.set(timerId,{timer:timer,func:func,time:getTime$1()})}return timerId}_forEachSubscriber(func){for(const sub of this.#subs.values()){func(sub.subscriber)}}_getSubscriber(sub){switch(sub.type){case"debug":case"error":case"network":return new UnmanagedSubscriber(sub.type);case"block":{const subscriber=new PollingBlockSubscriber(this);subscriber.pollingInterval=this.pollingInterval;return subscriber}case"safe":case"finalized":return new PollingBlockTagSubscriber(this,sub.type);case"event":return new PollingEventSubscriber(this,sub.filter);case"transaction":return new PollingTransactionSubscriber(this,sub.hash);case"orphan":return new PollingOrphanSubscriber(this,sub.filter)}throw new Error(`unsupported event: ${sub.type}`)}_recoverSubscriber(oldSub,newSub){for(const sub of this.#subs.values()){if(sub.subscriber===oldSub){if(sub.started){sub.subscriber.stop()}sub.subscriber=newSub;if(sub.started){newSub.start()}if(this.#pausedState!=null){newSub.pause(this.#pausedState)}break}}}async#hasSub(event,emitArgs){let sub=await getSubscription(event,this);if(sub.type==="event"&&emitArgs&&emitArgs.length>0&&emitArgs[0].removed===true){sub=await getSubscription({orphan:"drop-log",log:emitArgs[0]},this)}return this.#subs.get(sub.tag)||null}async#getSub(event){const subscription=await getSubscription(event,this);const tag=subscription.tag;let sub=this.#subs.get(tag);if(!sub){const subscriber=this._getSubscriber(subscription);const addressableMap=new WeakMap;const nameMap=new Map;sub={subscriber:subscriber,tag:tag,addressableMap:addressableMap,nameMap:nameMap,started:false,listeners:[]};this.#subs.set(tag,sub)}return sub}async on(event,listener){const sub=await this.#getSub(event);sub.listeners.push({listener:listener,once:false});if(!sub.started){sub.subscriber.start();sub.started=true;if(this.#pausedState!=null){sub.subscriber.pause(this.#pausedState)}}return this}async once(event,listener){const sub=await this.#getSub(event);sub.listeners.push({listener:listener,once:true});if(!sub.started){sub.subscriber.start();sub.started=true;if(this.#pausedState!=null){sub.subscriber.pause(this.#pausedState)}}return this}async emit(event,...args){const sub=await this.#hasSub(event,args);if(!sub||sub.listeners.length===0){return false}const count=sub.listeners.length;sub.listeners=sub.listeners.filter(({listener,once})=>{const payload=new EventPayload(this,once?null:listener,event);try{listener.call(this,...args,payload)}catch(error){}return!once});if(sub.listeners.length===0){if(sub.started){sub.subscriber.stop()}this.#subs.delete(sub.tag)}return count>0}async listenerCount(event){if(event){const sub=await this.#hasSub(event);if(!sub){return 0}return sub.listeners.length}let total=0;for(const{listeners}of this.#subs.values()){total+=listeners.length}return total}async listeners(event){if(event){const sub=await this.#hasSub(event);if(!sub){return[]}return sub.listeners.map(({listener})=>listener)}let result=[];for(const{listeners}of this.#subs.values()){result=result.concat(listeners.map(({listener})=>listener))}return result}async off(event,listener){const sub=await this.#hasSub(event);if(!sub){return this}if(listener){const index=sub.listeners.map(({listener})=>listener).indexOf(listener);if(index>=0){sub.listeners.splice(index,1)}}if(!listener||sub.listeners.length===0){if(sub.started){sub.subscriber.stop()}this.#subs.delete(sub.tag)}return this}async removeAllListeners(event){if(event){const{tag,started,subscriber}=await this.#getSub(event);if(started){subscriber.stop()}this.#subs.delete(tag)}else{for(const[tag,{started,subscriber}]of this.#subs){if(started){subscriber.stop()}this.#subs.delete(tag)}}return this}async addListener(event,listener){return await this.on(event,listener)}async removeListener(event,listener){return this.off(event,listener)}get destroyed(){return this.#destroyed}destroy(){this.removeAllListeners();for(const timerId of this.#timers.keys()){this._clearTimeout(timerId)}this.#destroyed=true}get paused(){return this.#pausedState!=null}set paused(pause){if(!!pause===this.paused){return}if(this.paused){this.resume()}else{this.pause(false)}}pause(dropWhilePaused){this.#lastBlockNumber=-1;if(this.#pausedState!=null){if(this.#pausedState==!!dropWhilePaused){return}assert(false,"cannot change pause type; resume first","UNSUPPORTED_OPERATION",{operation:"pause"})}this._forEachSubscriber(s=>s.pause(dropWhilePaused));this.#pausedState=!!dropWhilePaused;for(const timer of this.#timers.values()){if(timer.timer){clearTimeout(timer.timer)}timer.time=getTime$1()-timer.time}}resume(){if(this.#pausedState==null){return}this._forEachSubscriber(s=>s.resume());this.#pausedState=null;for(const timer of this.#timers.values()){let timeout=timer.time;if(timeout<0){timeout=0}timer.time=getTime$1();setTimeout(timer.func,timeout)}}}function _parseString(result,start){try{const bytes=_parseBytes(result,start);if(bytes){return toUtf8String(bytes)}}catch(error){}return null}function _parseBytes(result,start){if(result==="0x"){return null}try{const offset=getNumber(dataSlice(result,start,start+32));const length=getNumber(dataSlice(result,offset,offset+32));return dataSlice(result,offset+32,offset+32+length)}catch(error){}return null}function numPad(value){const result=toBeArray(value);if(result.length>32){throw new Error("internal; should not happen")}const padded=new Uint8Array(32);padded.set(result,32-result.length);return padded}function bytesPad(value){if(value.length%32===0){return value}const result=new Uint8Array(Math.ceil(value.length/32)*32);result.set(value);return result}const empty=new Uint8Array([]);function encodeBytes(datas){const result=[];let byteCount=0;for(let i=0;i=5*32,"insufficient OffchainLookup data","OFFCHAIN_FAULT",{reason:"insufficient OffchainLookup data"});const sender=dataSlice(data,0,32);assert(dataSlice(sender,0,12)===dataSlice(zeros,0,12),"corrupt OffchainLookup sender","OFFCHAIN_FAULT",{reason:"corrupt OffchainLookup sender"});result.sender=dataSlice(sender,12);try{const urls=[];const urlsOffset=getNumber(dataSlice(data,32,64));const urlsLength=getNumber(dataSlice(data,urlsOffset,urlsOffset+32));const urlsData=dataSlice(data,urlsOffset+32);for(let u=0;uresult[k]);return result}function checkProvider(signer,operation){if(signer.provider){return signer.provider}assert(false,"missing provider","UNSUPPORTED_OPERATION",{operation:operation})}async function populate(signer,tx){let pop=copyRequest(tx);if(pop.to!=null){pop.to=resolveAddress(pop.to,signer)}if(pop.from!=null){const from=pop.from;pop.from=Promise.all([signer.getAddress(),resolveAddress(from,signer)]).then(([address,from])=>{assertArgument(address.toLowerCase()===from.toLowerCase(),"transaction from mismatch","tx.from",from);return address})}else{pop.from=signer.getAddress()}return await resolveProperties(pop)}class AbstractSigner{provider;constructor(provider){defineProperties(this,{provider:provider||null})}async getNonce(blockTag){return checkProvider(this,"getTransactionCount").getTransactionCount(await this.getAddress(),blockTag)}async populateCall(tx){const pop=await populate(this,tx);return pop}async populateTransaction(tx){const provider=checkProvider(this,"populateTransaction");const pop=await populate(this,tx);if(pop.nonce==null){pop.nonce=await this.getNonce("pending")}if(pop.gasLimit==null){pop.gasLimit=await this.estimateGas(pop)}const network=await this.provider.getNetwork();if(pop.chainId!=null){const chainId=getBigInt(pop.chainId);assertArgument(chainId===network.chainId,"transaction chainId mismatch","tx.chainId",tx.chainId)}else{pop.chainId=network.chainId}const hasEip1559=pop.maxFeePerGas!=null||pop.maxPriorityFeePerGas!=null;if(pop.gasPrice!=null&&(pop.type===2||hasEip1559)){assertArgument(false,"eip-1559 transaction do not support gasPrice","tx",tx)}else if((pop.type===0||pop.type===1)&&hasEip1559){assertArgument(false,"pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas","tx",tx)}if((pop.type===2||pop.type==null)&&(pop.maxFeePerGas!=null&&pop.maxPriorityFeePerGas!=null)){pop.type=2}else if(pop.type===0||pop.type===1){const feeData=await provider.getFeeData();assert(feeData.gasPrice!=null,"network does not support gasPrice","UNSUPPORTED_OPERATION",{operation:"getGasPrice"});if(pop.gasPrice==null){pop.gasPrice=feeData.gasPrice}}else{const feeData=await provider.getFeeData();if(pop.type==null){if(feeData.maxFeePerGas!=null&&feeData.maxPriorityFeePerGas!=null){if(pop.authorizationList&&pop.authorizationList.length){pop.type=4}else{pop.type=2}if(pop.gasPrice!=null){const gasPrice=pop.gasPrice;delete pop.gasPrice;pop.maxFeePerGas=gasPrice;pop.maxPriorityFeePerGas=gasPrice}else{if(pop.maxFeePerGas==null){pop.maxFeePerGas=feeData.maxFeePerGas}if(pop.maxPriorityFeePerGas==null){pop.maxPriorityFeePerGas=feeData.maxPriorityFeePerGas}}}else if(feeData.gasPrice!=null){assert(!hasEip1559,"network does not support EIP-1559","UNSUPPORTED_OPERATION",{operation:"populateTransaction"});if(pop.gasPrice==null){pop.gasPrice=feeData.gasPrice}pop.type=0}else{assert(false,"failed to get consistent fee data","UNSUPPORTED_OPERATION",{operation:"signer.getFeeData"})}}else if(pop.type===2||pop.type===3||pop.type===4){if(pop.maxFeePerGas==null){pop.maxFeePerGas=feeData.maxFeePerGas}if(pop.maxPriorityFeePerGas==null){pop.maxPriorityFeePerGas=feeData.maxPriorityFeePerGas}}}return await resolveProperties(pop)}async populateAuthorization(_auth){const auth=Object.assign({},_auth);if(auth.chainId==null){auth.chainId=(await checkProvider(this,"getNetwork").getNetwork()).chainId}if(auth.nonce==null){auth.nonce=await this.getNonce()}return auth}async estimateGas(tx){return checkProvider(this,"estimateGas").estimateGas(await this.populateCall(tx))}async call(tx){return checkProvider(this,"call").call(await this.populateCall(tx))}async resolveName(name){const provider=checkProvider(this,"resolveName");return await provider.resolveName(name)}async sendTransaction(tx){const provider=checkProvider(this,"sendTransaction");const pop=await this.populateTransaction(tx);delete pop.from;const txObj=Transaction.from(pop);return await provider.broadcastTransaction(await this.signTransaction(txObj))}authorize(authorization){assert(false,"authorization not implemented for this signer","UNSUPPORTED_OPERATION",{operation:"authorize"})}}class VoidSigner extends AbstractSigner{address;constructor(address,provider){super(provider);defineProperties(this,{address:address})}async getAddress(){return this.address}connect(provider){return new VoidSigner(this.address,provider)}#throwUnsupported(suffix,operation){assert(false,`VoidSigner cannot sign ${suffix}`,"UNSUPPORTED_OPERATION",{operation:operation})}async signTransaction(tx){this.#throwUnsupported("transactions","signTransaction")}async signMessage(message){this.#throwUnsupported("messages","signMessage")}async signTypedData(domain,types,value){this.#throwUnsupported("typed-data","signTypedData")}}const shown=new Set;function showThrottleMessage(service){if(shown.has(service)){return}shown.add(service);console.log("========= NOTICE =========");console.log(`Request-Rate Exceeded for ${service} (this message will not be repeated)`);console.log("");console.log("The default API keys for each service are provided as a highly-throttled,");console.log("community resource for low-traffic projects and early prototyping.");console.log("");console.log("While your application will continue to function, we highly recommended");console.log("signing up for your own API keys to improve performance, increase your");console.log("request rate/limit and enable other perks, such as metrics and advanced APIs.");console.log("");console.log("For more details: https://docs.ethers.org/api-keys/");console.log("==========================")}function copy(obj){return JSON.parse(JSON.stringify(obj))}class FilterIdSubscriber{#provider;#filterIdPromise;#poller;#running;#network;#hault;constructor(provider){this.#provider=provider;this.#filterIdPromise=null;this.#poller=this.#poll.bind(this);this.#running=false;this.#network=null;this.#hault=false}_subscribe(provider){throw new Error("subclasses must override this")}_emitResults(provider,result){throw new Error("subclasses must override this")}_recover(provider){throw new Error("subclasses must override this")}async#poll(blockNumber){try{if(this.#filterIdPromise==null){this.#filterIdPromise=this._subscribe(this.#provider)}let filterId=null;try{filterId=await this.#filterIdPromise}catch(error){if(!isError(error,"UNSUPPORTED_OPERATION")||error.operation!=="eth_newFilter"){throw error}}if(filterId==null){this.#filterIdPromise=null;this.#provider._recoverSubscriber(this,this._recover(this.#provider));return}const network=await this.#provider.getNetwork();if(!this.#network){this.#network=network}if(this.#network.chainId!==network.chainId){throw new Error("chaid changed")}if(this.#hault){return}const result=await this.#provider.send("eth_getFilterChanges",[filterId]);await this._emitResults(this.#provider,result)}catch(error){console.log("@TODO",error)}this.#provider.once("block",this.#poller)}#teardown(){const filterIdPromise=this.#filterIdPromise;if(filterIdPromise){this.#filterIdPromise=null;filterIdPromise.then(filterId=>{if(this.#provider.destroyed){return}this.#provider.send("eth_uninstallFilter",[filterId])})}}start(){if(this.#running){return}this.#running=true;this.#poll(-2)}stop(){if(!this.#running){return}this.#running=false;this.#hault=true;this.#teardown();this.#provider.off("block",this.#poller)}pause(dropWhilePaused){if(dropWhilePaused){this.#teardown()}this.#provider.off("block",this.#poller)}resume(){this.start()}}class FilterIdEventSubscriber extends FilterIdSubscriber{#event;constructor(provider,filter){super(provider);this.#event=copy(filter)}_recover(provider){return new PollingEventSubscriber(provider,this.#event)}async _subscribe(provider){const filterId=await provider.send("eth_newFilter",[this.#event]);return filterId}async _emitResults(provider,results){for(const result of results){provider.emit(this.#event,provider._wrapLog(result,provider._network))}}}class FilterIdPendingSubscriber extends FilterIdSubscriber{async _subscribe(provider){return await provider.send("eth_newPendingTransactionFilter",[])}async _emitResults(provider,results){for(const result of results){provider.emit("pending",result)}}}const Primitive="bigint,boolean,function,number,string,symbol".split(/,/g);function deepCopy(value){if(value==null||Primitive.indexOf(typeof value)>=0){return value}if(typeof value.getAddress==="function"){return value}if(Array.isArray(value)){return value.map(deepCopy)}if(typeof value==="object"){return Object.keys(value).reduce((accum,key)=>{accum[key]=value[key];return accum},{})}throw new Error(`should not happen: ${value} (${typeof value})`)}function stall$3(duration){return new Promise(resolve=>{setTimeout(resolve,duration)})}function getLowerCase(value){if(value){return value.toLowerCase()}return value}function isPollable(value){return value&&typeof value.pollingInterval==="number"}const defaultOptions={polling:false,staticNetwork:null,batchStallTime:10,batchMaxSize:1<<20,batchMaxCount:100,cacheTimeout:250,pollingInterval:4e3};class JsonRpcSigner extends AbstractSigner{address;constructor(provider,address){super(provider);address=getAddress(address);defineProperties(this,{address:address})}connect(provider){assert(false,"cannot reconnect JsonRpcSigner","UNSUPPORTED_OPERATION",{operation:"signer.connect"})}async getAddress(){return this.address}async populateTransaction(tx){return await this.populateCall(tx)}async sendUncheckedTransaction(_tx){const tx=deepCopy(_tx);const promises=[];if(tx.from){const _from=tx.from;promises.push((async()=>{const from=await resolveAddress(_from,this.provider);assertArgument(from!=null&&from.toLowerCase()===this.address.toLowerCase(),"from address mismatch","transaction",_tx);tx.from=from})())}else{tx.from=this.address}if(tx.gasLimit==null){promises.push((async()=>{tx.gasLimit=await this.provider.estimateGas({...tx,from:this.address})})())}if(tx.to!=null){const _to=tx.to;promises.push((async()=>{tx.to=await resolveAddress(_to,this.provider)})())}if(promises.length){await Promise.all(promises)}const hexTx=this.provider.getRpcTransaction(tx);return this.provider.send("eth_sendTransaction",[hexTx])}async sendTransaction(tx){const blockNumber=await this.provider.getBlockNumber();const hash=await this.sendUncheckedTransaction(tx);return await new Promise((resolve,reject)=>{const timeouts=[1e3,100];let invalids=0;const checkTx=async()=>{try{const tx=await this.provider.getTransaction(hash);if(tx!=null){resolve(tx.replaceableTransaction(blockNumber));return}}catch(error){if(isError(error,"CANCELLED")||isError(error,"BAD_DATA")||isError(error,"NETWORK_ERROR")||isError(error,"UNSUPPORTED_OPERATION")){if(error.info==null){error.info={}}error.info.sendTransactionHash=hash;reject(error);return}if(isError(error,"INVALID_ARGUMENT")){invalids++;if(error.info==null){error.info={}}error.info.sendTransactionHash=hash;if(invalids>10){reject(error);return}}this.provider.emit("error",makeError("failed to fetch transation after sending (will try again)","UNKNOWN_ERROR",{error:error}))}this.provider._setTimeout(()=>{checkTx()},timeouts.pop()||4e3)};checkTx()})}async signTransaction(_tx){const tx=deepCopy(_tx);if(tx.from){const from=await resolveAddress(tx.from,this.provider);assertArgument(from!=null&&from.toLowerCase()===this.address.toLowerCase(),"from address mismatch","transaction",_tx);tx.from=from}else{tx.from=this.address}const hexTx=this.provider.getRpcTransaction(tx);return await this.provider.send("eth_signTransaction",[hexTx])}async signMessage(_message){const message=typeof _message==="string"?toUtf8Bytes(_message):_message;return await this.provider.send("personal_sign",[hexlify(message),this.address.toLowerCase()])}async signTypedData(domain,types,_value){const value=deepCopy(_value);const populated=await TypedDataEncoder.resolveNames(domain,types,value,async value=>{const address=await resolveAddress(value);assertArgument(address!=null,"TypedData does not support null address","value",value);return address});return await this.provider.send("eth_signTypedData_v4",[this.address.toLowerCase(),JSON.stringify(TypedDataEncoder.getPayload(populated.domain,types,populated.value))])}async unlock(password){return this.provider.send("personal_unlockAccount",[this.address.toLowerCase(),password,null])}async _legacySignMessage(_message){const message=typeof _message==="string"?toUtf8Bytes(_message):_message;return await this.provider.send("eth_sign",[this.address.toLowerCase(),hexlify(message)])}}class JsonRpcApiProvider extends AbstractProvider{#options;#nextId;#payloads;#drainTimer;#notReady;#network;#pendingDetectNetwork;#scheduleDrain(){if(this.#drainTimer){return}const stallTime=this._getOption("batchMaxCount")===1?0:this._getOption("batchStallTime");this.#drainTimer=setTimeout(()=>{this.#drainTimer=null;const payloads=this.#payloads;this.#payloads=[];while(payloads.length){const batch=[payloads.shift()];while(payloads.length){if(batch.length===this.#options.batchMaxCount){break}batch.push(payloads.shift());const bytes=JSON.stringify(batch.map(p=>p.payload));if(bytes.length>this.#options.batchMaxSize){payloads.unshift(batch.pop());break}}(async()=>{const payload=batch.length===1?batch[0].payload:batch.map(p=>p.payload);this.emit("debug",{action:"sendRpcPayload",payload:payload});try{const result=await this._send(payload);this.emit("debug",{action:"receiveRpcResult",result:result});for(const{resolve,reject,payload}of batch){if(this.destroyed){reject(makeError("provider destroyed; cancelled request","UNSUPPORTED_OPERATION",{operation:payload.method}));continue}const resp=result.filter(r=>r.id===payload.id)[0];if(resp==null){const error=makeError("missing response for request","BAD_DATA",{value:result,info:{payload:payload}});this.emit("error",error);reject(error);continue}if("error"in resp){reject(this.getRpcError(payload,resp));continue}resolve(resp.result)}}catch(error){this.emit("debug",{action:"receiveRpcError",error:error});for(const{reject}of batch){reject(error)}}})()}},stallTime)}constructor(network,options){super(network,options);this.#nextId=1;this.#options=Object.assign({},defaultOptions,options||{});this.#payloads=[];this.#drainTimer=null;this.#network=null;this.#pendingDetectNetwork=null;{let resolve=null;const promise=new Promise(_resolve=>{resolve=_resolve});this.#notReady={promise:promise,resolve:resolve}}const staticNetwork=this._getOption("staticNetwork");if(typeof staticNetwork==="boolean"){assertArgument(!staticNetwork||network!=="any","staticNetwork cannot be used on special network 'any'","options",options);if(staticNetwork&&network!=null){this.#network=Network.from(network)}}else if(staticNetwork){assertArgument(network==null||staticNetwork.matches(network),"staticNetwork MUST match network object","options",options);this.#network=staticNetwork}}_getOption(key){return this.#options[key]}get _network(){assert(this.#network,"network is not available yet","NETWORK_ERROR");return this.#network}async _perform(req){if(req.method==="call"||req.method==="estimateGas"){let tx=req.transaction;if(tx&&tx.type!=null&&getBigInt(tx.type)){if(tx.maxFeePerGas==null&&tx.maxPriorityFeePerGas==null){const feeData=await this.getFeeData();if(feeData.maxFeePerGas==null&&feeData.maxPriorityFeePerGas==null){req=Object.assign({},req,{transaction:Object.assign({},tx,{type:undefined})})}}}}const request=this.getRpcRequest(req);if(request!=null){return await this.send(request.method,request.args)}return super._perform(req)}async _detectNetwork(){const network=this._getOption("staticNetwork");if(network){if(network===true){if(this.#network){return this.#network}}else{return network}}if(this.#pendingDetectNetwork){return await this.#pendingDetectNetwork}if(this.ready){this.#pendingDetectNetwork=(async()=>{try{const result=Network.from(getBigInt(await this.send("eth_chainId",[])));this.#pendingDetectNetwork=null;return result}catch(error){this.#pendingDetectNetwork=null;throw error}})();return await this.#pendingDetectNetwork}this.#pendingDetectNetwork=(async()=>{const payload={id:this.#nextId++,method:"eth_chainId",params:[],jsonrpc:"2.0"};this.emit("debug",{action:"sendRpcPayload",payload:payload});let result;try{result=(await this._send(payload))[0];this.#pendingDetectNetwork=null}catch(error){this.#pendingDetectNetwork=null;this.emit("debug",{action:"receiveRpcError",error:error});throw error}this.emit("debug",{action:"receiveRpcResult",result:result});if("result"in result){return Network.from(getBigInt(result.result))}throw this.getRpcError(payload,result)})();return await this.#pendingDetectNetwork}_start(){if(this.#notReady==null||this.#notReady.resolve==null){return}this.#notReady.resolve();this.#notReady=null;(async()=>{while(this.#network==null&&!this.destroyed){try{this.#network=await this._detectNetwork()}catch(error){if(this.destroyed){break}console.log("JsonRpcProvider failed to detect network and cannot start up; retry in 1s (perhaps the URL is wrong or the node is not started)");this.emit("error",makeError("failed to bootstrap network detection","NETWORK_ERROR",{event:"initial-network-discovery",info:{error:error}}));await stall$3(1e3)}}this.#scheduleDrain()})()}async _waitUntilReady(){if(this.#notReady==null){return}return await this.#notReady.promise}_getSubscriber(sub){if(sub.type==="pending"){return new FilterIdPendingSubscriber(this)}if(sub.type==="event"){if(this._getOption("polling")){return new PollingEventSubscriber(this,sub.filter)}return new FilterIdEventSubscriber(this,sub.filter)}if(sub.type==="orphan"&&sub.filter.orphan==="drop-log"){return new UnmanagedSubscriber("orphan")}return super._getSubscriber(sub)}get ready(){return this.#notReady==null}getRpcTransaction(tx){const result={};["chainId","gasLimit","gasPrice","type","maxFeePerGas","maxPriorityFeePerGas","nonce","value"].forEach(key=>{if(tx[key]==null){return}let dstKey=key;if(key==="gasLimit"){dstKey="gas"}result[dstKey]=toQuantity(getBigInt(tx[key],`tx.${key}`))});["from","to","data"].forEach(key=>{if(tx[key]==null){return}result[key]=hexlify(tx[key])});if(tx.accessList){result["accessList"]=accessListify(tx.accessList)}if(tx.blobVersionedHashes){result["blobVersionedHashes"]=tx.blobVersionedHashes.map(h=>h.toLowerCase())}if(tx.authorizationList){result["authorizationList"]=tx.authorizationList.map(_a=>{const a=authorizationify(_a);return{address:a.address,nonce:toQuantity(a.nonce),chainId:toQuantity(a.chainId),yParity:toQuantity(a.signature.yParity),r:toQuantity(a.signature.r),s:toQuantity(a.signature.s)}})}return result}getRpcRequest(req){switch(req.method){case"chainId":return{method:"eth_chainId",args:[]};case"getBlockNumber":return{method:"eth_blockNumber",args:[]};case"getGasPrice":return{method:"eth_gasPrice",args:[]};case"getPriorityFee":return{method:"eth_maxPriorityFeePerGas",args:[]};case"getBalance":return{method:"eth_getBalance",args:[getLowerCase(req.address),req.blockTag]};case"getTransactionCount":return{method:"eth_getTransactionCount",args:[getLowerCase(req.address),req.blockTag]};case"getCode":return{method:"eth_getCode",args:[getLowerCase(req.address),req.blockTag]};case"getStorage":return{method:"eth_getStorageAt",args:[getLowerCase(req.address),"0x"+req.position.toString(16),req.blockTag]};case"broadcastTransaction":return{method:"eth_sendRawTransaction",args:[req.signedTransaction]};case"getBlock":if("blockTag"in req){return{method:"eth_getBlockByNumber",args:[req.blockTag,!!req.includeTransactions]}}else if("blockHash"in req){return{method:"eth_getBlockByHash",args:[req.blockHash,!!req.includeTransactions]}}break;case"getTransaction":return{method:"eth_getTransactionByHash",args:[req.hash]};case"getTransactionReceipt":return{method:"eth_getTransactionReceipt",args:[req.hash]};case"call":return{method:"eth_call",args:[this.getRpcTransaction(req.transaction),req.blockTag]};case"estimateGas":{return{method:"eth_estimateGas",args:[this.getRpcTransaction(req.transaction)]}}case"getLogs":if(req.filter&&req.filter.address!=null){if(Array.isArray(req.filter.address)){req.filter.address=req.filter.address.map(getLowerCase)}else{req.filter.address=getLowerCase(req.filter.address)}}return{method:"eth_getLogs",args:[req.filter]}}return null}getRpcError(payload,_error){const{method}=payload;const{error}=_error;if(method==="eth_estimateGas"&&error.message){const msg=error.message;if(!msg.match(/revert/i)&&msg.match(/insufficient funds/i)){return makeError("insufficient funds","INSUFFICIENT_FUNDS",{transaction:payload.params[0],info:{payload:payload,error:error}})}else if(msg.match(/nonce/i)&&msg.match(/too low/i)){return makeError("nonce has already been used","NONCE_EXPIRED",{transaction:payload.params[0],info:{payload:payload,error:error}})}}if(method==="eth_call"||method==="eth_estimateGas"){const result=spelunkData(error);const e=AbiCoder.getBuiltinCallException(method==="eth_call"?"call":"estimateGas",payload.params[0],result?result.data:null);e.info={error:error,payload:payload};return e}const message=JSON.stringify(spelunkMessage(error));if(typeof error.message==="string"&&error.message.match(/user denied|ethers-user-denied/i)){const actionMap={eth_sign:"signMessage",personal_sign:"signMessage",eth_signTypedData_v4:"signTypedData",eth_signTransaction:"signTransaction",eth_sendTransaction:"sendTransaction",eth_requestAccounts:"requestAccess",wallet_requestAccounts:"requestAccess"};return makeError(`user rejected action`,"ACTION_REJECTED",{action:actionMap[method]||"unknown",reason:"rejected",info:{payload:payload,error:error}})}if(method==="eth_sendRawTransaction"||method==="eth_sendTransaction"){const transaction=payload.params[0];if(message.match(/insufficient funds|base fee exceeds gas limit/i)){return makeError("insufficient funds for intrinsic transaction cost","INSUFFICIENT_FUNDS",{transaction:transaction,info:{error:error}})}if(message.match(/nonce/i)&&message.match(/too low/i)){return makeError("nonce has already been used","NONCE_EXPIRED",{transaction:transaction,info:{error:error}})}if(message.match(/replacement transaction/i)&&message.match(/underpriced/i)){return makeError("replacement fee too low","REPLACEMENT_UNDERPRICED",{transaction:transaction,info:{error:error}})}if(message.match(/only replay-protected/i)){return makeError("legacy pre-eip-155 transactions not supported","UNSUPPORTED_OPERATION",{operation:method,info:{transaction:transaction,info:{error:error}}})}}let unsupported=!!message.match(/the method .* does not exist/i);if(!unsupported){if(error&&error.details&&error.details.startsWith("Unauthorized method:")){unsupported=true}}if(unsupported){return makeError("unsupported operation","UNSUPPORTED_OPERATION",{operation:payload.method,info:{error:error,payload:payload}})}return makeError("could not coalesce error","UNKNOWN_ERROR",{error:error,payload:payload})}send(method,params){if(this.destroyed){return Promise.reject(makeError("provider destroyed; cancelled request","UNSUPPORTED_OPERATION",{operation:method}))}const id=this.#nextId++;const promise=new Promise((resolve,reject)=>{this.#payloads.push({resolve:resolve,reject:reject,payload:{method:method,params:params,id:id,jsonrpc:"2.0"}})});this.#scheduleDrain();return promise}async getSigner(address){if(address==null){address=0}const accountsPromise=this.send("eth_accounts",[]);if(typeof address==="number"){const accounts=await accountsPromise;if(address>=accounts.length){throw new Error("no such account")}return new JsonRpcSigner(this,accounts[address])}const{accounts}=await resolveProperties({network:this.getNetwork(),accounts:accountsPromise});address=getAddress(address);for(const account of accounts){if(getAddress(account)===address){return new JsonRpcSigner(this,address)}}throw new Error("invalid account")}async listAccounts(){const accounts=await this.send("eth_accounts",[]);return accounts.map(a=>new JsonRpcSigner(this,a))}destroy(){if(this.#drainTimer){clearTimeout(this.#drainTimer);this.#drainTimer=null}for(const{payload,reject}of this.#payloads){reject(makeError("provider destroyed; cancelled request","UNSUPPORTED_OPERATION",{operation:payload.method}))}this.#payloads=[];super.destroy()}}class JsonRpcApiPollingProvider extends JsonRpcApiProvider{#pollingInterval;constructor(network,options){super(network,options);let pollingInterval=this._getOption("pollingInterval");if(pollingInterval==null){pollingInterval=defaultOptions.pollingInterval}this.#pollingInterval=pollingInterval}_getSubscriber(sub){const subscriber=super._getSubscriber(sub);if(isPollable(subscriber)){subscriber.pollingInterval=this.#pollingInterval}return subscriber}get pollingInterval(){return this.#pollingInterval}set pollingInterval(value){if(!Number.isInteger(value)||value<0){throw new Error("invalid interval")}this.#pollingInterval=value;this._forEachSubscriber(sub=>{if(isPollable(sub)){sub.pollingInterval=this.#pollingInterval}})}}class JsonRpcProvider extends JsonRpcApiPollingProvider{#connect;constructor(url,network,options){if(url==null){url="http://localhost:8545"}super(network,options);if(typeof url==="string"){this.#connect=new FetchRequest(url)}else{this.#connect=url.clone()}}_getConnection(){return this.#connect.clone()}async send(method,params){await this._start();return await super.send(method,params)}async _send(payload){const request=this._getConnection();request.body=JSON.stringify(payload);request.setHeader("content-type","application/json");const response=await request.send();response.assertOk();let resp=response.bodyJson;if(!Array.isArray(resp)){resp=[resp]}return resp}}function spelunkData(value){if(value==null){return null}if(typeof value.message==="string"&&value.message.match(/revert/i)&&isHexString(value.data)){return{message:value.message,data:value.data}}if(typeof value==="object"){for(const key in value){const result=spelunkData(value[key]);if(result){return result}}return null}if(typeof value==="string"){try{return spelunkData(JSON.parse(value))}catch(error){}}return null}function _spelunkMessage(value,result){if(value==null){return}if(typeof value.message==="string"){result.push(value.message)}if(typeof value==="object"){for(const key in value){_spelunkMessage(value[key],result)}}if(typeof value==="string"){try{return _spelunkMessage(JSON.parse(value),result)}catch(error){}}}function spelunkMessage(value){const result=[];_spelunkMessage(value,result);return result}const defaultApiKey$1="9f7d929b018cdffb338517efa06f58359e86ff1ffd350bc889738523659e7972";function getHost$5(name){switch(name){case"mainnet":return"rpc.ankr.com/eth";case"goerli":return"rpc.ankr.com/eth_goerli";case"sepolia":return"rpc.ankr.com/eth_sepolia";case"arbitrum":return"rpc.ankr.com/arbitrum";case"base":return"rpc.ankr.com/base";case"base-goerli":return"rpc.ankr.com/base_goerli";case"base-sepolia":return"rpc.ankr.com/base_sepolia";case"bnb":return"rpc.ankr.com/bsc";case"bnbt":return"rpc.ankr.com/bsc_testnet_chapel";case"matic":return"rpc.ankr.com/polygon";case"matic-mumbai":return"rpc.ankr.com/polygon_mumbai";case"optimism":return"rpc.ankr.com/optimism";case"optimism-goerli":return"rpc.ankr.com/optimism_testnet";case"optimism-sepolia":return"rpc.ankr.com/optimism_sepolia"}assertArgument(false,"unsupported network","network",name)}class AnkrProvider extends JsonRpcProvider{apiKey;constructor(_network,apiKey){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(apiKey==null){apiKey=defaultApiKey$1}const options={polling:true,staticNetwork:network};const request=AnkrProvider.getRequest(network,apiKey);super(request,network,options);defineProperties(this,{apiKey:apiKey})}_getProvider(chainId){try{return new AnkrProvider(chainId,this.apiKey)}catch(error){}return super._getProvider(chainId)}static getRequest(network,apiKey){if(apiKey==null){apiKey=defaultApiKey$1}const request=new FetchRequest(`https:/\/${getHost$5(network.name)}/${apiKey}`);request.allowGzip=true;if(apiKey===defaultApiKey$1){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("AnkrProvider");return true}}return request}getRpcError(payload,error){if(payload.method==="eth_sendRawTransaction"){if(error&&error.error&&error.error.message==="INTERNAL_ERROR: could not replace existing tx"){error.error.message="replacement transaction underpriced"}}return super.getRpcError(payload,error)}isCommunityResource(){return this.apiKey===defaultApiKey$1}}const defaultApiKey="_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC";function getHost$4(name){switch(name){case"mainnet":return"eth-mainnet.alchemyapi.io";case"goerli":return"eth-goerli.g.alchemy.com";case"sepolia":return"eth-sepolia.g.alchemy.com";case"arbitrum":return"arb-mainnet.g.alchemy.com";case"arbitrum-goerli":return"arb-goerli.g.alchemy.com";case"arbitrum-sepolia":return"arb-sepolia.g.alchemy.com";case"base":return"base-mainnet.g.alchemy.com";case"base-goerli":return"base-goerli.g.alchemy.com";case"base-sepolia":return"base-sepolia.g.alchemy.com";case"matic":return"polygon-mainnet.g.alchemy.com";case"matic-amoy":return"polygon-amoy.g.alchemy.com";case"matic-mumbai":return"polygon-mumbai.g.alchemy.com";case"optimism":return"opt-mainnet.g.alchemy.com";case"optimism-goerli":return"opt-goerli.g.alchemy.com";case"optimism-sepolia":return"opt-sepolia.g.alchemy.com"}assertArgument(false,"unsupported network","network",name)}class AlchemyProvider extends JsonRpcProvider{apiKey;constructor(_network,apiKey){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(apiKey==null){apiKey=defaultApiKey}const request=AlchemyProvider.getRequest(network,apiKey);super(request,network,{staticNetwork:network});defineProperties(this,{apiKey:apiKey})}_getProvider(chainId){try{return new AlchemyProvider(chainId,this.apiKey)}catch(error){}return super._getProvider(chainId)}async _perform(req){if(req.method==="getTransactionResult"){const{trace,tx}=await resolveProperties({trace:this.send("trace_transaction",[req.hash]),tx:this.getTransaction(req.hash)});if(trace==null||tx==null){return null}let data;let error=false;try{data=trace[0].result.output;error=trace[0].error==="Reverted"}catch(error){}if(data){assert(!error,"an error occurred during transaction executions","CALL_EXCEPTION",{action:"getTransactionResult",data:data,reason:null,transaction:tx,invocation:null,revert:null});return data}assert(false,"could not parse trace result","BAD_DATA",{value:trace})}return await super._perform(req)}isCommunityResource(){return this.apiKey===defaultApiKey}static getRequest(network,apiKey){if(apiKey==null){apiKey=defaultApiKey}const request=new FetchRequest(`https:/\/${getHost$4(network.name)}/v2/${apiKey}`);request.allowGzip=true;if(apiKey===defaultApiKey){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("alchemy");return true}}return request}}function getApiKey(name){switch(name){case"mainnet":return"39f1d67cedf8b7831010a665328c9197";case"arbitrum":return"0550c209db33c3abf4cc927e1e18cea1";case"bnb":return"98b5a77e531614387366f6fc5da097f8";case"matic":return"cd9d4d70377471aa7c142ec4a4205249"}assertArgument(false,"unsupported network","network",name)}function getHost$3(name){switch(name){case"mainnet":return"ethereum-mainnet.core.chainstack.com";case"arbitrum":return"arbitrum-mainnet.core.chainstack.com";case"bnb":return"bsc-mainnet.core.chainstack.com";case"matic":return"polygon-mainnet.core.chainstack.com"}assertArgument(false,"unsupported network","network",name)}class ChainstackProvider extends JsonRpcProvider{apiKey;constructor(_network,apiKey){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(apiKey==null){apiKey=getApiKey(network.name)}const request=ChainstackProvider.getRequest(network,apiKey);super(request,network,{staticNetwork:network});defineProperties(this,{apiKey:apiKey})}_getProvider(chainId){try{return new ChainstackProvider(chainId,this.apiKey)}catch(error){}return super._getProvider(chainId)}isCommunityResource(){return this.apiKey===getApiKey(this._network.name)}static getRequest(network,apiKey){if(apiKey==null){apiKey=getApiKey(network.name)}const request=new FetchRequest(`https:/\/${getHost$3(network.name)}/${apiKey}`);request.allowGzip=true;if(apiKey===getApiKey(network.name)){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("ChainstackProvider");return true}}return request}}class CloudflareProvider extends JsonRpcProvider{constructor(_network){if(_network==null){_network="mainnet"}const network=Network.from(_network);assertArgument(network.name==="mainnet","unsupported network","network",_network);super("https://cloudflare-eth.com/",network,{staticNetwork:network})}}const THROTTLE=2e3;function isPromise(value){return value&&typeof value.then==="function"}const EtherscanPluginId="org.ethers.plugins.provider.Etherscan";class EtherscanPlugin extends NetworkPlugin{baseUrl;constructor(baseUrl){super(EtherscanPluginId);defineProperties(this,{baseUrl:baseUrl})}clone(){return new EtherscanPlugin(this.baseUrl)}}const skipKeys=["enableCcipRead"];let nextId=1;class EtherscanProvider extends AbstractProvider{network;apiKey;#plugin;constructor(_network,_apiKey){const apiKey=_apiKey!=null?_apiKey:null;super();const network=Network.from(_network);this.#plugin=network.getPlugin(EtherscanPluginId);defineProperties(this,{apiKey:apiKey,network:network})}getBaseUrl(){if(this.#plugin){return this.#plugin.baseUrl}switch(this.network.name){case"mainnet":return"https://api.etherscan.io";case"goerli":return"https://api-goerli.etherscan.io";case"sepolia":return"https://api-sepolia.etherscan.io";case"holesky":return"https://api-holesky.etherscan.io";case"arbitrum":return"https://api.arbiscan.io";case"arbitrum-goerli":return"https://api-goerli.arbiscan.io";case"base":return"https://api.basescan.org";case"base-sepolia":return"https://api-sepolia.basescan.org";case"bnb":return"https://api.bscscan.com";case"bnbt":return"https://api-testnet.bscscan.com";case"matic":return"https://api.polygonscan.com";case"matic-amoy":return"https://api-amoy.polygonscan.com";case"matic-mumbai":return"https://api-testnet.polygonscan.com";case"optimism":return"https://api-optimistic.etherscan.io";case"optimism-goerli":return"https://api-goerli-optimistic.etherscan.io"}assertArgument(false,"unsupported network","network",this.network)}getUrl(module,params){let query=Object.keys(params).reduce((accum,key)=>{const value=params[key];if(value!=null){accum+=`&${key}=${value}`}return accum},"");if(this.apiKey){query+=`&apikey=${this.apiKey}`}return`https:/\/api.etherscan.io/v2/api?chainid=${this.network.chainId}&module=${module}${query}`}getPostUrl(){return`https:/\/api.etherscan.io/v2/api?chainid=${this.network.chainId}`}getPostData(module,params){params.module=module;params.apikey=this.apiKey;params.chainid=this.network.chainId;return params}async detectNetwork(){return this.network}async fetch(module,params,post){const id=nextId++;const url=post?this.getPostUrl():this.getUrl(module,params);const payload=post?this.getPostData(module,params):null;this.emit("debug",{action:"sendRequest",id:id,url:url,payload:payload});const request=new FetchRequest(url);request.setThrottleParams({slotInterval:1e3});request.retryFunc=(req,resp,attempt)=>{if(this.isCommunityResource()){showThrottleMessage("Etherscan")}return Promise.resolve(true)};request.processFunc=async(request,response)=>{const result=response.hasBody()?JSON.parse(toUtf8String(response.body)):{};const throttle=(typeof result.result==="string"?result.result:"").toLowerCase().indexOf("rate limit")>=0;if(module==="proxy"){if(result&&result.status==0&&result.message=="NOTOK"&&throttle){this.emit("debug",{action:"receiveError",id:id,reason:"proxy-NOTOK",error:result});response.throwThrottleError(result.result,THROTTLE)}}else{if(throttle){this.emit("debug",{action:"receiveError",id:id,reason:"null result",error:result.result});response.throwThrottleError(result.result,THROTTLE)}}return response};if(payload){request.setHeader("content-type","application/x-www-form-urlencoded; charset=UTF-8");request.body=Object.keys(payload).map(k=>`${k}=${payload[k]}`).join("&")}const response=await request.send();try{response.assertOk()}catch(error){this.emit("debug",{action:"receiveError",id:id,error:error,reason:"assertOk"});assert(false,"response error","SERVER_ERROR",{request:request,response:response})}if(!response.hasBody()){this.emit("debug",{action:"receiveError",id:id,error:"missing body",reason:"null body"});assert(false,"missing response","SERVER_ERROR",{request:request,response:response})}const result=JSON.parse(toUtf8String(response.body));if(module==="proxy"){if(result.jsonrpc!="2.0"){this.emit("debug",{action:"receiveError",id:id,result:result,reason:"invalid JSON-RPC"});assert(false,"invalid JSON-RPC response (missing jsonrpc='2.0')","SERVER_ERROR",{request:request,response:response,info:{result:result}})}if(result.error){this.emit("debug",{action:"receiveError",id:id,result:result,reason:"JSON-RPC error"});assert(false,"error response","SERVER_ERROR",{request:request,response:response,info:{result:result}})}this.emit("debug",{action:"receiveRequest",id:id,result:result});return result.result}else{if(result.status==0&&(result.message==="No records found"||result.message==="No transactions found")){this.emit("debug",{action:"receiveRequest",id:id,result:result});return result.result}if(result.status!=1||typeof result.message==="string"&&!result.message.match(/^OK/)){this.emit("debug",{action:"receiveError",id:id,result:result});assert(false,"error response","SERVER_ERROR",{request:request,response:response,info:{result:result}})}this.emit("debug",{action:"receiveRequest",id:id,result:result});return result.result}}_getTransactionPostData(transaction){const result={};for(let key in transaction){if(skipKeys.indexOf(key)>=0){continue}if(transaction[key]==null){continue}let value=transaction[key];if(key==="type"&&value===0){continue}if(key==="blockTag"&&value==="latest"){continue}if({type:true,gasLimit:true,gasPrice:true,maxFeePerGs:true,maxPriorityFeePerGas:true,nonce:true,value:true}[key]){value=toQuantity(value)}else if(key==="accessList"){value="["+accessListify(value).map(set=>{return`{address:"${set.address}",storageKeys:["${set.storageKeys.join('","')}"]}`}).join(",")+"]"}else if(key==="blobVersionedHashes"){if(value.length===0){continue}assert(false,"Etherscan API does not support blobVersionedHashes","UNSUPPORTED_OPERATION",{operation:"_getTransactionPostData",info:{transaction:transaction}})}else{value=hexlify(value)}result[key]=value}return result}_checkError(req,error,transaction){let message="";if(isError(error,"SERVER_ERROR")){try{message=error.info.result.error.message}catch(e){}if(!message){try{message=error.info.message}catch(e){}}}if(req.method==="estimateGas"){if(!message.match(/revert/i)&&message.match(/insufficient funds/i)){assert(false,"insufficient funds","INSUFFICIENT_FUNDS",{transaction:req.transaction})}}if(req.method==="call"||req.method==="estimateGas"){if(message.match(/execution reverted/i)){let data="";try{data=error.info.result.error.data}catch(error){}const e=AbiCoder.getBuiltinCallException(req.method,req.transaction,data);e.info={request:req,error:error};throw e}}if(message){if(req.method==="broadcastTransaction"){const transaction=Transaction.from(req.signedTransaction);if(message.match(/replacement/i)&&message.match(/underpriced/i)){assert(false,"replacement fee too low","REPLACEMENT_UNDERPRICED",{transaction:transaction})}if(message.match(/insufficient funds/)){assert(false,"insufficient funds for intrinsic transaction cost","INSUFFICIENT_FUNDS",{transaction:transaction})}if(message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)){assert(false,"nonce has already been used","NONCE_EXPIRED",{transaction:transaction})}}}throw error}async _detectNetwork(){return this.network}async _perform(req){switch(req.method){case"chainId":return this.network.chainId;case"getBlockNumber":return this.fetch("proxy",{action:"eth_blockNumber"});case"getGasPrice":return this.fetch("proxy",{action:"eth_gasPrice"});case"getPriorityFee":if(this.network.name==="mainnet"){return"1000000000"}else if(this.network.name==="optimism"){return"1000000"}else{throw new Error("fallback onto the AbstractProvider default")}case"getBalance":return this.fetch("account",{action:"balance",address:req.address,tag:req.blockTag});case"getTransactionCount":return this.fetch("proxy",{action:"eth_getTransactionCount",address:req.address,tag:req.blockTag});case"getCode":return this.fetch("proxy",{action:"eth_getCode",address:req.address,tag:req.blockTag});case"getStorage":return this.fetch("proxy",{action:"eth_getStorageAt",address:req.address,position:req.position,tag:req.blockTag});case"broadcastTransaction":return this.fetch("proxy",{action:"eth_sendRawTransaction",hex:req.signedTransaction},true).catch(error=>{return this._checkError(req,error,req.signedTransaction)});case"getBlock":if("blockTag"in req){return this.fetch("proxy",{action:"eth_getBlockByNumber",tag:req.blockTag,boolean:req.includeTransactions?"true":"false"})}assert(false,"getBlock by blockHash not supported by Etherscan","UNSUPPORTED_OPERATION",{operation:"getBlock(blockHash)"});case"getTransaction":return this.fetch("proxy",{action:"eth_getTransactionByHash",txhash:req.hash});case"getTransactionReceipt":return this.fetch("proxy",{action:"eth_getTransactionReceipt",txhash:req.hash});case"call":{if(req.blockTag!=="latest"){throw new Error("EtherscanProvider does not support blockTag for call")}const postData=this._getTransactionPostData(req.transaction);postData.module="proxy";postData.action="eth_call";try{return await this.fetch("proxy",postData,true)}catch(error){return this._checkError(req,error,req.transaction)}}case"estimateGas":{const postData=this._getTransactionPostData(req.transaction);postData.module="proxy";postData.action="eth_estimateGas";try{return await this.fetch("proxy",postData,true)}catch(error){return this._checkError(req,error,req.transaction)}}}return super._perform(req)}async getNetwork(){return this.network}async getEtherPrice(){if(this.network.name!=="mainnet"){return 0}return parseFloat((await this.fetch("stats",{action:"ethprice"})).ethusd)}async getContract(_address){let address=this._getAddress(_address);if(isPromise(address)){address=await address}try{const resp=await this.fetch("contract",{action:"getabi",address:address});const abi=JSON.parse(resp);return new Contract(address,abi,this)}catch(error){return null}}isCommunityResource(){return this.apiKey==null}}function getGlobal(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")}const _WebSocket=getGlobal().WebSocket;class SocketSubscriber{#provider;#filter;get filter(){return JSON.parse(this.#filter)}#filterId;#paused;#emitPromise;constructor(provider,filter){this.#provider=provider;this.#filter=JSON.stringify(filter);this.#filterId=null;this.#paused=null;this.#emitPromise=null}start(){this.#filterId=this.#provider.send("eth_subscribe",this.filter).then(filterId=>{this.#provider._register(filterId,this);return filterId})}stop(){this.#filterId.then(filterId=>{if(this.#provider.destroyed){return}this.#provider.send("eth_unsubscribe",[filterId])});this.#filterId=null}pause(dropWhilePaused){assert(dropWhilePaused,"preserve logs while paused not supported by SocketSubscriber yet","UNSUPPORTED_OPERATION",{operation:"pause(false)"});this.#paused=!!dropWhilePaused}resume(){this.#paused=null}_handleMessage(message){if(this.#filterId==null){return}if(this.#paused===null){let emitPromise=this.#emitPromise;if(emitPromise==null){emitPromise=this._emit(this.#provider,message)}else{emitPromise=emitPromise.then(async()=>{await this._emit(this.#provider,message)})}this.#emitPromise=emitPromise.then(()=>{if(this.#emitPromise===emitPromise){this.#emitPromise=null}})}}async _emit(provider,message){throw new Error("sub-classes must implemente this; _emit")}}class SocketBlockSubscriber extends SocketSubscriber{constructor(provider){super(provider,["newHeads"])}async _emit(provider,message){provider.emit("block",parseInt(message.number))}}class SocketPendingSubscriber extends SocketSubscriber{constructor(provider){super(provider,["newPendingTransactions"])}async _emit(provider,message){provider.emit("pending",message)}}class SocketEventSubscriber extends SocketSubscriber{#logFilter;get logFilter(){return JSON.parse(this.#logFilter)}constructor(provider,filter){super(provider,["logs",filter]);this.#logFilter=JSON.stringify(filter)}async _emit(provider,message){provider.emit(this.logFilter,provider._wrapLog(message,provider._network))}}class SocketProvider extends JsonRpcApiProvider{#callbacks;#subs;#pending;constructor(network,_options){const options=Object.assign({},_options!=null?_options:{});assertArgument(options.batchMaxCount==null||options.batchMaxCount===1,"sockets-based providers do not support batches","options.batchMaxCount",_options);options.batchMaxCount=1;if(options.staticNetwork==null){options.staticNetwork=true}super(network,options);this.#callbacks=new Map;this.#subs=new Map;this.#pending=new Map}_getSubscriber(sub){switch(sub.type){case"close":return new UnmanagedSubscriber("close");case"block":return new SocketBlockSubscriber(this);case"pending":return new SocketPendingSubscriber(this);case"event":return new SocketEventSubscriber(this,sub.filter);case"orphan":if(sub.filter.orphan==="drop-log"){return new UnmanagedSubscriber("drop-log")}}return super._getSubscriber(sub)}_register(filterId,subscriber){this.#subs.set(filterId,subscriber);const pending=this.#pending.get(filterId);if(pending){for(const message of pending){subscriber._handleMessage(message)}this.#pending.delete(filterId)}}async _send(payload){assertArgument(!Array.isArray(payload),"WebSocket does not support batch send","payload",payload);const promise=new Promise((resolve,reject)=>{this.#callbacks.set(payload.id,{payload:payload,resolve:resolve,reject:reject})});await this._waitUntilReady();await this._write(JSON.stringify(payload));return[await promise]}async _processMessage(message){const result=JSON.parse(message);if(result&&typeof result==="object"&&"id"in result){const callback=this.#callbacks.get(result.id);if(callback==null){this.emit("error",makeError("received result for unknown id","UNKNOWN_ERROR",{reasonCode:"UNKNOWN_ID",result:result}));return}this.#callbacks.delete(result.id);callback.resolve(result)}else if(result&&result.method==="eth_subscription"){const filterId=result.params.subscription;const subscriber=this.#subs.get(filterId);if(subscriber){subscriber._handleMessage(result.params.result)}else{let pending=this.#pending.get(filterId);if(pending==null){pending=[];this.#pending.set(filterId,pending)}pending.push(result.params.result)}}else{this.emit("error",makeError("received unexpected message","UNKNOWN_ERROR",{reasonCode:"UNEXPECTED_MESSAGE",result:result}));return}}async _write(message){throw new Error("sub-classes must override this")}}class WebSocketProvider extends SocketProvider{#connect;#websocket;get websocket(){if(this.#websocket==null){throw new Error("websocket closed")}return this.#websocket}constructor(url,network,options){super(network,options);if(typeof url==="string"){this.#connect=()=>{return new _WebSocket(url)};this.#websocket=this.#connect()}else if(typeof url==="function"){this.#connect=url;this.#websocket=url()}else{this.#connect=null;this.#websocket=url}this.websocket.onopen=async()=>{try{await this._start();this.resume()}catch(error){console.log("failed to start WebsocketProvider",error)}};this.websocket.onmessage=message=>{this._processMessage(message.data)}}async _write(message){this.websocket.send(message)}async destroy(){if(this.#websocket!=null){this.#websocket.close();this.#websocket=null}super.destroy()}}const defaultProjectId="84842078b09946638c03157f83405213";function getHost$2(name){switch(name){case"mainnet":return"mainnet.infura.io";case"goerli":return"goerli.infura.io";case"sepolia":return"sepolia.infura.io";case"arbitrum":return"arbitrum-mainnet.infura.io";case"arbitrum-goerli":return"arbitrum-goerli.infura.io";case"arbitrum-sepolia":return"arbitrum-sepolia.infura.io";case"base":return"base-mainnet.infura.io";case"base-goerlia":case"base-goerli":return"base-goerli.infura.io";case"base-sepolia":return"base-sepolia.infura.io";case"bnb":return"bsc-mainnet.infura.io";case"bnbt":return"bsc-testnet.infura.io";case"linea":return"linea-mainnet.infura.io";case"linea-goerli":return"linea-goerli.infura.io";case"linea-sepolia":return"linea-sepolia.infura.io";case"matic":return"polygon-mainnet.infura.io";case"matic-amoy":return"polygon-amoy.infura.io";case"matic-mumbai":return"polygon-mumbai.infura.io";case"optimism":return"optimism-mainnet.infura.io";case"optimism-goerli":return"optimism-goerli.infura.io";case"optimism-sepolia":return"optimism-sepolia.infura.io"}assertArgument(false,"unsupported network","network",name)}class InfuraWebSocketProvider extends WebSocketProvider{projectId;projectSecret;constructor(network,projectId){const provider=new InfuraProvider(network,projectId);const req=provider._getConnection();assert(!req.credentials,"INFURA WebSocket project secrets unsupported","UNSUPPORTED_OPERATION",{operation:"InfuraProvider.getWebSocketProvider()"});const url=req.url.replace(/^http/i,"ws").replace("/v3/","/ws/v3/");super(url,provider._network);defineProperties(this,{projectId:provider.projectId,projectSecret:provider.projectSecret})}isCommunityResource(){return this.projectId===defaultProjectId}}class InfuraProvider extends JsonRpcProvider{projectId;projectSecret;constructor(_network,projectId,projectSecret){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(projectId==null){projectId=defaultProjectId}if(projectSecret==null){projectSecret=null}const request=InfuraProvider.getRequest(network,projectId,projectSecret);super(request,network,{staticNetwork:network});defineProperties(this,{projectId:projectId,projectSecret:projectSecret})}_getProvider(chainId){try{return new InfuraProvider(chainId,this.projectId,this.projectSecret)}catch(error){}return super._getProvider(chainId)}isCommunityResource(){return this.projectId===defaultProjectId}static getWebSocketProvider(network,projectId){return new InfuraWebSocketProvider(network,projectId)}static getRequest(network,projectId,projectSecret){if(projectId==null){projectId=defaultProjectId}if(projectSecret==null){projectSecret=null}const request=new FetchRequest(`https:/\/${getHost$2(network.name)}/v3/${projectId}`);request.allowGzip=true;if(projectSecret){request.setCredentials("",projectSecret)}if(projectId===defaultProjectId){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("InfuraProvider");return true}}return request}}const defaultToken="919b412a057b5e9c9b6dce193c5a60242d6efadb";function getHost$1(name){switch(name){case"mainnet":return"ethers.quiknode.pro";case"goerli":return"ethers.ethereum-goerli.quiknode.pro";case"sepolia":return"ethers.ethereum-sepolia.quiknode.pro";case"holesky":return"ethers.ethereum-holesky.quiknode.pro";case"arbitrum":return"ethers.arbitrum-mainnet.quiknode.pro";case"arbitrum-goerli":return"ethers.arbitrum-goerli.quiknode.pro";case"arbitrum-sepolia":return"ethers.arbitrum-sepolia.quiknode.pro";case"base":return"ethers.base-mainnet.quiknode.pro";case"base-goerli":return"ethers.base-goerli.quiknode.pro";case"base-spolia":return"ethers.base-sepolia.quiknode.pro";case"bnb":return"ethers.bsc.quiknode.pro";case"bnbt":return"ethers.bsc-testnet.quiknode.pro";case"matic":return"ethers.matic.quiknode.pro";case"matic-mumbai":return"ethers.matic-testnet.quiknode.pro";case"optimism":return"ethers.optimism.quiknode.pro";case"optimism-goerli":return"ethers.optimism-goerli.quiknode.pro";case"optimism-sepolia":return"ethers.optimism-sepolia.quiknode.pro";case"xdai":return"ethers.xdai.quiknode.pro"}assertArgument(false,"unsupported network","network",name)}class QuickNodeProvider extends JsonRpcProvider{token;constructor(_network,token){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(token==null){token=defaultToken}const request=QuickNodeProvider.getRequest(network,token);super(request,network,{staticNetwork:network});defineProperties(this,{token:token})}_getProvider(chainId){try{return new QuickNodeProvider(chainId,this.token)}catch(error){}return super._getProvider(chainId)}isCommunityResource(){return this.token===defaultToken}static getRequest(network,token){if(token==null){token=defaultToken}const request=new FetchRequest(`https:/\/${getHost$1(network.name)}/${token}`);request.allowGzip=true;if(token===defaultToken){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("QuickNodeProvider");return true}}return request}}const BN_1=BigInt("1");const BN_2=BigInt("2");function shuffle(array){for(let i=array.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));const tmp=array[i];array[i]=array[j];array[j]=tmp}}function stall$2(duration){return new Promise(resolve=>{setTimeout(resolve,duration)})}function getTime(){return(new Date).getTime()}function stringify(value){return JSON.stringify(value,(key,value)=>{if(typeof value==="bigint"){return{type:"bigint",value:value.toString()}}return value})}const defaultConfig={stallTimeout:400,priority:1,weight:1};const defaultState={blockNumber:-2,requests:0,lateResponses:0,errorResponses:0,outOfSync:-1,unsupportedEvents:0,rollingDuration:0,score:0,_network:null,_updateNumber:null,_totalTime:0,_lastFatalError:null,_lastFatalErrorTimestamp:0};async function waitForSync(config,blockNumber){while(config.blockNumber<0||config.blockNumber{try{const blockNumber=await config.provider.getBlockNumber();if(blockNumber>config.blockNumber){config.blockNumber=blockNumber}}catch(error){config.blockNumber=-2;config._lastFatalError=error;config._lastFatalErrorTimestamp=getTime()}config._updateNumber=null})()}await config._updateNumber;config.outOfSync++;if(config._lastFatalError){break}}}function _normalize(value){if(value==null){return"null"}if(Array.isArray(value)){return"["+value.map(_normalize).join(",")+"]"}if(typeof value==="object"&&typeof value.toJSON==="function"){return _normalize(value.toJSON())}switch(typeof value){case"boolean":case"symbol":return value.toString();case"bigint":case"number":return BigInt(value).toString();case"string":return JSON.stringify(value);case"object":{const keys=Object.keys(value);keys.sort();return"{"+keys.map(k=>`${JSON.stringify(k)}:${_normalize(value[k])}`).join(",")+"}"}}console.log("Could not serialize",value);throw new Error("Hmm...")}function normalizeResult(method,value){if("error"in value){const error=value.error;let tag;if(isError(error,"CALL_EXCEPTION")){tag=_normalize(Object.assign({},error,{shortMessage:undefined,reason:undefined,info:undefined}))}else{tag=_normalize(error)}return{tag:tag,value:error}}const result=value.result;return{tag:_normalize(result),value:result}}function checkQuorum(quorum,results){const tally=new Map;for(const{value,tag,weight}of results){const t=tally.get(tag)||{value:value,weight:0};t.weight+=weight;tally.set(tag,t)}let best=null;for(const r of tally.values()){if(r.weight>=quorum&&(!best||r.weight>best.weight)){best=r}}if(best){return best.value}return undefined}function getMedian(quorum,results){let resultWeight=0;const errorMap=new Map;let bestError=null;const values=[];for(const{value,tag,weight}of results){if(value instanceof Error){const e=errorMap.get(tag)||{value:value,weight:0};e.weight+=weight;errorMap.set(tag,e);if(bestError==null||e.weight>bestError.weight){bestError=e}}else{values.push(BigInt(value));resultWeight+=weight}}if(resultWeight=quorum){return bestError.value}return undefined}values.sort((a,b)=>aa?1:0);const mid=Math.floor(values.length/2);if(values.length%2){return values[mid]}return(values[mid-1]+values[mid]+BN_1)/BN_2}function getAnyResult(quorum,results){const result=checkQuorum(quorum,results);if(result!==undefined){return result}for(const r of results){if(r.value){return r.value}}return undefined}function getFuzzyMode(quorum,results){if(quorum===1){return getNumber(getMedian(quorum,results),"%internal")}const tally=new Map;const add=(result,weight)=>{const t=tally.get(result)||{result:result,weight:0};t.weight+=weight;tally.set(result,t)};for(const{weight,value}of results){const r=getNumber(value);add(r-1,weight);add(r,weight);add(r+1,weight)}let bestWeight=0;let bestResult=undefined;for(const{weight,result}of tally.values()){if(weight>=quorum&&(weight>bestWeight||bestResult!=null&&weight===bestWeight&&result>bestResult)){bestWeight=weight;bestResult=result}}return bestResult}class FallbackProvider extends AbstractProvider{quorum;eventQuorum;eventWorkers;#configs;#height;#initialSyncPromise;constructor(providers,network,options){super(network,options);this.#configs=providers.map(p=>{if(p instanceof AbstractProvider){return Object.assign({provider:p},defaultConfig,defaultState)}else{return Object.assign({},defaultConfig,p,defaultState)}});this.#height=-2;this.#initialSyncPromise=null;if(options&&options.quorum!=null){this.quorum=options.quorum}else{this.quorum=Math.ceil(this.#configs.reduce((accum,config)=>{accum+=config.weight;return accum},0)/2)}this.eventQuorum=1;this.eventWorkers=1;assertArgument(this.quorum<=this.#configs.reduce((a,c)=>a+c.weight,0),"quorum exceed provider weight","quorum",this.quorum)}get providerConfigs(){return this.#configs.map(c=>{const result=Object.assign({},c);for(const key in result){if(key[0]==="_"){delete result[key]}}return result})}async _detectNetwork(){return Network.from(getBigInt(await this._perform({method:"chainId"})))}async _translatePerform(provider,req){switch(req.method){case"broadcastTransaction":return await provider.broadcastTransaction(req.signedTransaction);case"call":return await provider.call(Object.assign({},req.transaction,{blockTag:req.blockTag}));case"chainId":return(await provider.getNetwork()).chainId;case"estimateGas":return await provider.estimateGas(req.transaction);case"getBalance":return await provider.getBalance(req.address,req.blockTag);case"getBlock":{const block="blockHash"in req?req.blockHash:req.blockTag;return await provider.getBlock(block,req.includeTransactions)}case"getBlockNumber":return await provider.getBlockNumber();case"getCode":return await provider.getCode(req.address,req.blockTag);case"getGasPrice":return(await provider.getFeeData()).gasPrice;case"getPriorityFee":return(await provider.getFeeData()).maxPriorityFeePerGas;case"getLogs":return await provider.getLogs(req.filter);case"getStorage":return await provider.getStorage(req.address,req.position,req.blockTag);case"getTransaction":return await provider.getTransaction(req.hash);case"getTransactionCount":return await provider.getTransactionCount(req.address,req.blockTag);case"getTransactionReceipt":return await provider.getTransactionReceipt(req.hash);case"getTransactionResult":return await provider.getTransactionResult(req.hash)}}#getNextConfig(running){const configs=Array.from(running).map(r=>r.config);const allConfigs=this.#configs.slice();shuffle(allConfigs);allConfigs.sort((a,b)=>a.priority-b.priority);for(const config of allConfigs){if(config._lastFatalError){continue}if(configs.indexOf(config)===-1){return config}}return null}#addRunner(running,req){const config=this.#getNextConfig(running);if(config==null){return null}const runner={config:config,result:null,didBump:false,perform:null,staller:null};const now=getTime();runner.perform=(async()=>{try{config.requests++;const result=await this._translatePerform(config.provider,req);runner.result={result:result}}catch(error){config.errorResponses++;runner.result={error:error}}const dt=getTime()-now;config._totalTime+=dt;config.rollingDuration=.95*config.rollingDuration+.05*dt;runner.perform=null})();runner.staller=(async()=>{await stall$2(config.stallTimeout);runner.staller=null})();running.add(runner);return runner}async#initialSync(){let initialSync=this.#initialSyncPromise;if(!initialSync){const promises=[];this.#configs.forEach(config=>{promises.push((async()=>{await waitForSync(config,0);if(!config._lastFatalError){config._network=await config.provider.getNetwork()}})())});this.#initialSyncPromise=initialSync=(async()=>{await Promise.all(promises);let chainId=null;for(const config of this.#configs){if(config._lastFatalError){continue}const network=config._network;if(chainId==null){chainId=network.chainId}else if(network.chainId!==chainId){assert(false,"cannot mix providers on different networks","UNSUPPORTED_OPERATION",{operation:"new FallbackProvider"})}}})()}await initialSync}async#checkQuorum(running,req){const results=[];for(const runner of running){if(runner.result!=null){const{tag,value}=normalizeResult(req.method,runner.result);results.push({tag:tag,value:value,weight:runner.config.weight})}}if(results.reduce((a,r)=>a+r.weight,0)!c._lastFatalError).map(c=>({value:c.blockNumber,tag:getNumber(c.blockNumber).toString(),weight:c.weight})))))}const mode=getFuzzyMode(this.quorum,results);if(mode===undefined){return undefined}if(mode>this.#height){this.#height=mode}return this.#height}case"getGasPrice":case"getPriorityFee":case"estimateGas":return getMedian(this.quorum,results);case"getBlock":if("blockTag"in req&&req.blockTag==="pending"){return getAnyResult(this.quorum,results)}return checkQuorum(this.quorum,results);case"call":case"chainId":case"getBalance":case"getTransactionCount":case"getCode":case"getStorage":case"getTransaction":case"getTransactionReceipt":case"getLogs":return checkQuorum(this.quorum,results);case"broadcastTransaction":return getAnyResult(this.quorum,results)}assert(false,"unsupported method","UNSUPPORTED_OPERATION",{operation:`_perform(${stringify(req.method)})`})}async#waitForQuorum(running,req){if(running.size===0){throw new Error("no runners?!")}const interesting=[];let newRunners=0;for(const runner of running){if(runner.perform){interesting.push(runner.perform)}if(runner.staller){interesting.push(runner.staller);continue}if(runner.didBump){continue}runner.didBump=true;newRunners++}const value=await this.#checkQuorum(running,req);if(value!==undefined){if(value instanceof Error){throw value}return value}for(let i=0;i0,"quorum not met","SERVER_ERROR",{request:"%sub-requests",info:{request:req,results:Array.from(running).map(r=>stringify(r.result))}});await Promise.race(interesting);return await this.#waitForQuorum(running,req)}async _perform(req){if(req.method==="broadcastTransaction"){const results=this.#configs.map(c=>null);const broadcasts=this.#configs.map(async({provider,weight},index)=>{try{const result=await provider._perform(req);results[index]=Object.assign(normalizeResult(req.method,{result:result}),{weight:weight})}catch(error){results[index]=Object.assign(normalizeResult(req.method,{error:error}),{weight:weight})}});while(true){const done=results.filter(r=>r!=null);for(const{value}of done){if(!(value instanceof Error)){return value}}const result=checkQuorum(this.quorum,results.filter(r=>r!=null));if(isError(result,"INSUFFICIENT_FUNDS")){throw result}const waiting=broadcasts.filter((b,i)=>results[i]==null);if(waiting.length===0){break}await Promise.race(waiting)}const result=getAnyResult(this.quorum,results);assert(result!==undefined,"problem multi-broadcasting","SERVER_ERROR",{request:"%sub-requests",info:{request:req,results:results.map(stringify)}});if(result instanceof Error){throw result}return result}await this.#initialSync();const running=new Set;let inflightQuorum=0;while(true){const runner=this.#addRunner(running,req);if(runner==null){break}inflightQuorum+=runner.config.weight;if(inflightQuorum>=this.quorum){break}}const result=await this.#waitForQuorum(running,req);for(const runner of running){if(runner.perform&&runner.result==null){runner.config.lateResponses++}}return result}async destroy(){for(const{provider}of this.#configs){provider.destroy()}super.destroy()}}function isWebSocketLike(value){return value&&typeof value.send==="function"&&typeof value.close==="function"}const Testnets="goerli kovan sepolia classicKotti optimism-goerli arbitrum-goerli matic-mumbai bnbt".split(" ");function getDefaultProvider(network,options){if(options==null){options={}}const allowService=name=>{if(options[name]==="-"){return false}if(typeof options.exclusive==="string"){return name===options.exclusive}if(Array.isArray(options.exclusive)){return options.exclusive.indexOf(name)!==-1}return true};if(typeof network==="string"&&network.match(/^https?:/)){return new JsonRpcProvider(network)}if(typeof network==="string"&&network.match(/^wss?:/)||isWebSocketLike(network)){return new WebSocketProvider(network)}let staticNetwork=null;try{staticNetwork=Network.from(network)}catch(error){}const providers=[];if(allowService("publicPolygon")&&staticNetwork){if(staticNetwork.name==="matic"){providers.push(new JsonRpcProvider("https://polygon-rpc.com/",staticNetwork,{staticNetwork:staticNetwork}))}else if(staticNetwork.name==="matic-amoy"){providers.push(new JsonRpcProvider("https://rpc-amoy.polygon.technology/",staticNetwork,{staticNetwork:staticNetwork}))}}if(allowService("alchemy")){try{providers.push(new AlchemyProvider(network,options.alchemy))}catch(error){}}if(allowService("ankr")&&options.ankr!=null){try{providers.push(new AnkrProvider(network,options.ankr))}catch(error){}}if(allowService("chainstack")){try{providers.push(new ChainstackProvider(network,options.chainstack))}catch(error){}}if(allowService("cloudflare")){try{providers.push(new CloudflareProvider(network))}catch(error){}}if(allowService("etherscan")){try{providers.push(new EtherscanProvider(network,options.etherscan))}catch(error){}}if(allowService("infura")){try{let projectId=options.infura;let projectSecret=undefined;if(typeof projectId==="object"){projectSecret=projectId.projectSecret;projectId=projectId.projectId}providers.push(new InfuraProvider(network,projectId,projectSecret))}catch(error){}}if(allowService("quicknode")){try{let token=options.quicknode;providers.push(new QuickNodeProvider(network,token))}catch(error){}}assert(providers.length,"unsupported default network","UNSUPPORTED_OPERATION",{operation:"getDefaultProvider"});if(providers.length===1){return providers[0]}let quorum=Math.floor(providers.length/2);if(quorum>2){quorum=2}if(staticNetwork&&Testnets.indexOf(staticNetwork.name)!==-1){quorum=1}if(options&&options.quorum){quorum=options.quorum}return new FallbackProvider(providers,undefined,{quorum:quorum})}class NonceManager extends AbstractSigner{signer;#noncePromise;#delta;constructor(signer){super(signer.provider);defineProperties(this,{signer:signer});this.#noncePromise=null;this.#delta=0}async getAddress(){return this.signer.getAddress()}connect(provider){return new NonceManager(this.signer.connect(provider))}async getNonce(blockTag){if(blockTag==="pending"){if(this.#noncePromise==null){this.#noncePromise=super.getNonce("pending")}const delta=this.#delta;return await this.#noncePromise+delta}return super.getNonce(blockTag)}increment(){this.#delta++}reset(){this.#delta=0;this.#noncePromise=null}async sendTransaction(tx){const noncePromise=this.getNonce("pending");this.increment();tx=await this.signer.populateTransaction(tx);tx.nonce=await noncePromise;return await this.signer.sendTransaction(tx)}signTransaction(tx){return this.signer.signTransaction(tx)}signMessage(message){return this.signer.signMessage(message)}signTypedData(domain,types,value){return this.signer.signTypedData(domain,types,value)}}class BrowserProvider extends JsonRpcApiPollingProvider{#request;#providerInfo;constructor(ethereum,network,_options){const options=Object.assign({},_options!=null?_options:{},{batchMaxCount:1});assertArgument(ethereum&ðereum.request,"invalid EIP-1193 provider","ethereum",ethereum);super(network,options);this.#providerInfo=null;if(_options&&_options.providerInfo){this.#providerInfo=_options.providerInfo}this.#request=async(method,params)=>{const payload={method:method,params:params};this.emit("debug",{action:"sendEip1193Request",payload:payload});try{const result=await ethereum.request(payload);this.emit("debug",{action:"receiveEip1193Result",result:result});return result}catch(e){const error=new Error(e.message);error.code=e.code;error.data=e.data;error.payload=payload;this.emit("debug",{action:"receiveEip1193Error",error:error});throw error}}}get providerInfo(){return this.#providerInfo}async send(method,params){await this._start();return await super.send(method,params)}async _send(payload){assertArgument(!Array.isArray(payload),"EIP-1193 does not support batch request","payload",payload);try{const result=await this.#request(payload.method,payload.params||[]);return[{id:payload.id,result:result}]}catch(e){return[{id:payload.id,error:{code:e.code,data:e.data,message:e.message}}]}}getRpcError(payload,error){error=JSON.parse(JSON.stringify(error));switch(error.error.code||-1){case 4001:error.error.message=`ethers-user-denied: ${error.error.message}`;break;case 4200:error.error.message=`ethers-unsupported: ${error.error.message}`;break}return super.getRpcError(payload,error)}async hasSigner(address){if(address==null){address=0}const accounts=await this.send("eth_accounts",[]);if(typeof address==="number"){return accounts.length>address}address=address.toLowerCase();return accounts.filter(a=>a.toLowerCase()===address).length!==0}async getSigner(address){if(address==null){address=0}if(!await this.hasSigner(address)){try{await this.#request("eth_requestAccounts",[])}catch(error){const payload=error.payload;throw this.getRpcError(payload,{id:payload.id,error:error})}}return await super.getSigner(address)}static async discover(options){if(options==null){options={}}if(options.provider){return new BrowserProvider(options.provider)}const context=options.window?options.window:typeof window!=="undefined"?window:null;if(context==null){return null}const anyProvider=options.anyProvider;if(anyProvider&&context.ethereum){return new BrowserProvider(context.ethereum)}if(!("addEventListener"in context&&"dispatchEvent"in context&&"removeEventListener"in context)){return null}const timeout=options.timeout?options.timeout:300;if(timeout===0){return null}return await new Promise((resolve,reject)=>{let found=[];const addProvider=event=>{found.push(event.detail);if(anyProvider){finalize()}};const finalize=()=>{clearTimeout(timer);if(found.length){if(options&&options.filter){const filtered=options.filter(found.map(i=>Object.assign({},i.info)));if(filtered==null){resolve(null)}else if(filtered instanceof BrowserProvider){resolve(filtered)}else{let match=null;if(filtered.uuid){const matches=found.filter(f=>filtered.uuid===f.info.uuid);match=matches[0]}if(match){const{provider,info}=match;resolve(new BrowserProvider(provider,undefined,{providerInfo:info}))}else{reject(makeError("filter returned unknown info","UNSUPPORTED_OPERATION",{value:filtered}))}}}else{const{provider,info}=found[0];resolve(new BrowserProvider(provider,undefined,{providerInfo:info}))}}else{resolve(null)}context.removeEventListener("eip6963:announceProvider",addProvider)};const timer=setTimeout(()=>{finalize()},timeout);context.addEventListener("eip6963:announceProvider",addProvider);context.dispatchEvent(new Event("eip6963:requestProvider"))})}}function getUrl(name){switch(name){case"mainnet":return"https://eth.blockscout.com/api/eth-rpc";case"sepolia":return"https://eth-sepolia.blockscout.com/api/eth-rpc";case"holesky":return"https://eth-holesky.blockscout.com/api/eth-rpc";case"classic":return"https://etc.blockscout.com/api/eth-rpc";case"arbitrum":return"https://arbitrum.blockscout.com/api/eth-rpc";case"base":return"https://base.blockscout.com/api/eth-rpc";case"base-sepolia":return"https://base-sepolia.blockscout.com/api/eth-rpc";case"matic":return"https://polygon.blockscout.com/api/eth-rpc";case"optimism":return"https://optimism.blockscout.com/api/eth-rpc";case"optimism-sepolia":return"https://optimism-sepolia.blockscout.com/api/eth-rpc";case"xdai":return"https://gnosis.blockscout.com/api/eth-rpc"}assertArgument(false,"unsupported network","network",name)}class BlockscoutProvider extends JsonRpcProvider{apiKey;constructor(_network,apiKey){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(apiKey==null){apiKey=null}const request=BlockscoutProvider.getRequest(network);super(request,network,{staticNetwork:network});defineProperties(this,{apiKey:apiKey})}_getProvider(chainId){try{return new BlockscoutProvider(chainId,this.apiKey)}catch(error){}return super._getProvider(chainId)}isCommunityResource(){return this.apiKey===null}getRpcRequest(req){const resp=super.getRpcRequest(req);if(resp&&resp.method==="eth_estimateGas"&&resp.args.length==1){resp.args=resp.args.slice();resp.args.push("latest")}return resp}getRpcError(payload,_error){const error=_error?_error.error:null;if(error&&error.code===-32015&&!isHexString(error.data||"",true)){const panicCodes={"assert(false)":"01","arithmetic underflow or overflow":"11","division or modulo by zero":"12","out-of-bounds array access; popping on an empty array":"31","out-of-bounds access of an array or bytesN":"32"};let panicCode="";if(error.message==="VM execution error."){panicCode=panicCodes[error.data]||""}else if(panicCodes[error.message||""]){panicCode=panicCodes[error.message||""]}if(panicCode){error.message+=` (reverted: ${error.data})`;error.data="0x4e487b7100000000000000000000000000000000000000000000000000000000000000"+panicCode}}else if(error&&error.code===-32e3){if(error.message==="wrong transaction nonce"){error.message+=" (nonce too low)"}}return super.getRpcError(payload,_error)}static getRequest(network){const request=new FetchRequest(getUrl(network.name));request.allowGzip=true;return request}}const defaultApplicationId="62e1ad51b37b8e00394bda3b";function getHost(name){switch(name){case"mainnet":return"eth-mainnet.gateway.pokt.network";case"goerli":return"eth-goerli.gateway.pokt.network";case"matic":return"poly-mainnet.gateway.pokt.network";case"matic-mumbai":return"polygon-mumbai-rpc.gateway.pokt.network"}assertArgument(false,"unsupported network","network",name)}class PocketProvider extends JsonRpcProvider{applicationId;applicationSecret;constructor(_network,applicationId,applicationSecret){if(_network==null){_network="mainnet"}const network=Network.from(_network);if(applicationId==null){applicationId=defaultApplicationId}if(applicationSecret==null){applicationSecret=null}const options={staticNetwork:network};const request=PocketProvider.getRequest(network,applicationId,applicationSecret);super(request,network,options);defineProperties(this,{applicationId:applicationId,applicationSecret:applicationSecret})}_getProvider(chainId){try{return new PocketProvider(chainId,this.applicationId,this.applicationSecret)}catch(error){}return super._getProvider(chainId)}static getRequest(network,applicationId,applicationSecret){if(applicationId==null){applicationId=defaultApplicationId}const request=new FetchRequest(`https:/\/${getHost(network.name)}/v1/lb/${applicationId}`);request.allowGzip=true;if(applicationSecret){request.setCredentials("",applicationSecret)}if(applicationId===defaultApplicationId){request.retryFunc=async(request,response,attempt)=>{showThrottleMessage("PocketProvider");return true}}return request}isCommunityResource(){return this.applicationId===defaultApplicationId}}const IpcSocketProvider=undefined;class BaseWallet extends AbstractSigner{address;#signingKey;constructor(privateKey,provider){super(provider);assertArgument(privateKey&&typeof privateKey.sign==="function","invalid private key","privateKey","[ REDACTED ]");this.#signingKey=privateKey;const address=computeAddress(this.signingKey.publicKey);defineProperties(this,{address:address})}get signingKey(){return this.#signingKey}get privateKey(){return this.signingKey.privateKey}async getAddress(){return this.address}connect(provider){return new BaseWallet(this.#signingKey,provider)}async signTransaction(tx){tx=copyRequest(tx);const{to,from}=await resolveProperties({to:tx.to?resolveAddress(tx.to,this):undefined,from:tx.from?resolveAddress(tx.from,this):undefined});if(to!=null){tx.to=to}if(from!=null){tx.from=from}if(tx.from!=null){assertArgument(getAddress(tx.from)===this.address,"transaction from address mismatch","tx.from",tx.from);delete tx.from}const btx=Transaction.from(tx);btx.signature=this.signingKey.sign(btx.unsignedHash);return btx.serialized}async signMessage(message){return this.signMessageSync(message)}signMessageSync(message){return this.signingKey.sign(hashMessage(message)).serialized}authorizeSync(auth){assertArgument(typeof auth.address==="string","invalid address for authorizeSync","auth.address",auth);const signature=this.signingKey.sign(hashAuthorization(auth));return Object.assign({},{address:getAddress(auth.address),nonce:getBigInt(auth.nonce||0),chainId:getBigInt(auth.chainId||0)},{signature:signature})}async authorize(auth){auth=Object.assign({},auth,{address:await resolveAddress(auth.address,this)});return this.authorizeSync(await this.populateAuthorization(auth))}async signTypedData(domain,types,value){const populated=await TypedDataEncoder.resolveNames(domain,types,value,async name=>{assert(this.provider!=null,"cannot resolve ENS names without a provider","UNSUPPORTED_OPERATION",{operation:"resolveName",info:{name:name}});const address=await this.provider.resolveName(name);assert(address!=null,"unconfigured ENS name","UNCONFIGURED_NAME",{value:name});return address});return this.signingKey.sign(TypedDataEncoder.hash(populated.domain,types,populated.value)).serialized}}const subsChrs=" !#$%&'()*+,-./<=>?@[]^_`{|}~";const Word=/^[a-z]*$/i;function unfold(words,sep){let initial=97;return words.reduce((accum,word)=>{if(word===sep){initial++}else if(word.match(Word)){accum.push(String.fromCharCode(initial)+word)}else{initial=97;accum.push(word)}return accum},[])}function decode(data,subs){for(let i=subsChrs.length-1;i>=0;i--){data=data.split(subsChrs[i]).join(subs.substring(2*i,2*i+2))}const clumps=[];const leftover=data.replace(/(:|([0-9])|([A-Z][a-z]*))/g,(all,item,semi,word)=>{if(semi){for(let i=parseInt(semi);i>=0;i--){clumps.push(";")}}else{clumps.push(item.toLowerCase())}return""});if(leftover){throw new Error(`leftovers: ${JSON.stringify(leftover)}`)}return unfold(unfold(clumps,";"),":")}function decodeOwl(data){assertArgument(data[0]==="0","unsupported auwl data","data",data);return decode(data.substring(1+2*subsChrs.length),data.substring(1,1+2*subsChrs.length))}class Wordlist{locale;constructor(locale){defineProperties(this,{locale:locale})}split(phrase){return phrase.toLowerCase().split(/\s+/g)}join(words){return words.join(" ")}}class WordlistOwl extends Wordlist{#data;#checksum;constructor(locale,data,checksum){super(locale);this.#data=data;this.#checksum=checksum;this.#words=null}get _data(){return this.#data}_decodeWords(){return decodeOwl(this.#data)}#words;#loadWords(){if(this.#words==null){const words=this._decodeWords();const checksum=id(words.join("\n")+"\n");if(checksum!==this.#checksum){throw new Error(`BIP39 Wordlist for ${this.locale} FAILED`)}this.#words=words}return this.#words}getWord(index){const words=this.#loadWords();assertArgument(index>=0&&index=12&&words.length<=24,"invalid mnemonic length","mnemonic","[ REDACTED ]");const entropy=new Uint8Array(Math.ceil(11*words.length/8));let offset=0;for(let i=0;i=0,`invalid mnemonic word at index ${i}`,"mnemonic","[ REDACTED ]");for(let bit=0;bit<11;bit++){if(index&1<<10-bit){entropy[offset>>3]|=1<<7-offset%8}offset++}}const entropyBits=32*words.length/3;const checksumBits=words.length/3;const checksumMask=getUpperMask(checksumBits);const checksum=getBytes(sha256(entropy.slice(0,entropyBits/8)))[0]&checksumMask;assertArgument(checksum===(entropy[entropy.length-1]&checksumMask),"invalid mnemonic checksum","mnemonic","[ REDACTED ]");return hexlify(entropy.slice(0,entropyBits/8))}function entropyToMnemonic(entropy,wordlist){assertArgument(entropy.length%4===0&&entropy.length>=16&&entropy.length<=32,"invalid entropy size","entropy","[ REDACTED ]");if(wordlist==null){wordlist=LangEn.wordlist()}const indices=[0];let remainingBits=11;for(let i=0;i8){indices[indices.length-1]<<=8;indices[indices.length-1]|=entropy[i];remainingBits-=8}else{indices[indices.length-1]<<=remainingBits;indices[indices.length-1]|=entropy[i]>>8-remainingBits;indices.push(entropy[i]&getLowerMask(8-remainingBits));remainingBits+=3}}const checksumBits=entropy.length/4;const checksum=parseInt(sha256(entropy).substring(2,4),16)&getUpperMask(checksumBits);indices[indices.length-1]<<=checksumBits;indices[indices.length-1]|=checksum>>8-checksumBits;return wordlist.join(indices.map(index=>wordlist.getWord(index)))}const _guard$1={};class Mnemonic{phrase;password;wordlist;entropy;constructor(guard,entropy,phrase,password,wordlist){if(password==null){password=""}if(wordlist==null){wordlist=LangEn.wordlist()}assertPrivate(guard,_guard$1,"Mnemonic");defineProperties(this,{phrase:phrase,password:password,wordlist:wordlist,entropy:entropy})}computeSeed(){const salt=toUtf8Bytes("mnemonic"+this.password,"NFKD");return pbkdf2(toUtf8Bytes(this.phrase,"NFKD"),salt,2048,64,"sha512")}static fromPhrase(phrase,password,wordlist){const entropy=mnemonicToEntropy(phrase,wordlist);phrase=entropyToMnemonic(getBytes(entropy),wordlist);return new Mnemonic(_guard$1,entropy,phrase,password,wordlist)}static fromEntropy(_entropy,password,wordlist){const entropy=getBytes(_entropy,"entropy");const phrase=entropyToMnemonic(entropy,wordlist);return new Mnemonic(_guard$1,hexlify(entropy),phrase,password,wordlist)}static entropyToPhrase(_entropy,wordlist){const entropy=getBytes(_entropy,"entropy");return entropyToMnemonic(entropy,wordlist)}static phraseToEntropy(phrase,wordlist){return mnemonicToEntropy(phrase,wordlist)}static isValidMnemonic(phrase,wordlist){try{mnemonicToEntropy(phrase,wordlist);return true}catch(error){}return false}}var __classPrivateFieldGet$2=__$G&&__$G.__classPrivateFieldGet||function(receiver,state,kind,f){if(kind==="a"&&!f)throw new TypeError("Private accessor was defined without a getter");if(typeof state==="function"?receiver!==state||!f:!state.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f:kind==="a"?f.call(receiver):f?f.value:state.get(receiver)};var __classPrivateFieldSet$2=__$G&&__$G.__classPrivateFieldSet||function(receiver,state,value,kind,f){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f)throw new TypeError("Private accessor was defined without a setter");if(typeof state==="function"?receiver!==state||!f:!state.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f.call(receiver,value):f?f.value=value:state.set(receiver,value),value};var _AES_key,_AES_Kd,_AES_Ke;const numberOfRounds={16:10,24:12,32:14};const rcon=[1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145];const S=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];const Si=[82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125];const T1=[3328402341,4168907908,4000806809,4135287693,4294111757,3597364157,3731845041,2445657428,1613770832,33620227,3462883241,1445669757,3892248089,3050821474,1303096294,3967186586,2412431941,528646813,2311702848,4202528135,4026202645,2992200171,2387036105,4226871307,1101901292,3017069671,1604494077,1169141738,597466303,1403299063,3832705686,2613100635,1974974402,3791519004,1033081774,1277568618,1815492186,2118074177,4126668546,2211236943,1748251740,1369810420,3521504564,4193382664,3799085459,2883115123,1647391059,706024767,134480908,2512897874,1176707941,2646852446,806885416,932615841,168101135,798661301,235341577,605164086,461406363,3756188221,3454790438,1311188841,2142417613,3933566367,302582043,495158174,1479289972,874125870,907746093,3698224818,3025820398,1537253627,2756858614,1983593293,3084310113,2108928974,1378429307,3722699582,1580150641,327451799,2790478837,3117535592,0,3253595436,1075847264,3825007647,2041688520,3059440621,3563743934,2378943302,1740553945,1916352843,2487896798,2555137236,2958579944,2244988746,3151024235,3320835882,1336584933,3992714006,2252555205,2588757463,1714631509,293963156,2319795663,3925473552,67240454,4269768577,2689618160,2017213508,631218106,1269344483,2723238387,1571005438,2151694528,93294474,1066570413,563977660,1882732616,4059428100,1673313503,2008463041,2950355573,1109467491,537923632,3858759450,4260623118,3218264685,2177748300,403442708,638784309,3287084079,3193921505,899127202,2286175436,773265209,2479146071,1437050866,4236148354,2050833735,3362022572,3126681063,840505643,3866325909,3227541664,427917720,2655997905,2749160575,1143087718,1412049534,999329963,193497219,2353415882,3354324521,1807268051,672404540,2816401017,3160301282,369822493,2916866934,3688947771,1681011286,1949973070,336202270,2454276571,201721354,1210328172,3093060836,2680341085,3184776046,1135389935,3294782118,965841320,831886756,3554993207,4068047243,3588745010,2345191491,1849112409,3664604599,26054028,2983581028,2622377682,1235855840,3630984372,2891339514,4092916743,3488279077,3395642799,4101667470,1202630377,268961816,1874508501,4034427016,1243948399,1546530418,941366308,1470539505,1941222599,2546386513,3421038627,2715671932,3899946140,1042226977,2521517021,1639824860,227249030,260737669,3765465232,2084453954,1907733956,3429263018,2420656344,100860677,4160157185,470683154,3261161891,1781871967,2924959737,1773779408,394692241,2579611992,974986535,664706745,3655459128,3958962195,731420851,571543859,3530123707,2849626480,126783113,865375399,765172662,1008606754,361203602,3387549984,2278477385,2857719295,1344809080,2782912378,59542671,1503764984,160008576,437062935,1707065306,3622233649,2218934982,3496503480,2185314755,697932208,1512910199,504303377,2075177163,2824099068,1841019862,739644986];const T2=[2781242211,2230877308,2582542199,2381740923,234877682,3184946027,2984144751,1418839493,1348481072,50462977,2848876391,2102799147,434634494,1656084439,3863849899,2599188086,1167051466,2636087938,1082771913,2281340285,368048890,3954334041,3381544775,201060592,3963727277,1739838676,4250903202,3930435503,3206782108,4149453988,2531553906,1536934080,3262494647,484572669,2923271059,1783375398,1517041206,1098792767,49674231,1334037708,1550332980,4098991525,886171109,150598129,2481090929,1940642008,1398944049,1059722517,201851908,1385547719,1699095331,1587397571,674240536,2704774806,252314885,3039795866,151914247,908333586,2602270848,1038082786,651029483,1766729511,3447698098,2682942837,454166793,2652734339,1951935532,775166490,758520603,3000790638,4004797018,4217086112,4137964114,1299594043,1639438038,3464344499,2068982057,1054729187,1901997871,2534638724,4121318227,1757008337,0,750906861,1614815264,535035132,3363418545,3988151131,3201591914,1183697867,3647454910,1265776953,3734260298,3566750796,3903871064,1250283471,1807470800,717615087,3847203498,384695291,3313910595,3617213773,1432761139,2484176261,3481945413,283769337,100925954,2180939647,4037038160,1148730428,3123027871,3813386408,4087501137,4267549603,3229630528,2315620239,2906624658,3156319645,1215313976,82966005,3747855548,3245848246,1974459098,1665278241,807407632,451280895,251524083,1841287890,1283575245,337120268,891687699,801369324,3787349855,2721421207,3431482436,959321879,1469301956,4065699751,2197585534,1199193405,2898814052,3887750493,724703513,2514908019,2696962144,2551808385,3516813135,2141445340,1715741218,2119445034,2872807568,2198571144,3398190662,700968686,3547052216,1009259540,2041044702,3803995742,487983883,1991105499,1004265696,1449407026,1316239930,504629770,3683797321,168560134,1816667172,3837287516,1570751170,1857934291,4014189740,2797888098,2822345105,2754712981,936633572,2347923833,852879335,1133234376,1500395319,3084545389,2348912013,1689376213,3533459022,3762923945,3034082412,4205598294,133428468,634383082,2949277029,2398386810,3913789102,403703816,3580869306,2297460856,1867130149,1918643758,607656988,4049053350,3346248884,1368901318,600565992,2090982877,2632479860,557719327,3717614411,3697393085,2249034635,2232388234,2430627952,1115438654,3295786421,2865522278,3633334344,84280067,33027830,303828494,2747425121,1600795957,4188952407,3496589753,2434238086,1486471617,658119965,3106381470,953803233,334231800,3005978776,857870609,3151128937,1890179545,2298973838,2805175444,3056442267,574365214,2450884487,550103529,1233637070,4289353045,2018519080,2057691103,2399374476,4166623649,2148108681,387583245,3664101311,836232934,3330556482,3100665960,3280093505,2955516313,2002398509,287182607,3413881008,4238890068,3597515707,975967766];const T3=[1671808611,2089089148,2006576759,2072901243,4061003762,1807603307,1873927791,3310653893,810573872,16974337,1739181671,729634347,4263110654,3613570519,2883997099,1989864566,3393556426,2191335298,3376449993,2106063485,4195741690,1508618841,1204391495,4027317232,2917941677,3563566036,2734514082,2951366063,2629772188,2767672228,1922491506,3227229120,3082974647,4246528509,2477669779,644500518,911895606,1061256767,4144166391,3427763148,878471220,2784252325,3845444069,4043897329,1905517169,3631459288,827548209,356461077,67897348,3344078279,593839651,3277757891,405286936,2527147926,84871685,2595565466,118033927,305538066,2157648768,3795705826,3945188843,661212711,2999812018,1973414517,152769033,2208177539,745822252,439235610,455947803,1857215598,1525593178,2700827552,1391895634,994932283,3596728278,3016654259,695947817,3812548067,795958831,2224493444,1408607827,3513301457,0,3979133421,543178784,4229948412,2982705585,1542305371,1790891114,3410398667,3201918910,961245753,1256100938,1289001036,1491644504,3477767631,3496721360,4012557807,2867154858,4212583931,1137018435,1305975373,861234739,2241073541,1171229253,4178635257,33948674,2139225727,1357946960,1011120188,2679776671,2833468328,1374921297,2751356323,1086357568,2408187279,2460827538,2646352285,944271416,4110742005,3168756668,3066132406,3665145818,560153121,271589392,4279952895,4077846003,3530407890,3444343245,202643468,322250259,3962553324,1608629855,2543990167,1154254916,389623319,3294073796,2817676711,2122513534,1028094525,1689045092,1575467613,422261273,1939203699,1621147744,2174228865,1339137615,3699352540,577127458,712922154,2427141008,2290289544,1187679302,3995715566,3100863416,339486740,3732514782,1591917662,186455563,3681988059,3762019296,844522546,978220090,169743370,1239126601,101321734,611076132,1558493276,3260915650,3547250131,2901361580,1655096418,2443721105,2510565781,3828863972,2039214713,3878868455,3359869896,928607799,1840765549,2374762893,3580146133,1322425422,2850048425,1823791212,1459268694,4094161908,3928346602,1706019429,2056189050,2934523822,135794696,3134549946,2022240376,628050469,779246638,472135708,2800834470,3032970164,3327236038,3894660072,3715932637,1956440180,522272287,1272813131,3185336765,2340818315,2323976074,1888542832,1044544574,3049550261,1722469478,1222152264,50660867,4127324150,236067854,1638122081,895445557,1475980887,3117443513,2257655686,3243809217,489110045,2662934430,3778599393,4162055160,2561878936,288563729,1773916777,3648039385,2391345038,2493985684,2612407707,505560094,2274497927,3911240169,3460925390,1442818645,678973480,3749357023,2358182796,2717407649,2306869641,219617805,3218761151,3862026214,1120306242,1756942440,1103331905,2578459033,762796589,252780047,2966125488,1425844308,3151392187,372911126];const T4=[1667474886,2088535288,2004326894,2071694838,4075949567,1802223062,1869591006,3318043793,808472672,16843522,1734846926,724270422,4278065639,3621216949,2880169549,1987484396,3402253711,2189597983,3385409673,2105378810,4210693615,1499065266,1195886990,4042263547,2913856577,3570689971,2728590687,2947541573,2627518243,2762274643,1920112356,3233831835,3082273397,4261223649,2475929149,640051788,909531756,1061110142,4160160501,3435941763,875846760,2779116625,3857003729,4059105529,1903268834,3638064043,825316194,353713962,67374088,3351728789,589522246,3284360861,404236336,2526454071,84217610,2593830191,117901582,303183396,2155911963,3806477791,3958056653,656894286,2998062463,1970642922,151591698,2206440989,741110872,437923380,454765878,1852748508,1515908788,2694904667,1381168804,993742198,3604373943,3014905469,690584402,3823320797,791638366,2223281939,1398011302,3520161977,0,3991743681,538992704,4244381667,2981218425,1532751286,1785380564,3419096717,3200178535,960056178,1246420628,1280103576,1482221744,3486468741,3503319995,4025428677,2863326543,4227536621,1128514950,1296947098,859002214,2240123921,1162203018,4193849577,33687044,2139062782,1347481760,1010582648,2678045221,2829640523,1364325282,2745433693,1077985408,2408548869,2459086143,2644360225,943212656,4126475505,3166494563,3065430391,3671750063,555836226,269496352,4294908645,4092792573,3537006015,3452783745,202118168,320025894,3974901699,1600119230,2543297077,1145359496,387397934,3301201811,2812801621,2122220284,1027426170,1684319432,1566435258,421079858,1936954854,1616945344,2172753945,1330631070,3705438115,572679748,707427924,2425400123,2290647819,1179044492,4008585671,3099120491,336870440,3739122087,1583276732,185277718,3688593069,3772791771,842159716,976899700,168435220,1229577106,101059084,606366792,1549591736,3267517855,3553849021,2897014595,1650632388,2442242105,2509612081,3840161747,2038008818,3890688725,3368567691,926374254,1835907034,2374863873,3587531953,1313788572,2846482505,1819063512,1448540844,4109633523,3941213647,1701162954,2054852340,2930698567,134748176,3132806511,2021165296,623210314,774795868,471606328,2795958615,3031746419,3334885783,3907527627,3722280097,1953799400,522133822,1263263126,3183336545,2341176845,2324333839,1886425312,1044267644,3048588401,1718004428,1212733584,50529542,4143317495,235803164,1633788866,892690282,1465383342,3115962473,2256965911,3250673817,488449850,2661202215,3789633753,4177007595,2560144171,286339874,1768537042,3654906025,2391705863,2492770099,2610673197,505291324,2273808917,3924369609,3469625735,1431699370,673740880,3755965093,2358021891,2711746649,2307489801,218961690,3217021541,3873845719,1111672452,1751693520,1094828930,2576986153,757954394,252645662,2964376443,1414855848,3149649517,370555436];const T5=[1374988112,2118214995,437757123,975658646,1001089995,530400753,2902087851,1273168787,540080725,2910219766,2295101073,4110568485,1340463100,3307916247,641025152,3043140495,3736164937,632953703,1172967064,1576976609,3274667266,2169303058,2370213795,1809054150,59727847,361929877,3211623147,2505202138,3569255213,1484005843,1239443753,2395588676,1975683434,4102977912,2572697195,666464733,3202437046,4035489047,3374361702,2110667444,1675577880,3843699074,2538681184,1649639237,2976151520,3144396420,4269907996,4178062228,1883793496,2403728665,2497604743,1383856311,2876494627,1917518562,3810496343,1716890410,3001755655,800440835,2261089178,3543599269,807962610,599762354,33778362,3977675356,2328828971,2809771154,4077384432,1315562145,1708848333,101039829,3509871135,3299278474,875451293,2733856160,92987698,2767645557,193195065,1080094634,1584504582,3178106961,1042385657,2531067453,3711829422,1306967366,2438237621,1908694277,67556463,1615861247,429456164,3602770327,2302690252,1742315127,2968011453,126454664,3877198648,2043211483,2709260871,2084704233,4169408201,0,159417987,841739592,504459436,1817866830,4245618683,260388950,1034867998,908933415,168810852,1750902305,2606453969,607530554,202008497,2472011535,3035535058,463180190,2160117071,1641816226,1517767529,470948374,3801332234,3231722213,1008918595,303765277,235474187,4069246893,766945465,337553864,1475418501,2943682380,4003061179,2743034109,4144047775,1551037884,1147550661,1543208500,2336434550,3408119516,3069049960,3102011747,3610369226,1113818384,328671808,2227573024,2236228733,3535486456,2935566865,3341394285,496906059,3702665459,226906860,2009195472,733156972,2842737049,294930682,1206477858,2835123396,2700099354,1451044056,573804783,2269728455,3644379585,2362090238,2564033334,2801107407,2776292904,3669462566,1068351396,742039012,1350078989,1784663195,1417561698,4136440770,2430122216,775550814,2193862645,2673705150,1775276924,1876241833,3475313331,3366754619,270040487,3902563182,3678124923,3441850377,1851332852,3969562369,2203032232,3868552805,2868897406,566021896,4011190502,3135740889,1248802510,3936291284,699432150,832877231,708780849,3332740144,899835584,1951317047,4236429990,3767586992,866637845,4043610186,1106041591,2144161806,395441711,1984812685,1139781709,3433712980,3835036895,2664543715,1282050075,3240894392,1181045119,2640243204,25965917,4203181171,4211818798,3009879386,2463879762,3910161971,1842759443,2597806476,933301370,1509430414,3943906441,3467192302,3076639029,3776767469,2051518780,2631065433,1441952575,404016761,1942435775,1408749034,1610459739,3745345300,2017778566,3400528769,3110650942,941896748,3265478751,371049330,3168937228,675039627,4279080257,967311729,135050206,3635733660,1683407248,2076935265,3576870512,1215061108,3501741890];const T6=[1347548327,1400783205,3273267108,2520393566,3409685355,4045380933,2880240216,2471224067,1428173050,4138563181,2441661558,636813900,4233094615,3620022987,2149987652,2411029155,1239331162,1730525723,2554718734,3781033664,46346101,310463728,2743944855,3328955385,3875770207,2501218972,3955191162,3667219033,768917123,3545789473,692707433,1150208456,1786102409,2029293177,1805211710,3710368113,3065962831,401639597,1724457132,3028143674,409198410,2196052529,1620529459,1164071807,3769721975,2226875310,486441376,2499348523,1483753576,428819965,2274680428,3075636216,598438867,3799141122,1474502543,711349675,129166120,53458370,2592523643,2782082824,4063242375,2988687269,3120694122,1559041666,730517276,2460449204,4042459122,2706270690,3446004468,3573941694,533804130,2328143614,2637442643,2695033685,839224033,1973745387,957055980,2856345839,106852767,1371368976,4181598602,1033297158,2933734917,1179510461,3046200461,91341917,1862534868,4284502037,605657339,2547432937,3431546947,2003294622,3182487618,2282195339,954669403,3682191598,1201765386,3917234703,3388507166,0,2198438022,1211247597,2887651696,1315723890,4227665663,1443857720,507358933,657861945,1678381017,560487590,3516619604,975451694,2970356327,261314535,3535072918,2652609425,1333838021,2724322336,1767536459,370938394,182621114,3854606378,1128014560,487725847,185469197,2918353863,3106780840,3356761769,2237133081,1286567175,3152976349,4255350624,2683765030,3160175349,3309594171,878443390,1988838185,3704300486,1756818940,1673061617,3403100636,272786309,1075025698,545572369,2105887268,4174560061,296679730,1841768865,1260232239,4091327024,3960309330,3497509347,1814803222,2578018489,4195456072,575138148,3299409036,446754879,3629546796,4011996048,3347532110,3252238545,4270639778,915985419,3483825537,681933534,651868046,2755636671,3828103837,223377554,2607439820,1649704518,3270937875,3901806776,1580087799,4118987695,3198115200,2087309459,2842678573,3016697106,1003007129,2802849917,1860738147,2077965243,164439672,4100872472,32283319,2827177882,1709610350,2125135846,136428751,3874428392,3652904859,3460984630,3572145929,3593056380,2939266226,824852259,818324884,3224740454,930369212,2801566410,2967507152,355706840,1257309336,4148292826,243256656,790073846,2373340630,1296297904,1422699085,3756299780,3818836405,457992840,3099667487,2135319889,77422314,1560382517,1945798516,788204353,1521706781,1385356242,870912086,325965383,2358957921,2050466060,2388260884,2313884476,4006521127,901210569,3990953189,1014646705,1503449823,1062597235,2031621326,3212035895,3931371469,1533017514,350174575,2256028891,2177544179,1052338372,741876788,1606591296,1914052035,213705253,2334669897,1107234197,1899603969,3725069491,2631447780,2422494913,1635502980,1893020342,1950903388,1120974935];const T7=[2807058932,1699970625,2764249623,1586903591,1808481195,1173430173,1487645946,59984867,4199882800,1844882806,1989249228,1277555970,3623636965,3419915562,1149249077,2744104290,1514790577,459744698,244860394,3235995134,1963115311,4027744588,2544078150,4190530515,1608975247,2627016082,2062270317,1507497298,2200818878,567498868,1764313568,3359936201,2305455554,2037970062,1047239e3,1910319033,1337376481,2904027272,2892417312,984907214,1243112415,830661914,861968209,2135253587,2011214180,2927934315,2686254721,731183368,1750626376,4246310725,1820824798,4172763771,3542330227,48394827,2404901663,2871682645,671593195,3254988725,2073724613,145085239,2280796200,2779915199,1790575107,2187128086,472615631,3029510009,4075877127,3802222185,4107101658,3201631749,1646252340,4270507174,1402811438,1436590835,3778151818,3950355702,3963161475,4020912224,2667994737,273792366,2331590177,104699613,95345982,3175501286,2377486676,1560637892,3564045318,369057872,4213447064,3919042237,1137477952,2658625497,1119727848,2340947849,1530455833,4007360968,172466556,266959938,516552836,0,2256734592,3980931627,1890328081,1917742170,4294704398,945164165,3575528878,958871085,3647212047,2787207260,1423022939,775562294,1739656202,3876557655,2530391278,2443058075,3310321856,547512796,1265195639,437656594,3121275539,719700128,3762502690,387781147,218828297,3350065803,2830708150,2848461854,428169201,122466165,3720081049,1627235199,648017665,4122762354,1002783846,2117360635,695634755,3336358691,4234721005,4049844452,3704280881,2232435299,574624663,287343814,612205898,1039717051,840019705,2708326185,793451934,821288114,1391201670,3822090177,376187827,3113855344,1224348052,1679968233,2361698556,1058709744,752375421,2431590963,1321699145,3519142200,2734591178,188127444,2177869557,3727205754,2384911031,3215212461,2648976442,2450346104,3432737375,1180849278,331544205,3102249176,4150144569,2952102595,2159976285,2474404304,766078933,313773861,2570832044,2108100632,1668212892,3145456443,2013908262,418672217,3070356634,2594734927,1852171925,3867060991,3473416636,3907448597,2614737639,919489135,164948639,2094410160,2997825956,590424639,2486224549,1723872674,3157750862,3399941250,3501252752,3625268135,2555048196,3673637356,1343127501,4130281361,3599595085,2957853679,1297403050,81781910,3051593425,2283490410,532201772,1367295589,3926170974,895287692,1953757831,1093597963,492483431,3528626907,1446242576,1192455638,1636604631,209336225,344873464,1015671571,669961897,3375740769,3857572124,2973530695,3747192018,1933530610,3464042516,935293895,3454686199,2858115069,1863638845,3683022916,4085369519,3292445032,875313188,1080017571,3279033885,621591778,1233856572,2504130317,24197544,3017672716,3835484340,3247465558,2220981195,3060847922,1551124588,1463996600];const T8=[4104605777,1097159550,396673818,660510266,2875968315,2638606623,4200115116,3808662347,821712160,1986918061,3430322568,38544885,3856137295,718002117,893681702,1654886325,2975484382,3122358053,3926825029,4274053469,796197571,1290801793,1184342925,3556361835,2405426947,2459735317,1836772287,1381620373,3196267988,1948373848,3764988233,3385345166,3263785589,2390325492,1480485785,3111247143,3780097726,2293045232,548169417,3459953789,3746175075,439452389,1362321559,1400849762,1685577905,1806599355,2174754046,137073913,1214797936,1174215055,3731654548,2079897426,1943217067,1258480242,529487843,1437280870,3945269170,3049390895,3313212038,923313619,679998e3,3215307299,57326082,377642221,3474729866,2041877159,133361907,1776460110,3673476453,96392454,878845905,2801699524,777231668,4082475170,2330014213,4142626212,2213296395,1626319424,1906247262,1846563261,562755902,3708173718,1040559837,3871163981,1418573201,3294430577,114585348,1343618912,2566595609,3186202582,1078185097,3651041127,3896688048,2307622919,425408743,3371096953,2081048481,1108339068,2216610296,0,2156299017,736970802,292596766,1517440620,251657213,2235061775,2933202493,758720310,265905162,1554391400,1532285339,908999204,174567692,1474760595,4002861748,2610011675,3234156416,3693126241,2001430874,303699484,2478443234,2687165888,585122620,454499602,151849742,2345119218,3064510765,514443284,4044981591,1963412655,2581445614,2137062819,19308535,1928707164,1715193156,4219352155,1126790795,600235211,3992742070,3841024952,836553431,1669664834,2535604243,3323011204,1243905413,3141400786,4180808110,698445255,2653899549,2989552604,2253581325,3252932727,3004591147,1891211689,2487810577,3915653703,4237083816,4030667424,2100090966,865136418,1229899655,953270745,3399679628,3557504664,4118925222,2061379749,3079546586,2915017791,983426092,2022837584,1607244650,2118541908,2366882550,3635996816,972512814,3283088770,1568718495,3499326569,3576539503,621982671,2895723464,410887952,2623762152,1002142683,645401037,1494807662,2595684844,1335535747,2507040230,4293295786,3167684641,367585007,3885750714,1865862730,2668221674,2960971305,2763173681,1059270954,2777952454,2724642869,1320957812,2194319100,2429595872,2815956275,77089521,3973773121,3444575871,2448830231,1305906550,4021308739,2857194700,2516901860,3518358430,1787304780,740276417,1699839814,1592394909,2352307457,2272556026,188821243,1729977011,3687994002,274084841,3594982253,3613494426,2701949495,4162096729,322734571,2837966542,1640576439,484830689,1202797690,3537852828,4067639125,349075736,3342319475,4157467219,4255800159,1030690015,1155237496,2951971274,1757691577,607398968,2738905026,499347990,3794078908,1011452712,227885567,2818666809,213114376,3034881240,1455525988,3414450555,850817237,1817998408,3092726480];const U1=[0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795];const U2=[0,185469197,370938394,487725847,741876788,657861945,975451694,824852259,1483753576,1400783205,1315723890,1164071807,1950903388,2135319889,1649704518,1767536459,2967507152,3152976349,2801566410,2918353863,2631447780,2547432937,2328143614,2177544179,3901806776,3818836405,4270639778,4118987695,3299409036,3483825537,3535072918,3652904859,2077965243,1893020342,1841768865,1724457132,1474502543,1559041666,1107234197,1257309336,598438867,681933534,901210569,1052338372,261314535,77422314,428819965,310463728,3409685355,3224740454,3710368113,3593056380,3875770207,3960309330,4045380933,4195456072,2471224067,2554718734,2237133081,2388260884,3212035895,3028143674,2842678573,2724322336,4138563181,4255350624,3769721975,3955191162,3667219033,3516619604,3431546947,3347532110,2933734917,2782082824,3099667487,3016697106,2196052529,2313884476,2499348523,2683765030,1179510461,1296297904,1347548327,1533017514,1786102409,1635502980,2087309459,2003294622,507358933,355706840,136428751,53458370,839224033,957055980,605657339,790073846,2373340630,2256028891,2607439820,2422494913,2706270690,2856345839,3075636216,3160175349,3573941694,3725069491,3273267108,3356761769,4181598602,4063242375,4011996048,3828103837,1033297158,915985419,730517276,545572369,296679730,446754879,129166120,213705253,1709610350,1860738147,1945798516,2029293177,1239331162,1120974935,1606591296,1422699085,4148292826,4233094615,3781033664,3931371469,3682191598,3497509347,3446004468,3328955385,2939266226,2755636671,3106780840,2988687269,2198438022,2282195339,2501218972,2652609425,1201765386,1286567175,1371368976,1521706781,1805211710,1620529459,2105887268,1988838185,533804130,350174575,164439672,46346101,870912086,954669403,636813900,788204353,2358957921,2274680428,2592523643,2441661558,2695033685,2880240216,3065962831,3182487618,3572145929,3756299780,3270937875,3388507166,4174560061,4091327024,4006521127,3854606378,1014646705,930369212,711349675,560487590,272786309,457992840,106852767,223377554,1678381017,1862534868,1914052035,2031621326,1211247597,1128014560,1580087799,1428173050,32283319,182621114,401639597,486441376,768917123,651868046,1003007129,818324884,1503449823,1385356242,1333838021,1150208456,1973745387,2125135846,1673061617,1756818940,2970356327,3120694122,2802849917,2887651696,2637442643,2520393566,2334669897,2149987652,3917234703,3799141122,4284502037,4100872472,3309594171,3460984630,3545789473,3629546796,2050466060,1899603969,1814803222,1730525723,1443857720,1560382517,1075025698,1260232239,575138148,692707433,878443390,1062597235,243256656,91341917,409198410,325965383,3403100636,3252238545,3704300486,3620022987,3874428392,3990953189,4042459122,4227665663,2460449204,2578018489,2226875310,2411029155,3198115200,3046200461,2827177882,2743944855];const U3=[0,218828297,437656594,387781147,875313188,958871085,775562294,590424639,1750626376,1699970625,1917742170,2135253587,1551124588,1367295589,1180849278,1265195639,3501252752,3720081049,3399941250,3350065803,3835484340,3919042237,4270507174,4085369519,3102249176,3051593425,2734591178,2952102595,2361698556,2177869557,2530391278,2614737639,3145456443,3060847922,2708326185,2892417312,2404901663,2187128086,2504130317,2555048196,3542330227,3727205754,3375740769,3292445032,3876557655,3926170974,4246310725,4027744588,1808481195,1723872674,1910319033,2094410160,1608975247,1391201670,1173430173,1224348052,59984867,244860394,428169201,344873464,935293895,984907214,766078933,547512796,1844882806,1627235199,2011214180,2062270317,1507497298,1423022939,1137477952,1321699145,95345982,145085239,532201772,313773861,830661914,1015671571,731183368,648017665,3175501286,2957853679,2807058932,2858115069,2305455554,2220981195,2474404304,2658625497,3575528878,3625268135,3473416636,3254988725,3778151818,3963161475,4213447064,4130281361,3599595085,3683022916,3432737375,3247465558,3802222185,4020912224,4172763771,4122762354,3201631749,3017672716,2764249623,2848461854,2331590177,2280796200,2431590963,2648976442,104699613,188127444,472615631,287343814,840019705,1058709744,671593195,621591778,1852171925,1668212892,1953757831,2037970062,1514790577,1463996600,1080017571,1297403050,3673637356,3623636965,3235995134,3454686199,4007360968,3822090177,4107101658,4190530515,2997825956,3215212461,2830708150,2779915199,2256734592,2340947849,2627016082,2443058075,172466556,122466165,273792366,492483431,1047239e3,861968209,612205898,695634755,1646252340,1863638845,2013908262,1963115311,1446242576,1530455833,1277555970,1093597963,1636604631,1820824798,2073724613,1989249228,1436590835,1487645946,1337376481,1119727848,164948639,81781910,331544205,516552836,1039717051,821288114,669961897,719700128,2973530695,3157750862,2871682645,2787207260,2232435299,2283490410,2667994737,2450346104,3647212047,3564045318,3279033885,3464042516,3980931627,3762502690,4150144569,4199882800,3070356634,3121275539,2904027272,2686254721,2200818878,2384911031,2570832044,2486224549,3747192018,3528626907,3310321856,3359936201,3950355702,3867060991,4049844452,4234721005,1739656202,1790575107,2108100632,1890328081,1402811438,1586903591,1233856572,1149249077,266959938,48394827,369057872,418672217,1002783846,919489135,567498868,752375421,209336225,24197544,376187827,459744698,945164165,895287692,574624663,793451934,1679968233,1764313568,2117360635,1933530610,1343127501,1560637892,1243112415,1192455638,3704280881,3519142200,3336358691,3419915562,3907448597,3857572124,4075877127,4294704398,3029510009,3113855344,2927934315,2744104290,2159976285,2377486676,2594734927,2544078150];const U4=[0,151849742,303699484,454499602,607398968,758720310,908999204,1059270954,1214797936,1097159550,1517440620,1400849762,1817998408,1699839814,2118541908,2001430874,2429595872,2581445614,2194319100,2345119218,3034881240,3186202582,2801699524,2951971274,3635996816,3518358430,3399679628,3283088770,4237083816,4118925222,4002861748,3885750714,1002142683,850817237,698445255,548169417,529487843,377642221,227885567,77089521,1943217067,2061379749,1640576439,1757691577,1474760595,1592394909,1174215055,1290801793,2875968315,2724642869,3111247143,2960971305,2405426947,2253581325,2638606623,2487810577,3808662347,3926825029,4044981591,4162096729,3342319475,3459953789,3576539503,3693126241,1986918061,2137062819,1685577905,1836772287,1381620373,1532285339,1078185097,1229899655,1040559837,923313619,740276417,621982671,439452389,322734571,137073913,19308535,3871163981,4021308739,4104605777,4255800159,3263785589,3414450555,3499326569,3651041127,2933202493,2815956275,3167684641,3049390895,2330014213,2213296395,2566595609,2448830231,1305906550,1155237496,1607244650,1455525988,1776460110,1626319424,2079897426,1928707164,96392454,213114376,396673818,514443284,562755902,679998e3,865136418,983426092,3708173718,3557504664,3474729866,3323011204,4180808110,4030667424,3945269170,3794078908,2507040230,2623762152,2272556026,2390325492,2975484382,3092726480,2738905026,2857194700,3973773121,3856137295,4274053469,4157467219,3371096953,3252932727,3673476453,3556361835,2763173681,2915017791,3064510765,3215307299,2156299017,2307622919,2459735317,2610011675,2081048481,1963412655,1846563261,1729977011,1480485785,1362321559,1243905413,1126790795,878845905,1030690015,645401037,796197571,274084841,425408743,38544885,188821243,3613494426,3731654548,3313212038,3430322568,4082475170,4200115116,3780097726,3896688048,2668221674,2516901860,2366882550,2216610296,3141400786,2989552604,2837966542,2687165888,1202797690,1320957812,1437280870,1554391400,1669664834,1787304780,1906247262,2022837584,265905162,114585348,499347990,349075736,736970802,585122620,972512814,821712160,2595684844,2478443234,2293045232,2174754046,3196267988,3079546586,2895723464,2777952454,3537852828,3687994002,3234156416,3385345166,4142626212,4293295786,3841024952,3992742070,174567692,57326082,410887952,292596766,777231668,660510266,1011452712,893681702,1108339068,1258480242,1343618912,1494807662,1715193156,1865862730,1948373848,2100090966,2701949495,2818666809,3004591147,3122358053,2235061775,2352307457,2535604243,2653899549,3915653703,3764988233,4219352155,4067639125,3444575871,3294430577,3746175075,3594982253,836553431,953270745,600235211,718002117,367585007,484830689,133361907,251657213,2041877159,1891211689,1806599355,1654886325,1568718495,1418573201,1335535747,1184342925];function convertToInt32(bytes){const result=[];for(let i=0;i>2;__classPrivateFieldGet$2(this,_AES_Ke,"f")[index][i%4]=tk[i];__classPrivateFieldGet$2(this,_AES_Kd,"f")[rounds-index][i%4]=tk[i]}let rconpointer=0;let t=KC,tt;while(t>16&255]<<24^S[tt>>8&255]<<16^S[tt&255]<<8^S[tt>>24&255]^rcon[rconpointer]<<24;rconpointer+=1;if(KC!=8){for(let i=1;i>8&255]<<8^S[tt>>16&255]<<16^S[tt>>24&255]<<24;for(let i=KC/2+1;i>2;c=t%4;__classPrivateFieldGet$2(this,_AES_Ke,"f")[r][c]=tk[i];__classPrivateFieldGet$2(this,_AES_Kd,"f")[rounds-r][c]=tk[i++];t++}}for(let r=1;r>24&255]^U2[tt>>16&255]^U3[tt>>8&255]^U4[tt&255]}}}encrypt(plaintext){if(plaintext.length!=16){throw new TypeError("invalid plaintext size (must be 16 bytes)")}const rounds=__classPrivateFieldGet$2(this,_AES_Ke,"f").length-1;const a=[0,0,0,0];let t=convertToInt32(plaintext);for(let i=0;i<4;i++){t[i]^=__classPrivateFieldGet$2(this,_AES_Ke,"f")[0][i]}for(let r=1;r>24&255]^T2[t[(i+1)%4]>>16&255]^T3[t[(i+2)%4]>>8&255]^T4[t[(i+3)%4]&255]^__classPrivateFieldGet$2(this,_AES_Ke,"f")[r][i]}t=a.slice()}const result=new Uint8Array(16);let tt=0;for(let i=0;i<4;i++){tt=__classPrivateFieldGet$2(this,_AES_Ke,"f")[rounds][i];result[4*i]=(S[t[i]>>24&255]^tt>>24)&255;result[4*i+1]=(S[t[(i+1)%4]>>16&255]^tt>>16)&255;result[4*i+2]=(S[t[(i+2)%4]>>8&255]^tt>>8)&255;result[4*i+3]=(S[t[(i+3)%4]&255]^tt)&255}return result}decrypt(ciphertext){if(ciphertext.length!=16){throw new TypeError("invalid ciphertext size (must be 16 bytes)")}const rounds=__classPrivateFieldGet$2(this,_AES_Kd,"f").length-1;const a=[0,0,0,0];let t=convertToInt32(ciphertext);for(let i=0;i<4;i++){t[i]^=__classPrivateFieldGet$2(this,_AES_Kd,"f")[0][i]}for(let r=1;r>24&255]^T6[t[(i+3)%4]>>16&255]^T7[t[(i+2)%4]>>8&255]^T8[t[(i+1)%4]&255]^__classPrivateFieldGet$2(this,_AES_Kd,"f")[r][i]}t=a.slice()}const result=new Uint8Array(16);let tt=0;for(let i=0;i<4;i++){tt=__classPrivateFieldGet$2(this,_AES_Kd,"f")[rounds][i];result[4*i]=(Si[t[i]>>24&255]^tt>>24)&255;result[4*i+1]=(Si[t[(i+3)%4]>>16&255]^tt>>16)&255;result[4*i+2]=(Si[t[(i+2)%4]>>8&255]^tt>>8)&255;result[4*i+3]=(Si[t[(i+1)%4]&255]^tt)&255}return result}}_AES_key=new WeakMap,_AES_Kd=new WeakMap,_AES_Ke=new WeakMap;class ModeOfOperation{constructor(name,key,cls){if(cls&&!(this instanceof cls)){throw new Error(`${name} must be instantiated with "new"`)}Object.defineProperties(this,{aes:{enumerable:true,value:new AES(key)},name:{enumerable:true,value:name}})}}var __classPrivateFieldSet$1=__$G&&__$G.__classPrivateFieldSet||function(receiver,state,value,kind,f){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f)throw new TypeError("Private accessor was defined without a setter");if(typeof state==="function"?receiver!==state||!f:!state.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f.call(receiver,value):f?f.value=value:state.set(receiver,value),value};var __classPrivateFieldGet$1=__$G&&__$G.__classPrivateFieldGet||function(receiver,state,kind,f){if(kind==="a"&&!f)throw new TypeError("Private accessor was defined without a getter");if(typeof state==="function"?receiver!==state||!f:!state.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f:kind==="a"?f.call(receiver):f?f.value:state.get(receiver)};var _CBC_iv,_CBC_lastBlock;class CBC extends ModeOfOperation{constructor(key,iv){super("ECC",key,CBC);_CBC_iv.set(this,void 0);_CBC_lastBlock.set(this,void 0);if(iv){if(iv.length%16){throw new TypeError("invalid iv size (must be 16 bytes)")}__classPrivateFieldSet$1(this,_CBC_iv,new Uint8Array(iv),"f")}else{__classPrivateFieldSet$1(this,_CBC_iv,new Uint8Array(16),"f")}__classPrivateFieldSet$1(this,_CBC_lastBlock,this.iv,"f")}get iv(){return new Uint8Array(__classPrivateFieldGet$1(this,_CBC_iv,"f"))}encrypt(plaintext){if(plaintext.length%16){throw new TypeError("invalid plaintext size (must be multiple of 16 bytes)")}const ciphertext=new Uint8Array(plaintext.length);for(let i=0;iNumber.MAX_SAFE_INTEGER){throw new TypeError("invalid counter initial integer value")}for(let index=15;index>=0;--index){__classPrivateFieldGet(this,_CTR_counter,"f")[index]=value%256;value=Math.floor(value/256)}}setCounterBytes(value){if(value.length!==16){throw new TypeError("invalid counter initial Uint8Array value length")}__classPrivateFieldGet(this,_CTR_counter,"f").set(value)}increment(){for(let i=15;i>=0;i--){if(__classPrivateFieldGet(this,_CTR_counter,"f")[i]===255){__classPrivateFieldGet(this,_CTR_counter,"f")[i]=0}else{__classPrivateFieldGet(this,_CTR_counter,"f")[i]++;break}}}encrypt(plaintext){var _a,_b;const crypttext=new Uint8Array(plaintext);for(let i=0;i16){throw new TypeError("PKCS#7 padding byte out of range")}const length=data.length-padder;for(let i=0;i0&&(N&N-1)===0,"invalid kdf.N","kdf.N",N);assertArgument(r>0&&p>0,"invalid kdf","kdf",kdf);const dkLen=spelunk(data,"crypto.kdfparams.dklen:int!");assertArgument(dkLen===32,"invalid kdf.dklen","kdf.dflen",dkLen);return{name:"scrypt",salt:salt,N:N,r:r,p:p,dkLen:64}}else if(kdf.toLowerCase()==="pbkdf2"){const salt=spelunk(data,"crypto.kdfparams.salt:data!");const prf=spelunk(data,"crypto.kdfparams.prf:string!");const algorithm=prf.split("-").pop();assertArgument(algorithm==="sha256"||algorithm==="sha512","invalid kdf.pdf","kdf.pdf",prf);const count=spelunk(data,"crypto.kdfparams.c:int!");const dkLen=spelunk(data,"crypto.kdfparams.dklen:int!");assertArgument(dkLen===32,"invalid kdf.dklen","kdf.dklen",dkLen);return{name:"pbkdf2",salt:salt,count:count,dkLen:dkLen,algorithm:algorithm}}}assertArgument(false,"unsupported key-derivation function","kdf",kdf)}function decryptKeystoreJsonSync(json,_password){const data=JSON.parse(json);const password=getPassword(_password);const params=getDecryptKdfParams(data);if(params.name==="pbkdf2"){const{salt,count,dkLen,algorithm}=params;const key=pbkdf2(password,salt,count,dkLen,algorithm);return getAccount(data,key)}assert(params.name==="scrypt","cannot be reached","UNKNOWN_ERROR",{params:params});const{salt,N,r,p,dkLen}=params;const key=scryptSync(password,salt,N,r,p,dkLen);return getAccount(data,key)}function stall$1(duration){return new Promise(resolve=>{setTimeout(()=>{resolve()},duration)})}async function decryptKeystoreJson(json,_password,progress){const data=JSON.parse(json);const password=getPassword(_password);const params=getDecryptKdfParams(data);if(params.name==="pbkdf2"){if(progress){progress(0);await stall$1(0)}const{salt,count,dkLen,algorithm}=params;const key=pbkdf2(password,salt,count,dkLen,algorithm);if(progress){progress(1);await stall$1(0)}return getAccount(data,key)}assert(params.name==="scrypt","cannot be reached","UNKNOWN_ERROR",{params:params});const{salt,N,r,p,dkLen}=params;const key=await scrypt(password,salt,N,r,p,dkLen,progress);return getAccount(data,key)}function getEncryptKdfParams(options){const salt=options.salt!=null?getBytes(options.salt,"options.salt"):randomBytes(32);let N=1<<17,r=8,p=1;if(options.scrypt){if(options.scrypt.N){N=options.scrypt.N}if(options.scrypt.r){r=options.scrypt.r}if(options.scrypt.p){p=options.scrypt.p}}assertArgument(typeof N==="number"&&N>0&&Number.isSafeInteger(N)&&(BigInt(N)&BigInt(N-1))===BigInt(0),"invalid scrypt N parameter","options.N",N);assertArgument(typeof r==="number"&&r>0&&Number.isSafeInteger(r),"invalid scrypt r parameter","options.r",r);assertArgument(typeof p==="number"&&p>0&&Number.isSafeInteger(p),"invalid scrypt p parameter","options.p",p);return{name:"scrypt",dkLen:32,salt:salt,N:N,r:r,p:p}}function _encryptKeystore(key,kdf,account,options){const privateKey=getBytes(account.privateKey,"privateKey");const iv=options.iv!=null?getBytes(options.iv,"options.iv"):randomBytes(16);assertArgument(iv.length===16,"invalid options.iv length","options.iv",options.iv);const uuidRandom=options.uuid!=null?getBytes(options.uuid,"options.uuid"):randomBytes(16);assertArgument(uuidRandom.length===16,"invalid options.uuid length","options.uuid",options.iv);const derivedKey=key.slice(0,16);const macPrefix=key.slice(16,32);const aesCtr=new CTR(derivedKey,iv);const ciphertext=getBytes(aesCtr.encrypt(privateKey));const mac=keccak256(concat([macPrefix,ciphertext]));const data={address:account.address.substring(2).toLowerCase(),id:uuidV4(uuidRandom),version:3,Crypto:{cipher:"aes-128-ctr",cipherparams:{iv:hexlify(iv).substring(2)},ciphertext:hexlify(ciphertext).substring(2),kdf:"scrypt",kdfparams:{salt:hexlify(kdf.salt).substring(2),n:kdf.N,dklen:32,p:kdf.p,r:kdf.r},mac:mac.substring(2)}};if(account.mnemonic){const client=options.client!=null?options.client:`ethers/${version}`;const path=account.mnemonic.path||defaultPath$1;const locale=account.mnemonic.locale||"en";const mnemonicKey=key.slice(32,64);const entropy=getBytes(account.mnemonic.entropy,"account.mnemonic.entropy");const mnemonicIv=randomBytes(16);const mnemonicAesCtr=new CTR(mnemonicKey,mnemonicIv);const mnemonicCiphertext=getBytes(mnemonicAesCtr.encrypt(entropy));const now=new Date;const timestamp=now.getUTCFullYear()+"-"+zpad$1(now.getUTCMonth()+1,2)+"-"+zpad$1(now.getUTCDate(),2)+"T"+zpad$1(now.getUTCHours(),2)+"-"+zpad$1(now.getUTCMinutes(),2)+"-"+zpad$1(now.getUTCSeconds(),2)+".0Z";const gethFilename="UTC--"+timestamp+"--"+data.address;data["x-ethers"]={client:client,gethFilename:gethFilename,path:path,locale:locale,mnemonicCounter:hexlify(mnemonicIv).substring(2),mnemonicCiphertext:hexlify(mnemonicCiphertext).substring(2),version:"0.1"}}return JSON.stringify(data)}function encryptKeystoreJsonSync(account,password,options){if(options==null){options={}}const passwordBytes=getPassword(password);const kdf=getEncryptKdfParams(options);const key=scryptSync(passwordBytes,kdf.salt,kdf.N,kdf.r,kdf.p,64);return _encryptKeystore(getBytes(key),kdf,account,options)}async function encryptKeystoreJson(account,password,options){if(options==null){options={}}const passwordBytes=getPassword(password);const kdf=getEncryptKdfParams(options);const key=await scrypt(passwordBytes,kdf.salt,kdf.N,kdf.r,kdf.p,64,options.progressCallback);return _encryptKeystore(getBytes(key),kdf,account,options)}const defaultPath="m/44'/60'/0'/0/0";const MasterSecret=new Uint8Array([66,105,116,99,111,105,110,32,115,101,101,100]);const HardenedBit=2147483648;const N=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141");const Nibbles="0123456789abcdef";function zpad(value,length){let result="";while(value){result=Nibbles[value%16]+result;value=Math.trunc(value/16)}while(result.length=0;i-=8){data[33+(i>>3)]=index>>24-i&255}const I=getBytes(computeHmac("sha512",chainCode,data));return{IL:I.slice(0,32),IR:I.slice(32)}}function derivePath(node,path){const components=path.split("/");assertArgument(components.length>0,"invalid path","path",path);if(components[0]==="m"){assertArgument(node.depth===0,`cannot derive root path (i.e. path starting with "m/") for a node at non-zero depth ${node.depth}`,"path",path);components.shift()}let result=node;for(let i=0;i=16&&seed.length<=64,"invalid seed","seed","[REDACTED]");const I=getBytes(computeHmac("sha512",MasterSecret,seed));const signingKey=new SigningKey(hexlify(I.slice(0,32)));return new HDNodeWallet(_guard,signingKey,"0x00000000",hexlify(I.slice(32)),"m",0,0,mnemonic,null)}static fromExtendedKey(extendedKey){const bytes=toBeArray(decodeBase58(extendedKey));assertArgument(bytes.length===82||encodeBase58Check(bytes.slice(0,78))===extendedKey,"invalid extended key","extendedKey","[ REDACTED ]");const depth=bytes[4];const parentFingerprint=hexlify(bytes.slice(5,9));const index=parseInt(hexlify(bytes.slice(9,13)).substring(2),16);const chainCode=hexlify(bytes.slice(13,45));const key=bytes.slice(45,78);switch(hexlify(bytes.slice(0,4))){case"0x0488b21e":case"0x043587cf":{const publicKey=hexlify(key);return new HDNodeVoidWallet(_guard,computeAddress(publicKey),publicKey,parentFingerprint,chainCode,null,index,depth,null)}case"0x0488ade4":case"0x04358394 ":if(key[0]!==0){break}return new HDNodeWallet(_guard,new SigningKey(key.slice(1)),parentFingerprint,chainCode,null,index,depth,null,null)}assertArgument(false,"invalid extended key prefix","extendedKey","[ REDACTED ]")}static createRandom(password,path,wordlist){if(password==null){password=""}if(path==null){path=defaultPath}if(wordlist==null){wordlist=LangEn.wordlist()}const mnemonic=Mnemonic.fromEntropy(randomBytes(16),password,wordlist);return HDNodeWallet.#fromSeed(mnemonic.computeSeed(),mnemonic).derivePath(path)}static fromMnemonic(mnemonic,path){if(!path){path=defaultPath}return HDNodeWallet.#fromSeed(mnemonic.computeSeed(),mnemonic).derivePath(path)}static fromPhrase(phrase,password,path,wordlist){if(password==null){password=""}if(path==null){path=defaultPath}if(wordlist==null){wordlist=LangEn.wordlist()}const mnemonic=Mnemonic.fromPhrase(phrase,password,wordlist);return HDNodeWallet.#fromSeed(mnemonic.computeSeed(),mnemonic).derivePath(path)}static fromSeed(seed){return HDNodeWallet.#fromSeed(seed,null)}}class HDNodeVoidWallet extends VoidSigner{publicKey;fingerprint;parentFingerprint;chainCode;path;index;depth;constructor(guard,address,publicKey,parentFingerprint,chainCode,path,index,depth,provider){super(address,provider);assertPrivate(guard,_guard,"HDNodeVoidWallet");defineProperties(this,{publicKey:publicKey});const fingerprint=dataSlice(ripemd160(sha256(publicKey)),0,4);defineProperties(this,{publicKey:publicKey,fingerprint:fingerprint,parentFingerprint:parentFingerprint,chainCode:chainCode,path:path,index:index,depth:depth})}connect(provider){return new HDNodeVoidWallet(_guard,this.address,this.publicKey,this.parentFingerprint,this.chainCode,this.path,this.index,this.depth,provider)}get extendedKey(){assert(this.depth<256,"Depth too deep","UNSUPPORTED_OPERATION",{operation:"extendedKey"});return encodeBase58Check(concat(["0x0488B21E",zpad(this.depth,1),this.parentFingerprint,zpad(this.index,4),this.chainCode,this.publicKey]))}hasPath(){return this.path!=null}deriveChild(_index){const index=getNumber(_index,"index");assertArgument(index<=4294967295,"invalid index","index",index);let path=this.path;if(path){path+="/"+(index&~HardenedBit);if(index&HardenedBit){path+="'"}}const{IR,IL}=ser_I(index,this.chainCode,this.publicKey,null);const Ki=SigningKey.addPoints(IL,this.publicKey,true);const address=computeAddress(Ki);return new HDNodeVoidWallet(_guard,address,Ki,this.fingerprint,hexlify(IR),path,index,this.depth+1,this.provider)}derivePath(path){return derivePath(this,path)}}function getAccountPath(_index){const index=getNumber(_index,"index");assertArgument(index>=0&&index=0&&index{setTimeout(()=>{resolve()},duration)})}class Wallet extends BaseWallet{constructor(key,provider){if(typeof key==="string"&&!key.startsWith("0x")){key="0x"+key}let signingKey=typeof key==="string"?new SigningKey(key):key;super(signingKey,provider)}connect(provider){return new Wallet(this.signingKey,provider)}async encrypt(password,progressCallback){const account={address:this.address,privateKey:this.privateKey};return await encryptKeystoreJson(account,password,{progressCallback:progressCallback})}encryptSync(password){const account={address:this.address,privateKey:this.privateKey};return encryptKeystoreJsonSync(account,password)}static#fromAccount(account){assertArgument(account,"invalid JSON wallet","json","[ REDACTED ]");if("mnemonic"in account&&account.mnemonic&&account.mnemonic.locale==="en"){const mnemonic=Mnemonic.fromEntropy(account.mnemonic.entropy);const wallet=HDNodeWallet.fromMnemonic(mnemonic,account.mnemonic.path);if(wallet.address===account.address&&wallet.privateKey===account.privateKey){return wallet}console.log("WARNING: JSON mismatch address/privateKey != mnemonic; fallback onto private key")}const wallet=new Wallet(account.privateKey);assertArgument(wallet.address===account.address,"address/privateKey mismatch","json","[ REDACTED ]");return wallet}static async fromEncryptedJson(json,password,progress){let account=null;if(isKeystoreJson(json)){account=await decryptKeystoreJson(json,password,progress)}else if(isCrowdsaleJson(json)){if(progress){progress(0);await stall(0)}account=decryptCrowdsaleJson(json,password);if(progress){progress(1);await stall(0)}}return Wallet.#fromAccount(account)}static fromEncryptedJsonSync(json,password){let account=null;if(isKeystoreJson(json)){account=decryptKeystoreJsonSync(json,password)}else if(isCrowdsaleJson(json)){account=decryptCrowdsaleJson(json,password)}else{assertArgument(false,"invalid JSON wallet","json","[ REDACTED ]")}return Wallet.#fromAccount(account)}static createRandom(provider){const wallet=HDNodeWallet.createRandom();if(provider){return wallet.connect(provider)}return wallet}static fromPhrase(phrase,provider){const wallet=HDNodeWallet.fromPhrase(phrase);if(provider){return wallet.connect(provider)}return wallet}}const Base64=")!@#$%^&*(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_";function decodeBits(width,data){const maxValue=(1<=width){const value=accum>>bits-width;accum&=(1<{const match=accent.match(/^([a-z]*)([0-9]+)([0-9])(.*)$/);assertArgument(match!==null,"internal error parsing accents","accents",accents);let posOffset=0;const positions=decodeBits(parseInt(match[3]),match[4]);const charCode=parseInt(match[2]);const regex=new RegExp(`([${match[1]}])`,"g");words=words.replace(regex,(all,letter)=>{const rem=--positions[posOffset];if(rem===0){letter=String.fromCharCode(letter.charCodeAt(0),charCode);posOffset++}return letter})});return words.split(",")}class WordlistOwlA extends WordlistOwl{#accent;constructor(locale,data,accent,checksum){super(locale,data,checksum);this.#accent=accent}get _accent(){return this.#accent}_decodeWords(){return decodeOwlA(this._data,this._accent)}}const wordlists={en:LangEn.wordlist()};var ethers=Object.freeze({__proto__:null,AbiCoder:AbiCoder,AbstractProvider:AbstractProvider,AbstractSigner:AbstractSigner,AlchemyProvider:AlchemyProvider,AnkrProvider:AnkrProvider,BaseContract:BaseContract,BaseWallet:BaseWallet,Block:Block,BlockscoutProvider:BlockscoutProvider,BrowserProvider:BrowserProvider,ChainstackProvider:ChainstackProvider,CloudflareProvider:CloudflareProvider,ConstructorFragment:ConstructorFragment,Contract:Contract,ContractEventPayload:ContractEventPayload,ContractFactory:ContractFactory,ContractTransactionReceipt:ContractTransactionReceipt,ContractTransactionResponse:ContractTransactionResponse,ContractUnknownEventPayload:ContractUnknownEventPayload,EnsPlugin:EnsPlugin,EnsResolver:EnsResolver,ErrorDescription:ErrorDescription,ErrorFragment:ErrorFragment,EtherSymbol:EtherSymbol,EtherscanPlugin:EtherscanPlugin,EtherscanProvider:EtherscanProvider,EventFragment:EventFragment,EventLog:EventLog,EventPayload:EventPayload,FallbackFragment:FallbackFragment,FallbackProvider:FallbackProvider,FeeData:FeeData,FeeDataNetworkPlugin:FeeDataNetworkPlugin,FetchCancelSignal:FetchCancelSignal,FetchRequest:FetchRequest,FetchResponse:FetchResponse,FetchUrlFeeDataNetworkPlugin:FetchUrlFeeDataNetworkPlugin,FixedNumber:FixedNumber,Fragment:Fragment,FunctionFragment:FunctionFragment,GasCostPlugin:GasCostPlugin,HDNodeVoidWallet:HDNodeVoidWallet,HDNodeWallet:HDNodeWallet,Indexed:Indexed,InfuraProvider:InfuraProvider,InfuraWebSocketProvider:InfuraWebSocketProvider,Interface:Interface,IpcSocketProvider:IpcSocketProvider,JsonRpcApiProvider:JsonRpcApiProvider,JsonRpcProvider:JsonRpcProvider,JsonRpcSigner:JsonRpcSigner,LangEn:LangEn,Log:Log,LogDescription:LogDescription,MaxInt256:MaxInt256,MaxUint256:MaxUint256,MessagePrefix:MessagePrefix,MinInt256:MinInt256,Mnemonic:Mnemonic,MulticoinProviderPlugin:MulticoinProviderPlugin,N:N$1,NamedFragment:NamedFragment,Network:Network,NetworkPlugin:NetworkPlugin,NonceManager:NonceManager,ParamType:ParamType,PocketProvider:PocketProvider,QuickNodeProvider:QuickNodeProvider,Result:Result,Signature:Signature,SigningKey:SigningKey,SocketBlockSubscriber:SocketBlockSubscriber,SocketEventSubscriber:SocketEventSubscriber,SocketPendingSubscriber:SocketPendingSubscriber,SocketProvider:SocketProvider,SocketSubscriber:SocketSubscriber,StructFragment:StructFragment,Transaction:Transaction,TransactionDescription:TransactionDescription,TransactionReceipt:TransactionReceipt,TransactionResponse:TransactionResponse,Typed:Typed,TypedDataEncoder:TypedDataEncoder,UndecodedEventLog:UndecodedEventLog,UnmanagedSubscriber:UnmanagedSubscriber,Utf8ErrorFuncs:Utf8ErrorFuncs,VoidSigner:VoidSigner,Wallet:Wallet,WebSocketProvider:WebSocketProvider,WeiPerEther:WeiPerEther,Wordlist:Wordlist,WordlistOwl:WordlistOwl,WordlistOwlA:WordlistOwlA,ZeroAddress:ZeroAddress,ZeroHash:ZeroHash,accessListify:accessListify,assert:assert,assertArgument:assertArgument,assertArgumentCount:assertArgumentCount,assertNormalize:assertNormalize,assertPrivate:assertPrivate,authorizationify:authorizationify,checkResultErrors:checkResultErrors,computeAddress:computeAddress,computeHmac:computeHmac,concat:concat,copyRequest:copyRequest,dataLength:dataLength,dataSlice:dataSlice,decodeBase58:decodeBase58,decodeBase64:decodeBase64,decodeBytes32String:decodeBytes32String,decodeRlp:decodeRlp,decryptCrowdsaleJson:decryptCrowdsaleJson,decryptKeystoreJson:decryptKeystoreJson,decryptKeystoreJsonSync:decryptKeystoreJsonSync,defaultPath:defaultPath,defineProperties:defineProperties,dnsEncode:dnsEncode,encodeBase58:encodeBase58,encodeBase64:encodeBase64,encodeBytes32String:encodeBytes32String,encodeRlp:encodeRlp,encryptKeystoreJson:encryptKeystoreJson,encryptKeystoreJsonSync:encryptKeystoreJsonSync,ensNormalize:ensNormalize,formatEther:formatEther,formatUnits:formatUnits,fromTwos:fromTwos,getAccountPath:getAccountPath,getAddress:getAddress,getBigInt:getBigInt,getBytes:getBytes,getBytesCopy:getBytesCopy,getCreate2Address:getCreate2Address,getCreateAddress:getCreateAddress,getDefaultProvider:getDefaultProvider,getIcapAddress:getIcapAddress,getIndexedAccountPath:getIndexedAccountPath,getNumber:getNumber,getUint:getUint,hashAuthorization:hashAuthorization,hashMessage:hashMessage,hexlify:hexlify,id:id,isAddress:isAddress,isAddressable:isAddressable,isBytesLike:isBytesLike,isCallException:isCallException,isCrowdsaleJson:isCrowdsaleJson,isError:isError,isHexString:isHexString,isKeystoreJson:isKeystoreJson,isValidName:isValidName,keccak256:keccak256,lock:lock,makeError:makeError,mask:mask,namehash:namehash,parseEther:parseEther,parseUnits:parseUnits$1,pbkdf2:pbkdf2,randomBytes:randomBytes,recoverAddress:recoverAddress,resolveAddress:resolveAddress,resolveProperties:resolveProperties,ripemd160:ripemd160,scrypt:scrypt,scryptSync:scryptSync,sha256:sha256,sha512:sha512,showThrottleMessage:showThrottleMessage,solidityPacked:solidityPacked,solidityPackedKeccak256:solidityPackedKeccak256,solidityPackedSha256:solidityPackedSha256,stripZerosLeft:stripZerosLeft,toBeArray:toBeArray,toBeHex:toBeHex,toBigInt:toBigInt,toNumber:toNumber,toQuantity:toQuantity,toTwos:toTwos,toUtf8Bytes:toUtf8Bytes,toUtf8CodePoints:toUtf8CodePoints,toUtf8String:toUtf8String,uuidV4:uuidV4,verifyAuthorization:verifyAuthorization,verifyMessage:verifyMessage,verifyTypedData:verifyTypedData,version:version,wordlists:wordlists,zeroPadBytes:zeroPadBytes,zeroPadValue:zeroPadValue});exports.AbiCoder=AbiCoder;exports.AbstractProvider=AbstractProvider;exports.AbstractSigner=AbstractSigner;exports.AlchemyProvider=AlchemyProvider;exports.AnkrProvider=AnkrProvider;exports.BaseContract=BaseContract;exports.BaseWallet=BaseWallet;exports.Block=Block;exports.BlockscoutProvider=BlockscoutProvider;exports.BrowserProvider=BrowserProvider;exports.ChainstackProvider=ChainstackProvider;exports.CloudflareProvider=CloudflareProvider;exports.ConstructorFragment=ConstructorFragment;exports.Contract=Contract;exports.ContractEventPayload=ContractEventPayload;exports.ContractFactory=ContractFactory;exports.ContractTransactionReceipt=ContractTransactionReceipt;exports.ContractTransactionResponse=ContractTransactionResponse;exports.ContractUnknownEventPayload=ContractUnknownEventPayload;exports.EnsPlugin=EnsPlugin;exports.EnsResolver=EnsResolver;exports.ErrorDescription=ErrorDescription;exports.ErrorFragment=ErrorFragment;exports.EtherSymbol=EtherSymbol;exports.EtherscanPlugin=EtherscanPlugin;exports.EtherscanProvider=EtherscanProvider;exports.EventFragment=EventFragment;exports.EventLog=EventLog;exports.EventPayload=EventPayload;exports.FallbackFragment=FallbackFragment;exports.FallbackProvider=FallbackProvider;exports.FeeData=FeeData;exports.FeeDataNetworkPlugin=FeeDataNetworkPlugin;exports.FetchCancelSignal=FetchCancelSignal;exports.FetchRequest=FetchRequest;exports.FetchResponse=FetchResponse;exports.FetchUrlFeeDataNetworkPlugin=FetchUrlFeeDataNetworkPlugin;exports.FixedNumber=FixedNumber;exports.Fragment=Fragment;exports.FunctionFragment=FunctionFragment;exports.GasCostPlugin=GasCostPlugin;exports.HDNodeVoidWallet=HDNodeVoidWallet;exports.HDNodeWallet=HDNodeWallet;exports.Indexed=Indexed;exports.InfuraProvider=InfuraProvider;exports.InfuraWebSocketProvider=InfuraWebSocketProvider;exports.Interface=Interface;exports.IpcSocketProvider=IpcSocketProvider;exports.JsonRpcApiProvider=JsonRpcApiProvider;exports.JsonRpcProvider=JsonRpcProvider;exports.JsonRpcSigner=JsonRpcSigner;exports.LangEn=LangEn;exports.Log=Log;exports.LogDescription=LogDescription;exports.MaxInt256=MaxInt256;exports.MaxUint256=MaxUint256;exports.MessagePrefix=MessagePrefix;exports.MinInt256=MinInt256;exports.Mnemonic=Mnemonic;exports.MulticoinProviderPlugin=MulticoinProviderPlugin;exports.N=N$1;exports.NamedFragment=NamedFragment;exports.Network=Network;exports.NetworkPlugin=NetworkPlugin;exports.NonceManager=NonceManager;exports.ParamType=ParamType;exports.PocketProvider=PocketProvider;exports.QuickNodeProvider=QuickNodeProvider;exports.Result=Result;exports.Signature=Signature;exports.SigningKey=SigningKey;exports.SocketBlockSubscriber=SocketBlockSubscriber;exports.SocketEventSubscriber=SocketEventSubscriber;exports.SocketPendingSubscriber=SocketPendingSubscriber;exports.SocketProvider=SocketProvider;exports.SocketSubscriber=SocketSubscriber;exports.StructFragment=StructFragment;exports.Transaction=Transaction;exports.TransactionDescription=TransactionDescription;exports.TransactionReceipt=TransactionReceipt;exports.TransactionResponse=TransactionResponse;exports.Typed=Typed;exports.TypedDataEncoder=TypedDataEncoder;exports.UndecodedEventLog=UndecodedEventLog;exports.UnmanagedSubscriber=UnmanagedSubscriber;exports.Utf8ErrorFuncs=Utf8ErrorFuncs;exports.VoidSigner=VoidSigner;exports.Wallet=Wallet;exports.WebSocketProvider=WebSocketProvider;exports.WeiPerEther=WeiPerEther;exports.Wordlist=Wordlist;exports.WordlistOwl=WordlistOwl;exports.WordlistOwlA=WordlistOwlA;exports.ZeroAddress=ZeroAddress;exports.ZeroHash=ZeroHash;exports.accessListify=accessListify;exports.assert=assert;exports.assertArgument=assertArgument;exports.assertArgumentCount=assertArgumentCount;exports.assertNormalize=assertNormalize;exports.assertPrivate=assertPrivate;exports.authorizationify=authorizationify;exports.checkResultErrors=checkResultErrors;exports.computeAddress=computeAddress;exports.computeHmac=computeHmac;exports.concat=concat;exports.copyRequest=copyRequest;exports.dataLength=dataLength;exports.dataSlice=dataSlice;exports.decodeBase58=decodeBase58;exports.decodeBase64=decodeBase64;exports.decodeBytes32String=decodeBytes32String;exports.decodeRlp=decodeRlp;exports.decryptCrowdsaleJson=decryptCrowdsaleJson;exports.decryptKeystoreJson=decryptKeystoreJson;exports.decryptKeystoreJsonSync=decryptKeystoreJsonSync;exports.defaultPath=defaultPath;exports.defineProperties=defineProperties;exports.dnsEncode=dnsEncode;exports.encodeBase58=encodeBase58;exports.encodeBase64=encodeBase64;exports.encodeBytes32String=encodeBytes32String;exports.encodeRlp=encodeRlp;exports.encryptKeystoreJson=encryptKeystoreJson;exports.encryptKeystoreJsonSync=encryptKeystoreJsonSync;exports.ensNormalize=ensNormalize;exports.ethers=ethers;exports.formatEther=formatEther;exports.formatUnits=formatUnits;exports.fromTwos=fromTwos;exports.getAccountPath=getAccountPath;exports.getAddress=getAddress;exports.getBigInt=getBigInt;exports.getBytes=getBytes;exports.getBytesCopy=getBytesCopy;exports.getCreate2Address=getCreate2Address;exports.getCreateAddress=getCreateAddress;exports.getDefaultProvider=getDefaultProvider;exports.getIcapAddress=getIcapAddress;exports.getIndexedAccountPath=getIndexedAccountPath;exports.getNumber=getNumber;exports.getUint=getUint;exports.hashAuthorization=hashAuthorization;exports.hashMessage=hashMessage;exports.hexlify=hexlify;exports.id=id;exports.isAddress=isAddress;exports.isAddressable=isAddressable;exports.isBytesLike=isBytesLike;exports.isCallException=isCallException;exports.isCrowdsaleJson=isCrowdsaleJson;exports.isError=isError;exports.isHexString=isHexString;exports.isKeystoreJson=isKeystoreJson;exports.isValidName=isValidName;exports.keccak256=keccak256;exports.lock=lock;exports.makeError=makeError;exports.mask=mask;exports.namehash=namehash;exports.parseEther=parseEther;exports.parseUnits=parseUnits$1;exports.pbkdf2=pbkdf2;exports.randomBytes=randomBytes;exports.recoverAddress=recoverAddress;exports.resolveAddress=resolveAddress;exports.resolveProperties=resolveProperties;exports.ripemd160=ripemd160;exports.scrypt=scrypt;exports.scryptSync=scryptSync;exports.sha256=sha256;exports.sha512=sha512;exports.showThrottleMessage=showThrottleMessage;exports.solidityPacked=solidityPacked;exports.solidityPackedKeccak256=solidityPackedKeccak256;exports.solidityPackedSha256=solidityPackedSha256;exports.stripZerosLeft=stripZerosLeft;exports.toBeArray=toBeArray;exports.toBeHex=toBeHex;exports.toBigInt=toBigInt;exports.toNumber=toNumber;exports.toQuantity=toQuantity;exports.toTwos=toTwos;exports.toUtf8Bytes=toUtf8Bytes;exports.toUtf8CodePoints=toUtf8CodePoints;exports.toUtf8String=toUtf8String;exports.uuidV4=uuidV4;exports.verifyAuthorization=verifyAuthorization;exports.verifyMessage=verifyMessage;exports.verifyTypedData=verifyTypedData;exports.version=version;exports.wordlists=wordlists;exports.zeroPadBytes=zeroPadBytes;exports.zeroPadValue=zeroPadValue}); \ No newline at end of file diff --git a/messaging/index.html b/messaging/index.html new file mode 100644 index 0000000000..cd9603c9f2 --- /dev/null +++ b/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Features

+ +
+ +
+
+ + +
+

E2E-encrypted messages with markdown and editing

+
+ +
+
+ + +
+

E2E-encrypted
images, videos and files

+
+ +
+
+ + +
+

E2E-encrypted decentralized groups — only users know they exist

+
+ +
+
+ + +
+

E2E-encrypted voice messages

+
+ +
+
+ + +
+

Disappearing messages

+
+ +
+
+ + +
+

E2E-encrypted
audio and video calls

+
+ +
+
+ + +
+

Portable encrypted app storage — move profile to another device

+
+ +
+
+ + +
+

Incognito mode —
unique to SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Out-of-band
key exchange

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2-layers of
end-to-end encryption

+
+ +

Double-ratchet protocol —
OTR messaging with perfect forward secrecy and break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message integrity
verification

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Additional layer of
server encryption

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Message mixing
to reduce correlation

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Secure authenticated
TLS transport

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Optional
access via Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Multiple layers of
content padding

+
+ +

SimpleX uses content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX explained

+ + + + + + + +
+
+ +
+
1. What users experience
+
+ +

+ You can create contacts and groups, and have two-way conversations, as in any other messenger. +

+

+ How can it work with unidirectional queues and without user profile identifiers? +

+
+
+ +
+
2. How does it work
+
+ +

+ For each connection you use two separate messaging queues to send and receive messages via different servers. +

+

+ Servers only pass messages one way, without having the full picture of user's conversations or connections. +

+
+
+ +
+
3. What servers see
+
+ +

+ The servers have separate anonymous credentials for each queue, and do not know which users they belong to. +

+

+ Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised — see here
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — see here.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

Anonymous credentials

The credential that allows proving something, e.g. the right to access some resource, without identifying the user. This credential can either be generated by a trusted party or by the user themselves and provided together with the request to create the resource. The first approach creates some centralized dependency in most cases. The second approach does not require any trust - this is used in SimpleX network to authorize access to the messaging queues.

Break-in recovery

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/nl/contact/index.html b/nl/contact/index.html index b021742c82..6260972e9b 100644 --- a/nl/contact/index.html +++ b/nl/contact/index.html @@ -21,6 +21,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -89,6 +92,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/nl/fdroid/index.html b/nl/fdroid/index.html index 9f127804cb..72640cfbd0 100644 --- a/nl/fdroid/index.html +++ b/nl/fdroid/index.html @@ -21,6 +21,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -89,6 +92,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

SimpleX uitgelegd

- - - - - - - -
-
- -
-
1. Wat gebruikers ervaren
-
- -

- U kunt contacten en groepen maken en tweerichtings gesprekken voeren, zoals in elke andere messenger. -

-

- Hoe kan het werken met unidirectionele wachtrijen en zonder gebruikers profiel-ID's? -

-
-
- -
-
2. Hoe werkt het
-
- -

- Voor elke verbinding gebruikt u twee afzonderlijke berichten wachtrijen om berichten via verschillende servers te verzenden en te ontvangen. -

-

- Servers geven berichten slechts in één richting door, zonder een volledig beeld te hebben van het gesprek of de connecties van de gebruiker. -

-
-
- -
-
3. Wat servers zien
-
- -

- De servers hebben afzonderlijke anonieme inloggegevens voor elke wachtrij en weten niet tot welke gebruikers ze behoren. -

-

- Gebruikers kunnen de privacy van metadata verder verbeteren door Tor te gebruiken om toegang te krijgen tot servers, waardoor corellatie op IP-adres wordt voorkomen. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Vergelijking met andere protocollen

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signaal, grote platformsXMPP, MatrixP2P protocollen
Vereist globale identiteitNee - privéJa 1Ja 2Ja 3
Mogelijkheid van MITMNee - veilig 4Ja 5JaJa
Afhankelijkheid van DNSNee - veerkrachtigJaJaNee
Enkelvoudig of gecentraliseerd netwerkNee - gedecentraliseerdJaNee - gefedereerd 6Ja 7
Centrale component of andere netwerkbrede aanvalNee - veerkrachtigJaJa 2Ja 8
-
- -
- -
-
-
    -
  1. Meestal op basis van een telefoonnummer, in sommige gevallen op gebruikersnamen
  2. -
  3. Op DNS gebaseerde adressen
  4. -
  5. Publieke sleutel of een andere globale unieke ID
  6. -
  7. SimpleX relais kunnen de e2e-versleuteling niet in gevaar brengen. Controleer de beveiligingscode om aanvallen op out-of-band kanalen te beperken
  8. -
  9. Als de servers van de operator zijn gecompromitteerd. Controleer de beveiligingscode in Signal en enkele andere apps om dit te beperken
  10. -
  11. Beschermt de privacy van metagegevens van gebruikers niet
  12. -
  13. Hoewel P2P gedistribueerd is, is het niet gefedereerd — het functioneert als één enkel netwerk.
  14. -
  15. P2P netwerken hebben een centrale autoriteit of het hele netwerk kan worden aangetast - kijk hier
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Word lid van SimpleX

-

Wij nodigen u uit om deel te nemen aan de conversatie

- - - -

Schrijf u in om onze updates te ontvangen

- -
- - - -
- -
- -

Verkrijg SimpleX desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/nl/invitation/index.html b/nl/invitation/index.html index fb19fe26c4..de82430ffe 100644 --- a/nl/invitation/index.html +++ b/nl/invitation/index.html @@ -21,6 +21,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -89,6 +92,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/nl/messaging/index.html b/nl/messaging/index.html new file mode 100644 index 0000000000..a6e852fb34 --- /dev/null +++ b/nl/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Waarom is SimpleX uniek

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

U heeft volledige privacy

+
+ +
+ +
+

+ SimpleX beschermt de privacy van uw profiel, contacten en metagegevens door deze te verbergen voor de netwerkservers van SimpleX en andere buitenstaanders. +

+

+ In tegenstelling tot andere bestaande berichtennetwerken worden bij SimpleX geen identificatiegegevens aan de gebruikers toegewezen – zelfs geen willekeurige getallen. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

U bent beschermd
tegen spam en misbruik

+
+ +
+ +
+

+ Omdat u geen identificatiecode of vast adres hebt op het SimpleX-netwerk, kan niemand contact met u opnemen, tenzij u een eenmalig of tijdelijk gebruikersadres deelt in de vorm van een QR-code of een link. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

U beheert uw gegevens

+
+ +
+ +
+

+ SimpleX slaat alle gebruikersgegevens op client apparaten op in een draagbaar gecodeerd databaseformaat — en kan worden overgedragen naar een ander apparaat. +

+

+ De end-to-end versleutelde berichten worden tijdelijk op SimpleX relayservers bewaard totdat ze zijn ontvangen, waarna ze permanent worden verwijderd. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

U bent eigenaar van het SimpleX netwerk

+
+ +
+ +
+

+ Het SimpleX-netwerk is volledig gedecentraliseerd en onafhankelijk van welke cryptovaluta dan ook of enig ander netwerk, met uitzondering van het internet. +

+

+ U kunt SimpleX gebruiken met uw eigen servers of met de servers die door ons worden geleverd — en toch verbinding maken met elke gebruiker. +

+ +
+ + + Kom meer te weten + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Functies

+ +
+ +
+
+ + +
+

E2E-versleutelde berichten met markdown en bewerking

+
+ +
+
+ + +
+

E2E-versleutelde
afbeeldingen,videos en bestanden

+
+ +
+
+ + +
+

E2E-gecodeerde gedecentraliseerde groepen - alleen gebruikers weten dat ze bestaan

+
+ +
+
+ + +
+

E2E-versleutelde spraakberichten

+
+ +
+
+ + +
+

Verdwijnende geheime gesprekken

+
+ +
+
+ + +
+

E2E-versleutelde
audio- en videogesprekken

+
+ +
+
+ + +
+

Draagbare gecodeerde app-opslag - profiel naar een ander apparaat verplaatsen

+
+ +
+
+ + +
+

Incognitomodus -
uniek voor SimpleX Chat

+
+ +
+
+
+ + +
+
+

Wat maakt SimpleX privé

+ +
+
+ + +
+
+ + +
+
+

Tijdelijke anonieme paarsgewijze identifiers

+
+ +

SimpleX gebruikt tijdelijke anonieme paarsgewijze adressen en inloggegevens voor elk gebruikers contact of groepslid.

+ +

Het maakt het mogelijk om berichten te bezorgen zonder gebruikers profiel-ID's, wat een betere privacy van metagegevens biedt dan alternatieven.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Out-of-band
sleuteluitwisseling

+
+ +

Veel communicatienetwerken zijn kwetsbaar voor MITM-aanvallen door servers of netwerkaanbieders.

+ +

Om te voorkomen dat SimpleX apps eenmalige sleutels out-of-band doorgeven, wanneer u een adres deelt als een link of een QR-code.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

2 lagen
end-to-end versleuteling

+
+ +

Protocol met double-ratchet -
OTR-berichten met perfecte voorwaartse geheimhouding en inbraak herstel.

+ +

NaCL-cryptobox in elke wachtrij om verkeer correlatie tussen berichten wachtrijen te voorkomen als TLS wordt aangetast.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Bericht integriteit
verificatie

+
+ +

Om de integriteit te garanderen, zijn de berichten opeenvolgend genummerd en bevatten ze de hash van het vorige bericht.

+ +

Als een bericht wordt toegevoegd, verwijderd of gewijzigd, wordt de ontvanger gewaarschuwd.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Extra laag
server versleuteling

+
+ +

Extra server versleuteling laag voor levering aan de ontvanger, om de correlatie tussen ontvangen en verzonden server verkeer te voorkomen als TLS is aangetast.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Berichten mixen
om correlatie te verminderen

+
+ +

SimpleX servers fungeren als mix nodes met lage latentie — de inkomende en uitgaande berichten hebben een andere volgorde.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Veilig geverifieerd
TLS-transport

+
+ +

Alleen TLS 1.2/1.3 met sterke algoritmen wordt gebruikt voor client-server verbindingen.

+ +

Server fingerprint en channel binding voorkomen MITM- en replay-aanvallen.

+ +

Connectie herstel is uitgeschakeld om sessie aanvallen te voorkomen.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Optionele
toegang via Tor

+
+ +

Om uw IP-adres te beschermen kunt u via Tor of een ander transport overlay netwerk toegang krijgen tot de servers.

+ +

Installeer de Orbot-app en schakel de SOCKS5-proxy in (of VPN op iOS ) om SimpleX via Tor te gebruiken.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Unidirectionele
berichtenwachtrijen

+
+ +

Elke berichten wachtrij geeft berichten in één richting door, met verschillende verzend en ontvangst adressen.

+ +

Het vermindert de aanvals mogenlijkheden, in vergelijking met traditionele berichten diensten en de beschikbare metadata.

+ +
+

Tik om te sluiten

+
+
+ +
+
+ + +
+
+

Meerdere lagen van
inhouds opvulling

+
+ +

SimpleX gebruikt content opvulling voor elke coderingslaag om aanvallen op bericht grootte te verstoren.

+ +

Het zorgt ervoor dat berichten van verschillende grootte er hetzelfde uitzien voor de servers en netwerk waarnemers.

+ +
+

Tik om te sluiten

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Netwerk

+

Simplex Chat biedt de beste privacy door de voordelen van P2P en gefedereerde netwerken te combineren.

+ +
+
+
+ + +
+
+

In tegenstelling tot P2P netwerken

+

+ Alle berichten worden verzonden via servers, die zorgen voor een betere metadata privacy en een betrouwbare asynchrone bezorging van berichten, terwijl er veel word vermeden van problemen met P2P netwerken. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

In tegenstelling tot federatieve netwerken

+

+ SimpleX relay servers slaan GEEN gebruikers profielen, contacten en afgeleverde berichten op, maken GEEN verbinding met elkaar en er is GEEN server directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX netwerk

+

+ servers bieden unidirectionele wachtrijen om de gebruikers te verbinden, maar ze hebben geen zicht op de netwerk verbindings grafiek — alleen de gebruikers. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX uitgelegd

+ + + + + + + +
+
+ +
+
1. Wat gebruikers ervaren
+
+ +

+ U kunt contacten en groepen maken en tweerichtings gesprekken voeren, zoals in elke andere messenger. +

+

+ Hoe kan het werken met unidirectionele wachtrijen en zonder gebruikers profiel-ID's? +

+
+
+ +
+
2. Hoe werkt het
+
+ +

+ Voor elke verbinding gebruikt u twee afzonderlijke berichten wachtrijen om berichten via verschillende servers te verzenden en te ontvangen. +

+

+ Servers geven berichten slechts in één richting door, zonder een volledig beeld te hebben van het gesprek of de connecties van de gebruiker. +

+
+
+ +
+
3. Wat servers zien
+
+ +

+ De servers hebben afzonderlijke anonieme inloggegevens voor elke wachtrij en weten niet tot welke gebruikers ze behoren. +

+

+ Gebruikers kunnen de privacy van metadata verder verbeteren door Tor te gebruiken om toegang te krijgen tot servers, waardoor corellatie op IP-adres wordt voorkomen. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Vergelijking met andere protocollen

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signaal, grote platformsXMPP, MatrixP2P protocollen
Vereist globale identiteitNee - privéJa 1Ja 2Ja 3
Mogelijkheid van MITMNee - veilig 4Ja 5JaJa
Afhankelijkheid van DNSNee - veerkrachtigJaJaNee
Enkelvoudig of gecentraliseerd netwerkNee - gedecentraliseerdJaNee - gefedereerd 6Ja 7
Centrale component of andere netwerkbrede aanvalNee - veerkrachtigJaJa 2Ja 8
+
+ +
+ +
+
+
    +
  1. Meestal op basis van een telefoonnummer, in sommige gevallen op gebruikersnamen
  2. +
  3. Op DNS gebaseerde adressen
  4. +
  5. Publieke sleutel of een andere globale unieke ID
  6. +
  7. SimpleX relais kunnen de e2e-versleuteling niet in gevaar brengen. Controleer de beveiligingscode om aanvallen op out-of-band kanalen te beperken
  8. +
  9. Als de servers van de operator zijn gecompromitteerd. Controleer de beveiligingscode in Signal en enkele andere apps om dit te beperken
  10. +
  11. Beschermt de privacy van metagegevens van gebruikers niet
  12. +
  13. Hoewel P2P gedistribueerd is, is het niet gefedereerd — het functioneert als één enkel netwerk.
  14. +
  15. P2P netwerken hebben een centrale autoriteit of het hele netwerk kan worden aangetast — kijk hier
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — kijk hier.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/pl/contact/index.html b/pl/contact/index.html index 1542478460..5b34f6da24 100644 --- a/pl/contact/index.html +++ b/pl/contact/index.html @@ -23,6 +23,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -91,6 +94,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/pl/fdroid/index.html b/pl/fdroid/index.html index 35e6adcf4b..ba0638bdeb 100644 --- a/pl/fdroid/index.html +++ b/pl/fdroid/index.html @@ -23,6 +23,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -91,6 +94,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

Objaśnienie SimpleX

- - - - - - - -
-
- -
-
1. Jakie są doświadczenia użytkowników
-
- -

- Możesz tworzyć kontakty i grupy oraz prowadzić dwukierunkowe rozmowy, jak w każdym innym komunikatorze. -

-

- Jak może to działać z jednokierunkowymi kolejkami i bez identyfikatorów profili użytkowników? -

-
-
- -
-
2. Jak to działa
-
- -

- Dla każdego połączenia używasz dwóch oddzielnych kolejek z wiadomościami do wysyłania i odbierania wiadomości przez różne serwery. -

-

- Serwery przekazują wiadomości tylko w jedną stronę, nie mając pełnego obrazu konwersacji ani połączeń użytkownika. -

-
-
- -
-
3. Co widzą serwery
-
- -

- Serwery mają osobne anonimowe poświadczenia dla każdej kolejki i nie wiedzą do jakich użytkowników one należą. -

-

- Użytkownicy mogą jeszcze bardziej zwiększyć prywatność metadanych, używając Tor do uzyskania dostępu do serwerów, co zapobiega korelacji na podstawie adresu IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Porównanie z innymi protokołami

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, duże platformyXMPP, MatrixProtokoły sieci P2P
Wymaga globalnej tożsamościNie - prywatneTak 1Tak 2Tak 3
Możliwość ataku MITMNie - bezpieczny 4Tak 5TakTak
Zależność od DNSNie - odpornyTakTakNie
Sieć pojedyncza lub scentralizowanaNie - zdecentralizowanyTakNie - sfederowany 6Tak 7
Centralny komponent lub inny atak w całej sieciNie - odpornyTakTak 2Tak 8
-
- -
- -
-
-
    -
  1. Zazwyczaj na podstawie numeru telefonu, w niektórych przypadkach na podstawie nazwy użytkownika
  2. -
  3. Adresy oparte na DNS
  4. -
  5. Klucz publiczny lub inny globalnie unikalny identyfikator (ID)
  6. -
  7. Przekaźniki SimpleX nie mogą skompromitować szyfrowania e2e. Zweryfikuj kody bezpieczeństwa aby złagodzić atak na kanał pozapasmowy
  8. -
  9. Jeśli bezpieczeństwo serwerów operatora zostało naruszone. Zweryfikuj kody bezpieczeństwa w Signalu lub innej aplikacji aby to złagodzić
  10. -
  11. Nie chroni prywatności metadanych użytkowników
  12. -
  13. Podczas gdy sieci P2P są rozproszone, nie są sfederowane - działają jako jedna sieć
  14. -
  15. Sieci P2P albo mają centralny organ, albo cała sieć może zostać skompromitowana - zobacz tutaj
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Dołącz do SimpleX

-

Zapraszamy do udziału w rozmowie

- - - -

Zapisz się, aby otrzymywać nasze aktualizacje

- -
- - - -
- -
- -

Pobierz SimpleX desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/pl/invitation/index.html b/pl/invitation/index.html index bd48d82033..5ae53c49d3 100644 --- a/pl/invitation/index.html +++ b/pl/invitation/index.html @@ -23,6 +23,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -91,6 +94,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/pl/messaging/index.html b/pl/messaging/index.html new file mode 100644 index 0000000000..2fce08582f --- /dev/null +++ b/pl/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Dlaczego SimpleX jest unikalny

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Masz pełną prywatność

+
+ +
+ +
+

+ SimpleX chroni prywatność Twojego profilu, kontaktów i metadanych, ukrywając je przed serwerami platformy SimpleX i wszelkimi obserwatorami. +

+

+ W przeciwieństwie do każdej innej istniejącej platformy komunikacyjnej, SimpleX nie ma żadnych identyfikatorów przypisanych do użytkowników — nawet losowych liczb. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Jesteś chroniony
przed spamem i nadużyciami

+
+ +
+ +
+

+ Ponieważ na platformie SimpleX nie masz identyfikatora ani stałego adresu, nikt nie może się z Tobą skontaktować, chyba że udostępnisz jednorazowy lub tymczasowy adres użytkownika, w postaci kodu QR lub linku. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Masz kontrolę nad swoimi danymi

+
+ +
+ +
+

+ SimpleX przechowuje wszystkie dane użytkownika na urządzeniach klienckich w formacie przenośnej zaszyfrowanej bazy danych — można je przenieść na inne urządzenie. +

+

+ Wiadomości zaszyfrowane end-to-end są przechowywane tymczasowo na serwerach przekaźnikowych SimpleX do momentu ich odebrania, po czym są trwale usuwane. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Jesteś właścicielem sieci SimpleX

+
+ +
+ +
+

+ Sieć SimpleX jest w pełni zdecentralizowana i niezależna od jakiejkolwiek krypto-waluty lub jakiejkolwiek innej platformy, poza Internetem. +

+

+ Możesz używać SimpleX z własnymi serwerami lub z serwerami dostarczonymi przez nas — i nadal łączyć się z dowolnym użytkownikiem. +

+ +
+ + + Dowiedz się więcej + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Funkcje

+ +
+ +
+
+ + +
+

Wiadomości szyfrowane przez E2E ze składnią markdown i edycją

+
+ +
+
+ + +
+

Obrazy, wideo i pliki
zaszyfrowane przez E2E

+
+ +
+
+ + +
+

Zaszyfrowane E2E zdecentralizowane grupy — tylko użytkownicy wiedzą, że te grupy istnieją

+
+ +
+
+ + +
+

Wiadomości głosowe zaszyfrowane przez E2E

+
+ +
+
+ + +
+

Znikające wiadomości

+
+ +
+
+ + +
+

Połączenia audio i wideo
szyfrowane przez E2E

+
+ +
+
+ + +
+

Przenośna zaszyfrowana pamięć aplikacji — przenieś profil na inne urządzenie

+
+ +
+
+ + +
+

Tryb incognito —
unikalny dla SimpleX Chat

+
+ +
+
+
+ + +
+
+

Co sprawia, że SimpleX jest prywatny

+ +
+
+ + +
+
+ + +
+
+

Tymczasowe anonimowe identyfikatory parami

+
+ +

SimpleX używa tymczasowych anonimowych adresów par i poświadczeń dla każdego kontaktu użytkownika lub członka grupy.

+ +

Pozwala na dostarczanie wiadomości bez identyfikatorów profilu użytkownika, zapewniając lepszą prywatność metadanych niż rozwiązania alternatywne.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Wymiana kluczy
out-of-band

+
+ +

Wiele sieci komunikacyjnych jest podatnych na ataki MITM ze strony serwerów lub dostawców sieci.

+ +

Aby temu zapobiec aplikacje SimpleX przekazują klucze jednorazowe out-of-band, gdy udostępniasz adres jako link lub kod QR.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Dwie warstwy
szyfrowania typu end-to-end

+
+ +

Protokół double-ratchet —
OTR messaging z perfect forward secrecy i break-in recovery.

+ +

NaCL cryptobox w każdej kolejce, aby zapobiec korelacji ruchu między kolejkami wiadomości, jeśli bezpieczeństwo protokołu TLS zostanie naruszone.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Weryfikacja
integralności wiadomości

+
+ +

Aby zagwarantować integralność, wiadomości są kolejno numerowane i zawierają hash poprzedniej wiadomości.

+ +

Jeśli jakaś wiadomość zostanie dodana, usunięta lub zmieniona, odbiorca zostanie o tym powiadomiony.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Dodatkowa warstwa
szyfrowania serwera

+
+ +

Dodatkowa warstwa szyfrowania serwera w celu dostarczenia do odbiorcy, aby zapobiec korelacji między odebranym i wysłanym ruchem serwera, jeśli bezpieczeństwo protokołu TLS zostanie naruszone.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Mieszanie wiadomości
w celu zmniejszenia korelacji

+
+ +

Serwery SimpleX działają jak węzły mieszania o niskim opóźnieniu — wiadomości przychodzące i wychodzące mają inną kolejność.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Bezpieczny uwierzytelniony
transport TLS

+
+ +

Do połączeń klient-serwer używany jest tylko TLS 1.2/1.3 z silnymi algorytmami.

+ +

Odcisk palca serwera i wiązanie kanałów zapobiegają atakom MITM i replay.

+ +

Wznowienie połączenia jest wyłączone, aby zapobiec atakom na sesje.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Możliwy
dostęp za pośrednictwem sieci Tor

+
+ +

Aby chronić swój adres IP, możesz uzyskać dostęp do serwerów przez Tor lub inną sieć nakładki transportowej.

+ +

Aby użyć SimpleX przez Tor zainstaluj aplikację Orbot na android i włącz proxy SOCKS5 (lub VPN na iOS).

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Jednokierunkowe
kolejki wiadomości

+
+ +

Każda kolejka z wiadomościami przekazuje wiadomości w jednym kierunku, z różnymi adresami wysyłania i odbierania.

+ +

Zmniejsza wektory ataku, w porównaniu do tradycyjnych brokerów wiadomości, oraz dostępne metadane.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+
+ + +
+
+

Wielowarstwowy
padding treści

+
+ +

SimpleX używa paddingu treści dla każdej warstwy szyfrowania, aby udaremnić ataki na rozmiar wiadomości.

+ +

Dzięki temu wiadomości o różnych rozmiarach wyglądają tak samo dla serwerów i obserwatorów sieci.

+ +
+

Stuknij, aby zamknąć

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Sieć

+

Simplex Chat zapewnia najlepszą prywatność dzięki połączeniu zalet sieci P2P i sieci federacyjnych.

+ +
+
+
+ + +
+
+

W przeciwieństwie do sieci P2P

+

+ Wszystkie wiadomości są wysyłane przez serwery, co zapewnia lepszą prywatność metadanych i niezawodne asynchroniczne dostarczanie wiadomości, przy jednoczesnym unikaniu wielu problemów sieci P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

W przeciwieństwie do sieci federacyjnych

+

+ Serwery przekaźnikowe SimpleX NIE przechowują profili użytkowników, kontaktów i dostarczonych wiadomości, NIE łączą się ze sobą i NIE ma katalogu serwerów. +

+
+
+ + + +
+
+ + +
+
+

Sieć SimpleX

+

+ serwerów zapewniają jednokierunkowe kolejki do łączenia użytkowników, ale nie mają wglądu w wykres połączeń sieciowych — robią to tylko użytkownicy. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Objaśnienie SimpleX

+ + + + + + + +
+
+ +
+
1. Jakie są doświadczenia użytkowników
+
+ +

+ Możesz tworzyć kontakty i grupy oraz prowadzić dwukierunkowe rozmowy, jak w każdym innym komunikatorze. +

+

+ Jak może to działać z jednokierunkowymi kolejkami i bez identyfikatorów profili użytkowników? +

+
+
+ +
+
2. Jak to działa
+
+ +

+ Dla każdego połączenia używasz dwóch oddzielnych kolejek z wiadomościami do wysyłania i odbierania wiadomości przez różne serwery. +

+

+ Serwery przekazują wiadomości tylko w jedną stronę, nie mając pełnego obrazu konwersacji ani połączeń użytkownika. +

+
+
+ +
+
3. Co widzą serwery
+
+ +

+ Serwery mają osobne anonimowe poświadczenia dla każdej kolejki i nie wiedzą do jakich użytkowników one należą. +

+

+ Użytkownicy mogą jeszcze bardziej zwiększyć prywatność metadanych, używając Tor do uzyskania dostępu do serwerów, co zapobiega korelacji na podstawie adresu IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Porównanie z innymi protokołami

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, duże platformyXMPP, MatrixProtokoły sieci P2P
Wymaga globalnej tożsamościNie - prywatneTak 1Tak 2Tak 3
Możliwość ataku MITMNie - bezpieczny 4Tak 5TakTak
Zależność od DNSNie - odpornyTakTakNie
Sieć pojedyncza lub scentralizowanaNie - zdecentralizowanyTakNie - sfederowany 6Tak 7
Centralny komponent lub inny atak w całej sieciNie - odpornyTakTak 2Tak 8
+
+ +
+ +
+
+
    +
  1. Zazwyczaj na podstawie numeru telefonu, w niektórych przypadkach na podstawie nazwy użytkownika
  2. +
  3. Adresy oparte na DNS
  4. +
  5. Klucz publiczny lub inny globalnie unikalny identyfikator (ID)
  6. +
  7. Przekaźniki SimpleX nie mogą skompromitować szyfrowania e2e. Zweryfikuj kody bezpieczeństwa aby złagodzić atak na kanał pozapasmowy
  8. +
  9. Jeśli bezpieczeństwo serwerów operatora zostało naruszone. Zweryfikuj kody bezpieczeństwa w Signalu lub innej aplikacji aby to złagodzić
  10. +
  11. Nie chroni prywatności metadanych użytkowników
  12. +
  13. Podczas gdy sieci P2P są rozproszone, nie są sfederowane - działają jako jedna sieć
  14. +
  15. Sieci P2P albo mają centralny organ, albo cała sieć może zostać skompromitowana — zobacz tutaj
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — zobacz tutaj.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

Break-in recovery

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/privacy/index.html b/privacy/index.html index b0a6a1f09b..219ff51595 100644 --- a/privacy/index.html +++ b/privacy/index.html @@ -35,6 +35,8 @@ + + @@ -58,10 +60,11 @@ + - + @@ -103,198 +106,195 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - - -
+

SimpleX Chat Operators Privacy Policy and Conditions of Use

Summary

Introduction and General principles cover SimpleX Chat network design, the network operators, and the principles of privacy and security provided by SimpleX network.

@@ -544,7 +527,7 @@ window.addEventListener('scroll',changeHeaderBg);
-
+ diff --git a/pt_BR/contact/index.html b/pt_BR/contact/index.html index 2e8d5691b4..d969c621b7 100644 --- a/pt_BR/contact/index.html +++ b/pt_BR/contact/index.html @@ -25,6 +25,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -93,6 +96,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/pt_BR/fdroid/index.html b/pt_BR/fdroid/index.html index 6c8c18e871..8579c1c38b 100644 --- a/pt_BR/fdroid/index.html +++ b/pt_BR/fdroid/index.html @@ -25,6 +25,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -93,6 +96,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

Explicação do SimpleX

- - - - - - - -
-
- -
-
1. O que os usuários experimentam
-
- -

- Você pode criar contatos e grupos e ter conversas bidirecionais, como em qualquer outro mensageiro. -

-

- Como ele pode funcionar com filas unidirecionais e sem identificadores de perfil de usuário? -

-
-
- -
-
2. Como funciona
-
- -

- Para cada conexão, são usadas duas filas de mensagens separadas para enviar e receber mensagens por meio de servidores diferentes. -

-

- Os servidores só passam mensagens em uma direção, sem ter a imagem completa da conversa ou conexões do usuário. -

-
-
- -
-
3. O que os servidores veem
-
- -

- Os servidores têm credenciais anônimas separadas para cada envio e não sabem a que usuários elas pertencem. -

-

- Os usuários podem melhorar ainda mais a privacidade de metadados usando o Tor para acessar os servidores, impedindo a correlação pelo endereço de IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparação com outros protocolos

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, grandes plataformasMatrix, XMPPProtocolos P2P
Requer uma identidade globalNão - privadoSim 1Sim 2Sim 3
Possibilidade de MITMNão - seguro 4Sim 5SimSim
Dependência do DNSNão - resilienteSimSimNão
Rede única ou centralizadaNão - descentralizadoSimNão - federado 6Sim 7
Componente central ou outro ataque em toda a redeNão - resilienteSimSim 2Sim 8
-
- -
- -
-
-
    -
  1. Geralmente com base em um número de telefone, em alguns casos em nomes de usuário
  2. -
  3. Endereços baseados no DNS
  4. -
  5. Chave pública ou alguma outra ID globalmente exclusiva
  6. -
  7. Os relays SimpleX não podem comprometer a criptografia e2e. Verifique o código de segurança para mitigar ataques em canais fora de banda
  8. -
  9. Se os servidores da operadora forem comprometidos. Verifique o código de segurança no Signal e outros aplicativos para mitigá-lo
  10. -
  11. Não protege a privacidade da metadados dos usuários
  12. -
  13. Embora os P2P sejam distribuídos, eles não são federados &mdash - operam como uma única rede
  14. -
  15. As redes P2P têm uma autoridade central ou toda a rede pode ser comprometida - veja aqui
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Junte-se ao SimpleX

-

Convidamos você a participar da conversa

- - - -

Inscreva-se para receber nossas atualizações

- -
- - - -
- -
- -

Obtenha o SimpleX aplicativo desktop

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/pt_BR/invitation/index.html b/pt_BR/invitation/index.html index 9a1322cd0a..1aa1a14469 100644 --- a/pt_BR/invitation/index.html +++ b/pt_BR/invitation/index.html @@ -25,6 +25,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -93,6 +96,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/pt_BR/messaging/index.html b/pt_BR/messaging/index.html new file mode 100644 index 0000000000..dfe31b4118 --- /dev/null +++ b/pt_BR/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Por que o SimpleX é único

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Você tem privacidade total

+
+ +
+ +
+

+ O SimpleX protege a privacidade do seu perfil, contatos e metadados, ocultando-os dos servidores da rede SimpleX e de quaisquer observadores. +

+

+ Diferente de qualquer outra rede de mensagens existente, o SimpleX não tem identificadores atribuídos aos usuários — nem mesmo números aleatórios. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Você está protegido
contra spam e abusos

+
+ +
+ +
+

+ Como você não tem um identificador ou endereço fixo na rede SimpleX, ninguém pode entrar em contato com você, a menos que você compartilhe um endereço de usuário único ou temporário, como um QR code ou um link. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Você controla seus dados

+
+ +
+ +
+

+ O SimpleX armazena todos os dados do usuário nos dispositivos clientes em um formato de banco de dados criptografado portátil — que pode ser transferido para outro dispositivo. +

+

+ As mensagens criptografadas de ponta-a-ponta são mantidas temporariamente nos servidores de retransmissão SimpleX até serem recebidas e, em seguida, são excluídas permanentemente. +

+ +
+ + + Saiba mais + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Sua própria rede SimpleX

+
+ +
+ +
+

+ A rede SimpleX é totalmente descentralizada e independente de qualquer criptomoeda ou de qualquer outra rede, exceto a Internet. +

+

+ Você pode usar o SimpleX com seus próprios servidores ou com os servidores fornecidos por nós — e ainda assim se conectar a qualquer usuário. +

+ +
+ + + Saiba mais + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Recursos

+ +
+ +
+
+ + +
+

Mensagens criptografadas de ponta-a-ponta com markdown e edição

+
+ +
+
+ + +
+

Criptografia de ponta-a-ponta
imagens, vídeos e arquivos

+
+ +
+
+ + +
+

Criptografia de ponta-a-ponta descentralizada de grupos — somente os usuários sabem que eles existem

+
+ +
+
+ + +
+

Mensagens de voz criptografadas de ponta-a-ponta

+
+ +
+
+ + +
+

Mensagens que desaparecem

+
+ +
+
+ + +
+

Chamadas de áudio e vídeo
criptografadas de ponta-a-ponta

+
+ +
+
+ + +
+

Armazenamento do aplicativo criptografado portátil — mova o perfil para outro dispositivo

+
+ +
+
+ + +
+

Modo anônimo —
único do SimpleX Chat

+
+ +
+
+
+ + +
+
+

O que torna o SimpleX privado

+ +
+
+ + +
+
+ + +
+
+

Identificadores temporários anônimos em pares

+
+ +

O SimpleX usa endereços anônimos temporários em pares e credenciais para cada contato de usuário ou membro de grupo.

+ +

Ele permite entregar mensagens sem identificadores de perfil, proporcionando melhor privacidade de metadados do que as alternativas.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Troca de chaves
fora da rede

+
+ +

Muitas plataformas de comunicação são vulneráveis a ataques MITM por servidores ou provedores de rede.

+ +

Para evitar isso, os aplicativos SimpleX passam chaves de uso único fora da banda, quando você compartilha um endereço como um link ou um QR code.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

2 camadas de
criptografia ponta-a-ponta

+
+ +

Protocolo de dupla catraca —
mensagens OTR com Sigilo de Encaminhamento Perfeito (Perfect Forward Secrecy) e recuperação de invasão.

+ +

Caixa de criptografia NaCL em cada envio para evitar a correlação de tráfego entre os envios de mensagens se o TLS for comprometido.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Verificação de integridade
da mensagem

+
+ +

Para garantir a integridade, as mensagens são numeradas sequencialmente e incluem o hash da mensagem anterior.

+ +

Se alguma mensagem for adicionada, removida ou alterada, o destinatário será alertado.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Camada adicional de
criptografia do servidor

+
+ +

Camada adicional de criptografia de servidor para entrega ao destinatário, para evitar a correlação entre o tráfego de servidor recebido e enviado se o TLS for comprometido.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Mistura de mensagens
para reduzir a correlação

+
+ +

Os servidores SimpleX atuam como nós de mistura de baixa latência — as mensagens de entrada e saída têm ordem diferente.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Transporte TLS
seguro e autenticado

+
+ +

Somente o TLS 1.2/1.3 com algoritmos fortes é usado para conexões cliente-servidor.

+ +

A impressão digital do servidor e a vinculação de canais evitam ataques MITM e de repetição.

+ +

A retomada da conexão é desativada para evitar ataques à sessão.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Acesso opcional
via Tor

+
+ +

Para proteger seu endereço IP, você pode acessar os servidores por meio do Tor ou de alguma outra rede de sobreposição de transporte.

+ +

Para usar o SimpleX via Tor, instale o aplicativo Orbot e ative o proxy SOCKS5 (ou VPN no iOS).

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Envios de mensagens
unidirecionais

+
+ +

Cada fila de mensagens transmite mensagens em uma direção, com diferentes endereços de envio e recebimento.

+ +

Isso reduz os vetores de ataque, em comparação com os corretores de mensagens tradicionais, e os metadados disponíveis.

+ +
+

Toque para fechar

+
+
+ +
+
+ + +
+
+

Múltiplas camadas de
preenchimento de conteúdos

+
+ +

O SimpleX usa preenchimento de conteúdo em cada camada de criptografia para impedir ataques ao tamanho da mensagem.

+ +

Isso faz com que mensagens de tamanhos diferentes tenham a mesma aparência para os servidores e observadores de rede.

+ +
+

Toque para fechar

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Rede SimpleX

+

O Simplex Chat oferece a melhor privacidade ao combinar as vantagens das redes P2P e federadas.

+ +
+
+
+ + +
+
+

Diferente das redes P2P

+

+ Todas as mensagens são enviadas por meio dos servidores, o que proporciona melhor privacidade de metadados e entrega de mensagens assíncronas confiáveis, além de evitar muitos dos problemas das redes P2P. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Diferente das redes federadas

+

+ Os servidores de retransmissão SimpleX NÃO armazenam perfis de usuário, contatos e mensagens entregues, NÃO se conectam uns aos outros e NÃO há diretório de servidores. +

+
+
+ + + +
+
+ + +
+
+

Rede SimpleX

+

+ Os servidores fornecem filas unidirecionais para conectar os usuários, mas não têm visibilidade do gráfico de conexão de rede — somente os usuários têm. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Explicação do SimpleX

+ + + + + + + +
+
+ +
+
1. O que os usuários experimentam
+
+ +

+ Você pode criar contatos e grupos e ter conversas bidirecionais, como em qualquer outro mensageiro. +

+

+ Como ele pode funcionar com filas unidirecionais e sem identificadores de perfil de usuário? +

+
+
+ +
+
2. Como funciona
+
+ +

+ Para cada conexão, são usadas duas filas de mensagens separadas para enviar e receber mensagens por meio de servidores diferentes. +

+

+ Os servidores só passam mensagens em uma direção, sem ter a imagem completa da conversa ou conexões do usuário. +

+
+
+ +
+
3. O que os servidores veem
+
+ +

+ Os servidores têm credenciais anônimas separadas para cada envio e não sabem a que usuários elas pertencem. +

+

+ Os usuários podem melhorar ainda mais a privacidade de metadados usando o Tor para acessar os servidores, impedindo a correlação pelo endereço de IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparação com outros protocolos

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, grandes plataformasMatrix, XMPPProtocolos P2P
Requer uma identidade globalNão - privadoSim 1Sim 2Sim 3
Possibilidade de MITMNão - seguro 4Sim 5SimSim
Dependência do DNSNão - resilienteSimSimNão
Rede única ou centralizadaNão - descentralizadoSimNão - federado 6Sim 7
Componente central ou outro ataque em toda a redeNão - resilienteSimSim 2Sim 8
+
+ +
+ +
+
+
    +
  1. Geralmente com base em um número de telefone, em alguns casos em nomes de usuário
  2. +
  3. Endereços baseados no DNS
  4. +
  5. Chave pública ou alguma outra ID globalmente exclusiva
  6. +
  7. Os relays SimpleX não podem comprometer a criptografia e2e. Verifique o código de segurança para mitigar ataques em canais fora de banda
  8. +
  9. Se os servidores da operadora forem comprometidos. Verifique o código de segurança no Signal e outros aplicativos para mitigá-lo
  10. +
  11. Não protege a privacidade da metadados dos usuários
  12. +
  13. Embora os P2P sejam distribuídos, eles não são federados &mdash - operam como uma única rede
  14. +
  15. As redes P2P têm uma autoridade central ou toda a rede pode ser comprometida — veja aqui
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — veja aqui.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/ro/contact/index.html b/ro/contact/index.html index 822bab735c..505accce2c 100644 --- a/ro/contact/index.html +++ b/ro/contact/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ro/fdroid/index.html b/ro/fdroid/index.html index 435d1ff34b..62da4d7a46 100644 --- a/ro/fdroid/index.html +++ b/ro/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX, explicat

- - - - - - - -
-
- -
-
1. Ce experimentează utilizatorii
-
- -

- Poți crea contacte și grupuri, și poți avea conversații bidirecționale, ca în oricare altă aplicație de mesagerie. -

-

- Cum poate funcționa cu liste de așteptare unidirecționale și fără identificatori de profil ai utilizatorului? -

-
-
- -
-
2. Cum funcționează
-
- -

- Pentru fiecare conexiune, folosești două cozi de mesaje separate pentru a trimite și a primi mesaje prin servere diferite. -

-

- Serverele doar transmit mesaje într-un singur sens, fără a deține imaginea de ansamblu a conversațiilor sau a conexiunilor utilizatorului. -

-
-
- -
-
3. Ce văd serverele
-
- -

- Serverele au credențiale anonime separate pentru fiecare coadă și nu știu cui aparțin acestea. -

-

- Utilizatorii pot îmbunătăți și mai mult confidențialitatea metadatelor folosind Tor pentru a accesa serverele, prevenind astfel corelarea prin adresa IP. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Comparison with other protocols

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or Centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
-
- -
- -
-
-
    -
  1. Usually based on a phone number, in some cases on usernames
  2. -
  3. DNS-based addresses
  4. -
  5. Public key or some other globally unique ID
  6. -
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. -
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. -
  11. Does not protect users' metadata privacy
  12. -
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. -
  15. P2P networks either have a central authority or the whole network can be compromised - see here
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Join SimpleX

-

We invite you to join the conversation

- - - -

Sign up to receive our updates

- -
- - - -
- -
- -

Get SimpleX desktop app

-
- - - - - -
-
-
-

Blockchain

In a wide sense, blockchain means a sequence of blocks of data, where each block contains a cryptographic hash of the previous block, thus providing integrity to the whole chain. Blockchains are used in many communication and information storage systems to provide integrity and immutability of the data. For example, BluRay disks use blockchain. SimpleX messaging queues also use blockchain - each message includes the hash of the previous message, to ensure the integrity – if any message is modified it will be detected by the recipient when the next message is received. Blockchains are a subset of Merkle directed acyclic graphs.

Break-in recovery

Also known as break-in recovery, it is the quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/ro/invitation/index.html b/ro/invitation/index.html index be2c130470..ccd22a1e55 100644 --- a/ro/invitation/index.html +++ b/ro/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ro/messaging/index.html b/ro/messaging/index.html new file mode 100644 index 0000000000..0e1aadcc25 --- /dev/null +++ b/ro/messaging/index.html @@ -0,0 +1,1927 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Why SimpleX is unique

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

You have complete privacy

+
+ +
+ +
+

+ SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers. +

+

+ Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

You are protected
from spam and abuse

+
+ +
+ +
+

+ Because you have no identifier or fixed address on the SimpleX network, nobody can contact you unless you share a one-time or temporary user address, as a QR code or a link. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

You control your data

+
+ +
+ +
+

+ SimpleX stores all user data on client devices in a portable encrypted database format — it can be transferred to another device. +

+

+ The end-to-end encrypted messages are held temporarily on SimpleX relay servers until received, then they are permanently deleted. +

+ +
+ + + Learn more + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

You own SimpleX network

+
+ +
+ +
+

+ The SimpleX network is fully decentralised and independent of any crypto-currency or any other network, other than the Internet. +

+

+ You can use SimpleX with your own servers or with the servers provided by us — and still connect to any user. +

+ +
+ + + Learn more + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

­Funcționalități

+ +
+ +
+
+ + +
+

Mesaje criptate E2E, cu formatare Markdown și editare

+
+ +
+
+ + +
+

Imagini, videoclipuri și fișiere
criptate E2E

+
+ +
+
+ + +
+

Grupuri descentralizate criptate E2E — doar utilizatorii știu că există

+
+ +
+
+ + +
+

Mesaje vocale criptate E2E

+
+ +
+
+ + +
+

Mesaje care dispar

+
+ +
+
+ + +
+

Apeluri audio și video
criptate E2E

+
+ +
+
+ + +
+

Stocare portabilă criptată a aplicației — mută profilul pe alt dispozitiv

+
+ +
+
+ + +
+

Mod incognito —
unic în SimpleX Chat

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

Temporary anonymous pairwise identifiers

+
+ +

SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.

+ +

It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Schimb de chei
în afara benzii

+
+ +

Many communication networks are vulnerable to MITM attacks by servers or network providers.

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

2 straturi de
criptare end-to-end

+
+ +

Double-ratchet protocol —
OTR messaging with perfect forward secrecy and break-in recovery.

+ +

NaCL cryptobox in each queue to prevent traffic correlation between message queues if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Verificarea integrității
mesajului

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Strat adițional de
criptare pe server

+
+ +

Additional layer of server encryption for delivery to the recipient, to prevent the correlation between received and sent server traffic if TLS is compromised.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Amestecare mesaje
pentru a reduce corelația

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Transport TLS
securizat și autentificat

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

Connection resumption is disabled to prevent session attacks.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Acces opțional
prin Tor

+
+ +

To protect your IP address you can access the servers via Tor or some other transport overlay network.

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Unidirectional
message queues

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

It reduces the attack vectors, compared with traditional message brokers, and available meta-data.

+ +
+

Tap to close

+
+
+ +
+
+ + +
+
+

Straturi multiple de
padding al conținutului

+
+ +

SimpleX uses content padding for each encryption layer to frustrate message size attacks.

+ +

It makes messages of different sizes look the same to the servers and network observers.

+ +
+

Tap to close

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat provides the best privacy by combining the advantages of P2P and federated networks.

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ All messages are sent via the servers, both providing better metadata privacy and reliable asynchronous message delivery, while avoiding many problems of P2P networks. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Unlike federated networks

+

+ SimpleX relay servers do NOT store user profiles, contacts and delivered messages, do NOT connect to each other, and there is NO servers directory. +

+
+
+ + + +
+
+ + +
+
+

SimpleX network

+

+ servers provide unidirectional queues to connect the users, but they have no visibility of the network connection graph — only the users do. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX, explicat

+ + + + + + + +
+
+ +
+
1. Ce experimentează utilizatorii
+
+ +

+ Poți crea contacte și grupuri, și poți avea conversații bidirecționale, ca în oricare altă aplicație de mesagerie. +

+

+ Cum poate funcționa cu liste de așteptare unidirecționale și fără identificatori de profil ai utilizatorului? +

+
+
+ +
+
2. Cum funcționează
+
+ +

+ Pentru fiecare conexiune, folosești două cozi de mesaje separate pentru a trimite și a primi mesaje prin servere diferite. +

+

+ Serverele doar transmit mesaje într-un singur sens, fără a deține imaginea de ansamblu a conversațiilor sau a conexiunilor utilizatorului. +

+
+
+ +
+
3. Ce văd serverele
+
+ +

+ Serverele au credențiale anonime separate pentru fiecare coadă și nu știu cui aparțin acestea. +

+

+ Utilizatorii pot îmbunătăți și mai mult confidențialitatea metadatelor folosind Tor pentru a accesa serverele, prevenind astfel corelarea prin adresa IP. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Comparison with other protocols

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, big platformsXMPP, MatrixP2P protocols
Requires global identityNo - privateYes 1Yes 2Yes 3
Possibility of MITMNo - secure 4Yes 5YesYes
Dependence on DNSNo - resilientYesYesNo
Single or centralized networkNo - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. Usually based on a phone number, in some cases on usernames
  2. +
  3. DNS-based addresses
  4. +
  5. Public key or some other globally unique ID
  6. +
  7. SimpleX relays cannot compromise e2e encryption. Verify security code to mitigate attack on out-of-band channel
  8. +
  9. If operator's servers are compromised. Verify security code in Signal and some other apps to mitigate it
  10. +
  11. Does not protect users' metadata privacy
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. P2P networks either have a central authority or the whole network can be compromised — see here
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — see here.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

Break-in recovery

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Centralized network

Centralized networks are provided or controlled by a single entity. The examples are Threema, Signal, WhatsApp and Telegram. The advantage of that design is that the provider can innovate faster, and has a centralized approach to security. But the disadvantage is that the provider can change or discontinue the service, and leak, sell or disclose in some other way all users' data, including who they are connected with.

Content padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Overlay network

Nodes in the overlay network can be thought of as being connected by virtual or logical links, each of which corresponds to a path, perhaps through many physical links, in the underlying network. Tor, for example, is an overlay network on top of IP network, which in its turn is also an overlay network over some underlying physical network.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/ru/contact/index.html b/ru/contact/index.html index 62bfa22de4..c2e77c897c 100644 --- a/ru/contact/index.html +++ b/ru/contact/index.html @@ -33,6 +33,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -101,6 +104,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ru/fdroid/index.html b/ru/fdroid/index.html index c6db2bc00c..fe014af11a 100644 --- a/ru/fdroid/index.html +++ b/ru/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -101,6 +104,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

Как SimpleX работает

- - - - - - - -
-
- -
-
1. Что видят пользователи
-
- -

- Вы можете создавать контакты и группы, а также вести двусторонние беседы, как и в любом другом мессенджере. -

-

- Как это может работать с однонаправленными очередями и без идентификаторов профиля пользователя? -

-
-
- -
-
2. Как это работает
-
- -

- Для каждого контакта Вы используете две отдельные очереди сообщений, отправляя и получая сообщения через разные серверы. -

-

- Серверы передают сообщения только в одну сторону, не имея полной информации о разговорах и контактах пользователя. -

-
-
- -
-
3. Что видят серверы
-
- -

- Серверы имеют отдельные, анонимные учётные данные для каждой очереди и не знают, каким пользователям они принадлежат. -

-

- Пользователи могут повысить свою конфиденциальность используя сеть Tor для доступа к серверам. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Жить
Свободно

+

Свобода и Безопасность
Ваших Коммуникаций

+

Первая сеть, в которой Вам принадлежат Ваши данные, контакты и группы.

- -
-
-

Сравнение с другими протоколами

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, большие платформыXMPP, MatrixПротоколы P2P
Требуется глобальный идентификаторНет - конфиденциальныйДа 1Да 2Да 3
Возможность MITMНет - безопасный 4Да 5ДаДа
Зависимость от DNSНет - устойчивДаДаНет
Единая или Централизованная сетьНет - децентрализованныйДаНет - федеративные 6Да 7
Центральный компонент или атака на всю сетьНет - устойчивДаДа 2Да 8
-
- -
- -
-
-
    -
  1. Обычно требуется номера телефона, в некоторых случаях — имя пользователя
  2. -
  3. Адреса на основе DNS
  4. -
  5. Публичный ключ или какой-либо другой глобально уникальный идентификатор
  6. -
  7. Сервера SimpleX не могут скомпрометировать сквозное шифрование
  8. -
  9. Если операторы серверов скомпрометированы. В Signal, и некоторых других приложениях, есть возможность подтвердить код безопасности
  10. -
  11. Не защищает конфиденциальность пользовательских метаданных
  12. -
  13. Хотя P2P распределены, они не являются федеративными, то есть P2P — работают как единая сеть
  14. -
  15. Сети P2P либо имеют центральный компонент, либо вся сеть может быть атакована - подробнее здесь
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Аудиты
безопасности +

+
+ +
-
-
-
+
+
+
+
+
+
+

Самый Безопасный Мессенджер в Мире

+

Сообщения в SimpleX имеют самое передовое сквозное шифрование (end-to-end).

+

Для Вашей безопасности, серверы не могут видеть ваши сообщения и с кем Вы разговариваете.

+ Узнать больше про сообщения в SimpleX +
+
+
+
+
+
+

Ваш Интернет Будущего

+

SimpleX основан на идее что Ваши данные, контакты и группы должны принадлежать Вам.

+

Открытая децентрализованная сеть позволяет Вам соединяться с другими людьми и общаться свободно и безопасно.

+
+
+
+
+
+
+

Стабильные Сообщества

+

Вы сможете поддерживать Ваши любимые группы с помощью будущих Ваучеров Групп.

+

Ваучеры будут использоваться для оплаты за серверы, чтобы группы оставались свободными и независимыми.

+ Узнайте больше и возьмите бесплатный NFT, чтобы участвовать в тестировании. +
+
+
-
-
-

Присоединяйтесь к SimpleX

-

Мы приглашаем Вас присоединиться к разговору

- - - -

Подпишитесь на нашу рассылку новостей

- -
- - - -
- -
- -

Скачать SimpleX для компьютера

-
- - - - - -
-
-
- - +
+
+
+

Путь Сети SimpleX к Свободному Интернету

+
+

2025

+

: Большие каналы и группы

+

Чтобы Вы могли покинуть централизованные платформы

+
+
+

2026

+

: Самодостаточные группы и серверы

+

Запуск Ваучеров Групп

+
+
+

2027

+

: Поддержка роста Ваших групп

+

Инструменты для продвижения групп

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Вступайте в Группы SimpleX

+

Сотни тысяч людей уже доверяют мессенджеру SimpleX.

+

Найдите группы по душе в каталоге SimpleX и создайте свои!

+ Открыть каталог SimpleX +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/ru/invitation/index.html b/ru/invitation/index.html index 8c805434fa..22b0efaeeb 100644 --- a/ru/invitation/index.html +++ b/ru/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -101,6 +104,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/ru/messaging/index.html b/ru/messaging/index.html new file mode 100644 index 0000000000..ad2eadb720 --- /dev/null +++ b/ru/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Почему SimpleX уникален

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

У Вас есть полная
конфиденциальность

+
+ +
+ +
+

+ SimpleX защищает конфиденциальность Вашего профиля, контактов и метаданных, скрывая их от серверов сети SimpleX и любых наблюдателей. +

+

+ В отличие от любой другой существующей сети обмена сообщениями, SimpleX не имеет идентификаторов пользователей — нет даже случайных цифр. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Вы защищены от
спама и злоупотреблений

+
+ +
+ +
+

+ Поскольку у Вас нет идентификатора или фиксированного адреса в сети SimpleX, никто не сможет связаться с Вами без Вашего явного согласия mdash; это возможно, только если Вы сами поделитесь адресом в виде QR-кода или ссылки. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Только Вы контролируете
Ваши данные

+
+ +
+ +
+

+ SimpleX хранит все пользовательские данные на клиентских устройствах в портативном формате зашифрованной базы данных — их можно перенести на другое устройство. +

+

+ Сквозные зашифрованные сообщения временно хранятся на серверах SimpleX до получения, после чего они удаляются безвозвратно. +

+ +
+ + + Узнать больше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Вы владеете
сетью SimpleX

+
+ +
+ +
+

+ Сеть SimpleX полностью децентрализована и независима от любой криптовалюты/блокчейна или любой другой сети, кроме Интернета. +

+

+ Вы можете использовать SimpleX со своими собственными серверами или с серверами, предоставленными нами — и при этом подключаться к любому пользователю SimpleX. +

+ +
+ + + Узнать больше + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Функции

+ +
+ +
+
+ + +
+

Сообщения с E2E-шифрованием
с форматированием и редактированием

+
+ +
+
+ + +
+

Изображения, видео и файлы
с E2E-шифрованием

+
+ +
+
+ + +
+

Децентрализованные группы — известные только участникам

+
+ +
+
+ + +
+

Голосовые сообщения с E2E-шифрованием

+
+ +
+
+ + +
+

Исчезающие сообщения

+
+ +
+
+ + +
+

Аудио и видео звонки с E2E-шифрованием

+
+ +
+
+ + +
+

Зашифрованное база данных — Вы можете перенести профиль на другое устройство

+
+ +
+
+ + +
+

Режим инкогнито —
уникальный для SimpleX Chat

+
+ +
+
+
+ + +
+
+

Что делает SimpleX конфиденциальным

+ +
+
+ + +
+
+ + +
+
+

Временные анонимные парные идентификаторы

+
+ +

SimpleX использует временные анонимные парные адреса и учетные данные для каждого контакта пользователя или члена группы.

+ +

Это позволяет доставлять сообщения без идентификаторов профиля пользователя, и обеспечивает лучшую конфиденциальность метаданных, чем альтернативы.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Обмен ключами
вне протокола

+
+ +

Многие коммуникационные сети уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.

+ +

Чтобы предотвратить это, приложения SimpleX передают одноразовые ключи вне протокола, когда Вы делитесь адресом в виде ссылки или QR-кода.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

2-уровневое
сквозное шифрование

+
+ +

Протокол двойного обновления ключей —
"отрицаемые" сообщения с идеальной прямой секретностью и восстановлением после взлома.

+ +

NaCL cryptobox в каждой очереди для предотвращения корреляции трафика между очередями сообщений, в случае компрометированного TLS.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Проверка неизменности
сообщений

+
+ +

Для обеспечения неизменности, сообщения нумеруются по порядку и содержат хеш предыдущего сообщения.

+ +

Если какое-либо сообщение будет добавлено, удалено или изменено, получатель будет предупрежден об этом.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Дополнительный уровень
шифрования с сервером

+
+ +

Дополнительный уровень шифрования между сервером и получателем для предотвращения корреляции полученного и отправленного трафика сервера, в случае компрометированного TLS.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Смешивание сообщений
для уменьшения корреляции

+
+ +

Серверы SimpleX действуют как узлы-миксеры с низкой задержкой — входящие и исходящие сообщения имеют разный порядок.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Безопасное аутентифицированное
соединение TLS

+
+ +

Для соединений клиента и сервера используется только протокол TLS 1.2/1.3 с безопасными алгоритмами.

+ +

Идентификатор сервера и привязка к TLS сессии предотвращают атаки перехвата (MITM) и повторного использования.

+ +

Возобновление соединения отключено для предотвращения сеансовых атак.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Возможен доступ
через сеть Tor

+
+ +

Чтобы защитить свой IP-адрес Вы можете подключаться к серверам через сеть Tor или какую-либо другую транспортную оверлейную сеть.

+ +

Чтобы использовать SimpleX через сеть Tor, пожалуйста, установите приложение Orbot и включите прокси (или режим VPN на iOS).

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Однонаправленные
очереди сообщений

+
+ +

Каждая очередь сообщений передает сообщения в одном направлении с разными адресами отправки и получения.

+ +

Это уменьшает векторы атак и доступные метаданные, по сравнению с традиционными серверами доставки сообщений.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+
+ + +
+
+

Многоуровневое
дополнение сообщений

+
+ +

SimpleX использует дополнение содержания для каждого уровня шифрования, чтобы скрыть размер сообщений.

+ +

Это делает сообщениям разного размера одинаковыми для серверов и сети.

+ +
+

Нажмите, чтобы закрыть

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

Сеть SimpleX

+

SimpleX Chat обеспечивает наилучшую конфиденциальность, сочетая преимущества P2P и федеративных сетей.

+ +
+
+
+ + +
+
+

В отличие от P2P-сетей

+

+ Все сообщения отправляются через серверы, что обеспечивает лучшую конфиденциальность метаданных и надежную асинхронную доставку сообщений, избегая при этом многих проблем P2P сетей. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

В отличие от федеративных сетей

+

+ Серверные узлы SimpleX НЕ хранят профили пользователей, контакты и доставленные сообщения, НЕ подключаются друг к другу, и НЕ имеют каталога серверов. +

+
+
+ + + +
+
+ + +
+
+

Сеть SimpleX

+

+ серверы предоставляют однонаправленные очереди для подключения пользователей, но у них нет видимости графика сетевых подключений — это делают только пользователи. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Как SimpleX работает

+ + + + + + + +
+
+ +
+
1. Что видят пользователи
+
+ +

+ Вы можете создавать контакты и группы, а также вести двусторонние беседы, как и в любом другом мессенджере. +

+

+ Как это может работать с однонаправленными очередями и без идентификаторов профиля пользователя? +

+
+
+ +
+
2. Как это работает
+
+ +

+ Для каждого контакта Вы используете две отдельные очереди сообщений, отправляя и получая сообщения через разные серверы. +

+

+ Серверы передают сообщения только в одну сторону, не имея полной информации о разговорах и контактах пользователя. +

+
+
+ +
+
3. Что видят серверы
+
+ +

+ Серверы имеют отдельные, анонимные учётные данные для каждой очереди и не знают, каким пользователям они принадлежат. +

+

+ Пользователи могут повысить свою конфиденциальность используя сеть Tor для доступа к серверам. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Сравнение с другими протоколами

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, большие платформыXMPP, MatrixПротоколы P2P
Требуется глобальный идентификаторНет - конфиденциальныйДа 1Да 2Да 3
Возможность MITMНет - безопасный 4Да 5ДаДа
Зависимость от DNSНет - устойчивДаДаНет
Единая или Централизованная сетьНет - децентрализованныйДаНет - федеративные 6Да 7
Центральный компонент или атака на всю сетьНет - устойчивДаДа 2Да 8
+
+ +
+ +
+
+
    +
  1. Обычно требуется номера телефона, в некоторых случаях — имя пользователя
  2. +
  3. Адреса на основе DNS
  4. +
  5. Публичный ключ или какой-либо другой глобально уникальный идентификатор
  6. +
  7. Сервера SimpleX не могут скомпрометировать сквозное шифрование
  8. +
  9. Если операторы серверов скомпрометированы. В Signal, и некоторых других приложениях, есть возможность подтвердить код безопасности
  10. +
  11. Не защищает конфиденциальность пользовательских метаданных
  12. +
  13. Хотя P2P распределены, они не являются федеративными, то есть P2P — работают как единая сеть
  14. +
  15. Сети P2P либо имеют центральный компонент, либо вся сеть может быть атакована — подробнее здесь
  16. +
+
+
+
+
+ +
+
+

Сравнение безопасности сквозного шифрования в мессенджерах

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Дополнение сообщений✔︎1✔︎✔︎1✔︎
Отрицаемые сообщения✔︎2✔︎3✔︎
Прямая секретность✔︎✔︎✔︎✔︎✔︎
Безопасность после взлома✔︎4✔︎
2-факторный обмен ключами✔︎✔︎5✔︎5✔︎✔︎5✔︎
Гибридное постквантовое шифрование✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar дополняет сообщения до размера кратного 1024 байтов, Signal - до кратного 160 байтов.
  2. +
  3. Отрицаемость сообщений не включает в себя соединеие между клиентом и сервером.
  4. +
  5. По всей видимости, использование криптографической подписи исключает отражаемость, но это требует уточнения.
  6. +
  7. Реализация поддержки нескольких устройств подрывает безопасность после взлома алгоритма Double Ratchet. — подробнее здесь.
  8. +
  9. 2-факторный обмен ключами опциональный, через верификацию кода безопасности.
  10. +
  11. Пост-квантовое согласование ключей происходит не всегда, защищая только часть согласований.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

+ + + + + + + + + diff --git a/security/index.html b/security/index.html index fe3ee01be2..94d1488ad2 100644 --- a/security/index.html +++ b/security/index.html @@ -36,6 +36,8 @@ + + @@ -53,12 +55,12 @@ + - -
- + + @@ -99,188 +101,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - -
- -
+
-
+ diff --git a/token/index.html b/token/index.html new file mode 100644 index 0000000000..a20dc54e1d --- /dev/null +++ b/token/index.html @@ -0,0 +1,1326 @@ + + + + + + + + Community Vouchers: Your Freedom and Security + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+

SimpleX Community Vouchers

+

We're developing Community Vouchers as a way to enable secure payments to server operators, to make communities sustainable.

+

Group or channel owners can select network operators for better reliability and censorship resistance than with traditional online publishing methods.

+

These vouchers are blockchain utility tokens — to focus purely on server capacity usage, like prepaid telephone cards.

+

SMPX: Community Voucher Token planned for 2026

+

+

SMPX token is v1 of Community Vouchers. We are aiming to launch it in 2026.

+

Mint a free SimpleX NFT on Ethereum network (mainnet) for SMPX testnet access and feedback. The NFT is limited to 1 per wallet, non-transferable.

+

Preliminary token overview

+
    +
  • full name: SimpleX Community Voucher.
  • +
  • symbol: SMPX.
  • +
  • network: TBC. There are several viable L2 candidates: Arbitrum One, Optimism, Polygon, etc.
  • +
  • standard: ERC20, with contract-enforced supply and other limits (TBD based on modeling and testing).
  • +
+

Potential utilities

+
    +
  • Server messaging and file capacity beyond free tier (see FAQ) for large channels and communities.
  • +
  • Names in SimpleX Name System.
  • +
+

We're working with blockchain and legal experts for feasibility and compliance, aiming to launch testnet in 2026. Details may change based on input. More in our upcoming whitepaper draft.

+

To receive updates, sign up via email or connect to us via SimpleX Chat.

+

Community Vouchers FAQ

+

These are early insights into how Community Vouchers can work.

+

Why Community Vouchers?

+ + +

To cover server bills securely and privately.

+

With "free" centralized platforms:

+
    +
  • you lose security and privacy, because your data is used for advertising and sold.
  • +
  • they de-platform inconvenient users, often based on frivolous complaints.
  • +
  • you don't own all rights to your content.
  • +
+

Paying for server capacity is cheaper than "free" platforms. Our estimate based on the current costs is $5-10/month for 5,000 message receivers (could be up to 50,000 members) with 5-10 GB of files/media archive. These estimates are preliminary and may change.

+

Free Tier?

+

Considering up to 1,000 message receivers and 500 MB storage for free groups.

+

Why Not Existing Crypto?

+

For privacy without heavy compliance; limits emphasize utility over speculation.

+

How Might Vouchers Work?

+

Buy via app (like phone top-ups), with automatic management.

+

V1 would use hashed IDs for privacy and on-chain payments. Zero-knowledge proofs and in-app payments to be added later.

+

Disclaimer

+

This design is evolving — share your feedback!

+

This is not an investment offer. All details are subject to legal review.

+
+
+ + + + + + + + + + + + diff --git a/tr/contact/index.html b/tr/contact/index.html index 71b6b75ee0..bad317d814 100644 --- a/tr/contact/index.html +++ b/tr/contact/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/tr/fdroid/index.html b/tr/fdroid/index.html index dda1ff20b6..7a9cd9aa9e 100644 --- a/tr/fdroid/index.html +++ b/tr/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX açıklıyor

- - - - - - - -
-
- -
-
1. Kullanıcıların nasıl deneyimlediği
-
- -

- Kişiler ve gruplar oluşturabilir ve tıpkı diğer mesajlaşma programlarında olduğu gibi iki yönlü iletişim kurabilirsiniz. -

-

- Tek yönlü kuyruklarla ve kullanıcı profil tanımlayıcıları olmadan nasıl çalışabilir? -

-
-
- -
-
2. Nasıl çalışır
-
- -

- Her bağlantı için, farklı sunucular üzerinden mesaj göndermek ve almak üzere iki ayrı mesaj kuyruğu kullanırsınız. -

-

- Sunucular, kullanıcı konuşmalarının veya bağlantılarının tüm geçmişini bilmeden mesajları yalnızca tek bir yönde iletir. -

-
-
- -
-
3. Sunucuların ne gördüğü
-
- -

- Sunucular her kuyruk için ayrı, anonim oturum açma bilgileri kullanır ve hangi kullanıcıya ait olduğunu bilmez. -

-

- Tor erişim sunucuları kullanarak kullanıcılar, meta veri gizliliğini artırabilir ve IP adresi korelasyonunu önleyebilir. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Diğer protokollerle karşılaştırma

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, büyük platformlarXMPP / MatrixP2P protokolleri
Küresel bir kimlik gerektirirHayır – gizliEvet 1Evet 2Evet 3
MITM saldırısı riskiHayır – güvenli 4Evet 5EvetEvet
DNS sistemine bağımlılıkHayır – dayanıklıEvetEvetHayır
Tek veya merkezi ağHayır – merkeziyetsizEvetHayır – federasyonlu 6Evet 7
Merkezi bileşen veya diğer ağ genelinde saldırılarHayır – dayanıklıEvetEvet 2Evet 8
-
- -
- -
-
-
    -
  1. Genellikle telefon numarasına, bazen kullanıcı adına dayalı
  2. -
  3. DNS tabanlı adresler
  4. -
  5. Genel anahtar veya başka bir küresel benzersiz kimlik
  6. -
  7. SimpleX aktarıcıları uçtan uca şifrelemeyi tehlikeye atamaz. Olası bir ağ dışı kanal saldırısını önlemek için güvenlik kodunu doğrulayın
  8. -
  9. Operatörün sunucuları ele geçirilirse. Signal ve diğer uygulamalarda bunu azaltmak için güvenlik kodu doğrulanabilir
  10. -
  11. Kullanıcı meta verilerinin gizliliği korunmaz
  12. -
  13. P2P dağıtık olsa da federasyonlu değildir — tek bir ağ olarak çalışır
  14. -
  15. P2P ağlarının ya merkezi bir yönetimi vardır ya da tüm ağ tehlikeye girebilir - Buraya bakın
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Katılın SimpleX

-

Sizi sohbete katılmaya davet ediyoruz

- - - -

Güncellemelerimizi almak için kaydolun

- -
- - - -
- -
- -

SimpleX' masaüstü uygulamasını indirin

-
- - - - - -
-
-
-

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/tr/invitation/index.html b/tr/invitation/index.html index 37bad00099..233263b479 100644 --- a/tr/invitation/index.html +++ b/tr/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/tr/messaging/index.html b/tr/messaging/index.html new file mode 100644 index 0000000000..0763689f00 --- /dev/null +++ b/tr/messaging/index.html @@ -0,0 +1,1927 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

SimpleX neden benzersiz

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Tam gizlilik elde edersiniz

+
+ +
+ +
+

+ SimpleX, profilinizin, kişilerin ve meta verilerinizin gizliliğini korur ve bunları SimpleX ağ sunucularından ve diğer olası gözlemcilerden gizler. +

+

+ Mevcut tüm diğer mesajlaşma ağlarının aksine, SimpleX kullanıcılarına hiçbir kimlik atamaz — rastgele sayılar bile yoktur. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Spam ve kötüye kullanıma
karşı koruma

+
+ +
+ +
+

+ SimpleX ağında kimliğiniz veya sabit bir adresiniz olmadığı için, kimse size ulaşamaz; yalnızca tek kullanımlık veya geçici bir kullanıcı adresini QR kodu veya bağlantı olarak paylaşırsanız iletişim kurabilir. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Verilerinizin kontrolü sizde

+
+ +
+ +
+

+ SimpleX, kullanıcı verilerini yalnızca uç cihazlarda ve taşınabilir, şifreli bir veritabanı formatında saklar — bu, başka bir cihaza aktarılabilir. +

+

+ Uçtan uca şifreli mesajlar, son cihaza ulaşana kadar SimpleX aktarma sunucularında geçici olarak saklanır ve ardından kalıcı olarak silinir. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

SimpleX ağının sahibi sizsiniz

+
+ +
+ +
+

+ SimpleX ağı tamamen merkeziyetsizdir ve kripto para birimleri veya internet dışında başka ağlara bağlı değildir. +

+

+ Kendi sunucularınızla SimpleX'i kullanabilirsiniz veya bizim sunduğumuz sunucuları kullanabilirsiniz — yine de tüm kullanıcılarla bağlantı kurabilirsiniz. +

+ +
+ + + Daha fazlasını öğrenin + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Özellikler

+ +
+ +
+
+ + +
+

Uçtan uca şifreli mesajlar, markdown ve düzenleme desteğiyle

+
+ +
+
+ + +
+

Uçtan uca şifreli
resimler, videolar ve dosyalar

+
+ +
+
+ + +
+

Uçtan uca şifreli merkeziyetsiz gruplar — Sadece kullanıcılar bu grupların varlığını bilir

+
+ +
+
+ + +
+

Uçtan uca şifreli sesli mesajlar

+
+ +
+
+ + +
+

Kaybolan gizli sohbetler

+
+ +
+
+ + +
+

Uçtan uca şifreli
sesli ve görüntülü aramalar

+
+ +
+
+ + +
+

Taşınabilir ve şifreli uygulama veri depolama — tüm profilinizi başka bir cihaza kolayca taşıyın

+
+ +
+
+ + +
+

Gizli mod —
SimpleX Chat'te benzersiz

+
+ +
+
+
+ + +
+
+

SimpleX'i gizli yapan nedir

+ +
+
+ + +
+
+ + +
+
+

Geçici, anonim çift yönlü kimlikler

+
+ +

SimpleX, her kullanıcı bağlantısı veya grup üyesi için kendi geçici, anonim ve çift yönlü adreslerini ve kimlik bilgilerini kullanır.

+ +

SimpleX, kullanıcı profili tanımlayıcıları olmadan mesaj göndermeye olanak tanır ve diğer alternatiflere göre daha iyi meta veri gizliliği sunar.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Ağ Dışı
Anahtar Değişimi

+
+ +

Birçok iletişim ağı, sunucu veya ağ sağlayıcıları tarafından yapılan MITM saldırılarına karşı savunmasızdır.

+ +

Bunu önlemek için, SimpleX bağlantı adresini link veya QR kodu olarak paylaştığınızda tek kullanımlık anahtarları ağ dışı yollarla iletir.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

İki Katmanlı
Uçtan Uca Şifreleme

+
+ +

Double-Ratchet protokolü —
Perfect Forward Secrecy, inkar edilebilirlik ve ihlal sonrası kurtarma ile Off-the-Record mesajlar.

+ +

Her kuyrukta NaCL kriptobox kullanılır, böylece TLS ihlal edilse bile mesaj kuyrukları arasındaki trafik ilişkilendirilemez.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Mesaj Bütünlüğü
Doğrulaması

+
+ +

Mesaj bütünlüğünü sağlamak için, mesajlar sıralı olarak numaralandırılır ve önceki mesajın hash'i eklenir.

+ +

Bir mesaj eklendiğinde, silindiğinde veya değiştirildiğinde alıcı uyarılır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Ek Sunucu
Şifreleme Katmanı

+
+ +

Alıcıya teslimat için ek sunucu şifreleme katmanı, TLS ihlal edilirse alınan ve gönderilen sunucu verileri arasındaki ilişkiyi önler.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Mesajları karıştırma,
korelasyonu azaltma

+
+ +

SimpleX sunucuları, düşük gecikmeli karıştırıcı düğümler olarak çalışır — gelen ve giden mesajların sırası farklıdır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Güvenli Doğrulanmış
TLS Taşıma Katmanı

+
+ +

İstemci-sunucu bağlantıları için yalnızca güçlü algoritmalarla TLS 1.2/1.3 kullanılır.

+ +

Sunucu parmak izleri ve kanal bağlama, MITM ve tekrar saldırılarını önler.

+ +

Oturum saldırılarını önlemek için bağlantı devamı devre dışı bırakılmıştır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

İsteğe Bağlı
Tor Erişimi

+
+ +

IP adresinizi korumak için Tor veya başka bir taşıma katmanı ağı üzerinden sunuculara erişebilirsiniz.

+ +

Android'de Tor ile SimpleX kullanmak için Orbot uygulamasını yükleyin ve SOCKS5 proxy'yi etkinleştirin veya iOS'ta VPN kullanın.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Tek Yönlü
Mesaj Kuyrukları

+
+ +

Her mesaj kuyruğu, farklı gönderici ve alıcı adresleriyle mesajları yalnızca tek yönde iletir.

+ +

Geleneksel mesaj aracılarına kıyasla, olası saldırı vektörleri ve mevcut metaveriler azaltılır.

+ +
+

Kapatmak için dokunun

+
+
+ +
+
+ + +
+
+

Çoklu İçerik
Doldurma Katmanları

+
+ +

SimpleX, mesaj boyutu saldırılarını önlemek için her şifreleme katmanında içerik doldurma kullanır.

+ +

Sunucu ve ağ gözlemcileri için aynı görünen farklı boyutlarda mesajlar üretir.

+ +
+

Kapatmak için dokunun

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX-Ağı

+

P2P ve federasyonlu ağların avantajlarını birleştirerek SimpleX, mümkün olan en iyi gizliliği sunar.

+ +
+
+
+ + +
+
+

P2P ağlarının aksine

+

+ Tüm mesajlar sunucular üzerinden gönderilir; bu, meta veri korumasını artırır ve daha güvenilir asenkron mesaj iletimi sağlar ve birçok sorunu önler P2P ağlarının sorunları. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

Federasyonlu ağların aksine

+

+ SimpleX aktarma sunucuları KULLANICI PROFİLLERİNİ, kişileri ve teslim edilen mesajları SAKLAMAZ ve birbirleriyle bağlantı kurmaz, ayrıca bir sunucu dizini yoktur. +

+
+
+ + + +
+
+ + +
+
+

SimpleX Ağı

+

+ Sunucular, kullanıcıları birbirine bağlamak için tek yönlü kuyruklar sağlar. Ancak ağın bağlantı grafiğini göremezler — bunu yalnızca kullanıcılar bilir. +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX açıklıyor

+ + + + + + + +
+
+ +
+
1. Kullanıcıların nasıl deneyimlediği
+
+ +

+ Kişiler ve gruplar oluşturabilir ve tıpkı diğer mesajlaşma programlarında olduğu gibi iki yönlü iletişim kurabilirsiniz. +

+

+ Tek yönlü kuyruklarla ve kullanıcı profil tanımlayıcıları olmadan nasıl çalışabilir? +

+
+
+ +
+
2. Nasıl çalışır
+
+ +

+ Her bağlantı için, farklı sunucular üzerinden mesaj göndermek ve almak üzere iki ayrı mesaj kuyruğu kullanırsınız. +

+

+ Sunucular, kullanıcı konuşmalarının veya bağlantılarının tüm geçmişini bilmeden mesajları yalnızca tek bir yönde iletir. +

+
+
+ +
+
3. Sunucuların ne gördüğü
+
+ +

+ Sunucular her kuyruk için ayrı, anonim oturum açma bilgileri kullanır ve hangi kullanıcıya ait olduğunu bilmez. +

+

+ Tor erişim sunucuları kullanarak kullanıcılar, meta veri gizliliğini artırabilir ve IP adresi korelasyonunu önleyebilir. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Diğer protokollerle karşılaştırma

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, büyük platformlarXMPP / MatrixP2P protokolleri
Küresel bir kimlik gerektirirHayır – gizliEvet 1Evet 2Evet 3
MITM saldırısı riskiHayır – güvenli 4Evet 5EvetEvet
DNS sistemine bağımlılıkHayır – dayanıklıEvetEvetHayır
Tek veya merkezi ağHayır – merkeziyetsizEvetHayır – federasyonlu 6Evet 7
Merkezi bileşen veya diğer ağ genelinde saldırılarHayır – dayanıklıEvetEvet 2Evet 8
+
+ +
+ +
+
+
    +
  1. Genellikle telefon numarasına, bazen kullanıcı adına dayalı
  2. +
  3. DNS tabanlı adresler
  4. +
  5. Genel anahtar veya başka bir küresel benzersiz kimlik
  6. +
  7. SimpleX aktarıcıları uçtan uca şifrelemeyi tehlikeye atamaz. Olası bir ağ dışı kanal saldırısını önlemek için güvenlik kodunu doğrulayın
  8. +
  9. Operatörün sunucuları ele geçirilirse. Signal ve diğer uygulamalarda bunu azaltmak için güvenlik kodu doğrulanabilir
  10. +
  11. Kullanıcı meta verilerinin gizliliği korunmaz
  12. +
  13. P2P dağıtık olsa da federasyonlu değildir — tek bir ağ olarak çalışır
  14. +
  15. P2P ağlarının ya merkezi bir yönetimi vardır ya da tüm ağ tehlikeye girebilir — Buraya bakın
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — Buraya bakın.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/transparency/index.html b/transparency/index.html index a8189c0374..90496ee769 100644 --- a/transparency/index.html +++ b/transparency/index.html @@ -36,6 +36,8 @@ + + @@ -53,12 +55,12 @@ + - -
- + + @@ -99,188 +101,182 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- -themeCheck(); - -const changeHeaderBg = ()=>{ - const header = document.querySelector('header') - const scrollValue = window.scrollY - if(scrollValue > 5){ - header.classList.add('bg-primary-bg-light'); - header.classList.add('dark:bg-primary-bg-dark'); - } - else{ - header.classList.remove('bg-primary-bg-light'); - header.classList.remove('dark:bg-primary-bg-dark'); - } -} - -window.addEventListener('scroll',changeHeaderBg); - - -
- -
+
-
+ diff --git a/uk/contact/index.html b/uk/contact/index.html index e7cfb305b9..38b92d2d12 100644 --- a/uk/contact/index.html +++ b/uk/contact/index.html @@ -27,6 +27,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -95,6 +98,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/uk/fdroid/index.html b/uk/fdroid/index.html index 9e5a9612c8..3f44e3fbcc 100644 --- a/uk/fdroid/index.html +++ b/uk/fdroid/index.html @@ -27,6 +27,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -95,6 +98,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

Пояснення SimpleX

- - - - - - - -
-
- -
-
1. Що відчувають користувачі
-
- -

- Ви можете створювати контакти та групи і вести двосторонні розмови, як у будь-якому іншому месенджері. -

-

- Як це може працювати з однобічними чергами та без ідентифікаторів профілю користувача? -

-
-
- -
-
2. Як це працює
-
- -

- Для кожного з'єднання ви використовуєте дві окремі черги обміну повідомленнями для відправки та отримання повідомлень через різні сервери. -

-

- Сервери передають повідомлення тільки в одному напрямку, не маючи повної картини розмов або підключень користувача. -

-
-
- -
-
3. Що бачать сервери
-
- -

- Сервери мають окремі анонімні облікові дані для кожної черги і не знають, які користувачі до них відносяться. -

-

- Користувачі можуть додатково підвищити конфіденційність метаданих, використовуючи Tor для доступу до серверів, що запобігає кореляції за IP-адресою. -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

Порівняння з іншими протоколами

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal, великі платформиXMPP, MatrixПротоколи P2P
Потребує глобального ідентифікатораНі - конфіденційноТак 1Так 2Так 3
Можливість MITMНі - безпечно 4Так 5ТакТак
Залежність від DNSНі - стійкоТакТакНі
Одна чи централізована мережаНі - децентралізованоТакНі - федеративно 6Так 7
Центральний компонент чи інша атака на всю мережуНі - стійкоТакТак 2Так 8
-
- -
- -
-
-
    -
  1. Зазвичай базується на номері телефону, у деяких випадках на іменах користувачів
  2. -
  3. Адреси, засновані на DNS
  4. -
  5. Відкритий ключ чи який-небудь інший глобально унікальний ідентифікатор
  6. -
  7. Ретранслятори SimpleX не можуть порушити e2e-шифрування. Перевірте безпековий код для зменшення ризику атаки на зовнішньобандовий канал
  8. -
  9. Якщо сервери оператора порушені. Перевірте безпековий код в Signal та деяких інших додатках для зменшення ризику
  10. -
  11. Не захищає конфіденційність метаданих користувачів
  12. -
  13. Хоча P2P є розподіленими, вони не є федеративними — вони працюють як одна мережа
  14. -
  15. Мережі P2P мають або центральний орган управління, або всю мережу можна порушити - дивіться тут
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

Приєднатися SimpleX

-

Ми запрошуємо вас приєднатися до розмови

- - - -

Підпишіться, щоб отримувати наші оновлення

- -
- - - -
- -
- -

Отримати SimpleX додаток для настільних комп'ютерів

-
- - - - - -
-
-
- - +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/uk/invitation/index.html b/uk/invitation/index.html index 772368959b..4053f9ba1e 100644 --- a/uk/invitation/index.html +++ b/uk/invitation/index.html @@ -27,6 +27,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -95,6 +98,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/uk/messaging/index.html b/uk/messaging/index.html new file mode 100644 index 0000000000..96c0d3c0c8 --- /dev/null +++ b/uk/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

Чому SimpleX є унікальним

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

Ви маєте повну конфіденційність

+
+ +
+ +
+

+ SimpleX захищає конфіденційність вашого профілю, контактів та метаданих, приховуючи їх від серверів мережі SimpleX та будь-яких спостерігачів. +

+

+ На відміну від будь-якої іншої існуючої мережі для обміну повідомленнями, у SimpleX немає ідентифікаторів, призначених користувачам — не навіть випадкових чисел. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

Вас захищено
від спаму та зловживань

+
+ +
+ +
+

+ Оскільки у вас немає ідентифікатора або фіксованої адреси в мережі SimpleX, ніхто не може зв'язатися з вами, якщо ви не поділитеся одноразовою або тимчасовою адресою користувача, як QR-кодом або посиланням. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

Ви контролюєте свої дані

+
+ +
+ +
+

+ SimpleX зберігає всі дані користувачів на пристроях клієнтів у переносному зашифрованому форматі бази даних — його можна передавати на інший пристрій. +

+

+ Зашифровані повідомлення від кінця до кінця тимчасово зберігаються на ретрансляційних серверах SimpleX до їх отримання, після чого вони назавжди видаляються. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

Ви власник мережі SimpleX

+
+ +
+ +
+

+ Мережа SimpleX повністю децентралізована та незалежна від будь-якої криптовалюти або будь-якої іншої мережі, окрім Інтернету. +

+

+ Ви можете використовувати SimpleX з власними серверами або з серверами, які ми надаємо — і все одно підключатися до будь-якого користувача. +

+ +
+ + + Дізнатися більше + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Особливості

+ +
+ +
+
+ + +
+

Повідомлення з шифруванням від кінця до кінця з можливістю використання Markdown та редагування

+
+ +
+
+ + +
+

Зображення, відео та файли з шифруванням від кінця до кінця

+
+ +
+
+ + +
+

Децентралізовані групи з шифруванням від кінця до кінця — тільки користувачі знають про їх існування

+
+ +
+
+ + +
+

Голосові повідомлення з шифруванням від кінця до кінця

+
+ +
+
+ + +
+

Зникнення повідомлень

+
+ +
+
+ + +
+

Дзвінки з шифруванням від кінця до кінця для аудіо та відео

+
+ +
+
+ + +
+

Переносне зашифроване зберігання додатку — переміщуйте профіль на інший пристрій

+
+ +
+
+ + +
+

Режим інкогніто —
унікальний для SimpleX Chat

+
+ +
+
+
+ + +
+
+

Що робить SimpleX конфіденційним

+ +
+
+ + +
+
+ + +
+
+

Тимчасові анонімні парні ідентифікатори

+
+ +

SimpleX використовує тимчасові анонімні парні адреси та облікові дані для кожного користувача, контакту чи учасника групи.

+ +

Це дозволяє доставляти повідомлення без ідентифікаторів профілю користувача та забезпечує кращу конфіденційність метаданих, ніж альтернативи.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Позаканальний
обмін ключами

+
+ +

Багато комунікаційних мереж вразливі до MITM-атак серверів чи постачальників мережі.

+ +

Щоб запобігти цьому, програми SimpleX передають одноразові ключі позаканально, коли ви ділитесь адресою як посиланням або QR-кодом.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

2 рівні шифрування від кінця до кінця

+
+ +

Протокол подвійної рейки — OTR-повідомлення з ідеальною передачею секрету та відновленням злому.

+ +

NaCL криптокоробка в кожній черзі для запобігання кореляції трафіку між чергами повідомлень у разі компрометації TLS.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Перевірка
цілісності повідомлення

+
+ +

Для гарантії цілісності повідомлення пронумеровані послідовно та містять хеш попереднього повідомлення.

+ +

Якщо будь-яке повідомлення додається, вилучається чи змінюється, отримувач буде проінформований.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Додатковий рівень
шифрування сервера

+
+ +

Додатковий рівень шифрування сервера для доставки отримувачу для запобігання кореляції між отриманим та відісланим трафіком сервера у разі компрометації TLS.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Змішування повідомлень
для зменшення кореляції

+
+ +

Сервери SimpleX виступають як вузли низької затримки для змішування — вхідні та вихідні повідомлення мають різний порядок.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Безпечний аутентифікований
транспорт TLS

+
+ +

Використовується лише TLS 1.2/1.3 із сильними алгоритмами для з'єднань клієнт-сервер.

+ +

Відбиток сервера та зв'язування каналу запобігають MITM та атакам повтору.

+ +

Відновлення з'єднання вимкнено для запобігання атакам на сесію.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Опційний
доступ через Tor

+
+ +

Для захисту вашої IP-адреси ви можете отримати доступ до серверів через Tor чи іншу транспортну оверлейну мережу.

+ +

Для використання SimpleX через Tor, будь ласка, встановіть додаток Orbot та активуйте SOCKS5-проксі (або VPN на iOS).

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Однобічні
черги повідомлень

+
+ +

Кожна черга повідомлень передає повідомлення в одному напрямку, з різними адресами для відправки та отримання.

+ +

Це зменшує вектори атак порівняно із традиційними брокерами повідомлень та доступними метаданими.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+
+ + +
+
+

Кілька рівнів
наповнення вмісту

+
+ +

SimpleX використовує наповнення вмісту для кожного шару шифрування для ускладнення атак за розміром повідомлень.

+ +

Це забезпечує, що повідомлення різних розмірів виглядають однаково для серверів та спостерігачів мережі.

+ +
+

Торкніться, щоб закрити

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

Simplex Chat надає найкращу конфіденційність, поєднуючи переваги P2P та федеративних мереж.

+ +
+
+
+ + +
+
+

На відміну від мереж P2P

+

+ Всі повідомлення відправляються через сервери, що забезпечує кращу конфіденційність метаданих та надійну асинхронну доставку повідомлень, уникаючи багатьох проблем P2P-мереж. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

На відміну від федеративних мереж

+

+ Сервери SimpleX Chat НЕ зберігають профілі користувачів, контакти та доставлені повідомлення, НЕ підключаються один до одного, і НЕ існує каталог серверів. +

+
+
+ + + +
+
+ + +
+
+

Мережа SimpleX

+

+ сервери надають однобічні черги для з'єднання користувачів, але вони не мають видимості графа підключень в мережі — лише користувачі. +

+
+
+ +
+
+ +
+ + + + + +
+
+

Пояснення SimpleX

+ + + + + + + +
+
+ +
+
1. Що відчувають користувачі
+
+ +

+ Ви можете створювати контакти та групи і вести двосторонні розмови, як у будь-якому іншому месенджері. +

+

+ Як це може працювати з однобічними чергами та без ідентифікаторів профілю користувача? +

+
+
+ +
+
2. Як це працює
+
+ +

+ Для кожного з'єднання ви використовуєте дві окремі черги обміну повідомленнями для відправки та отримання повідомлень через різні сервери. +

+

+ Сервери передають повідомлення тільки в одному напрямку, не маючи повної картини розмов або підключень користувача. +

+
+
+ +
+
3. Що бачать сервери
+
+ +

+ Сервери мають окремі анонімні облікові дані для кожної черги і не знають, які користувачі до них відносяться. +

+

+ Користувачі можуть додатково підвищити конфіденційність метаданих, використовуючи Tor для доступу до серверів, що запобігає кореляції за IP-адресою. +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

Порівняння з іншими протоколами

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal, великі платформиXMPP, MatrixПротоколи P2P
Потребує глобального ідентифікатораНі - конфіденційноТак 1Так 2Так 3
Можливість MITMНі - безпечно 4Так 5ТакТак
Залежність від DNSНі - стійкоТакТакНі
Одна чи централізована мережаНі - децентралізованоТакНі - федеративно 6Так 7
Центральний компонент чи інша атака на всю мережуНі - стійкоТакТак 2Так 8
+
+ +
+ +
+
+
    +
  1. Зазвичай базується на номері телефону, у деяких випадках на іменах користувачів
  2. +
  3. Адреси, засновані на DNS
  4. +
  5. Відкритий ключ чи який-небудь інший глобально унікальний ідентифікатор
  6. +
  7. Ретранслятори SimpleX не можуть порушити e2e-шифрування. Перевірте безпековий код для зменшення ризику атаки на зовнішньобандовий канал
  8. +
  9. Якщо сервери оператора порушені. Перевірте безпековий код в Signal та деяких інших додатках для зменшення ризику
  10. +
  11. Не захищає конфіденційність метаданих користувачів
  12. +
  13. Хоча P2P є розподіленими, вони не є федеративними — вони працюють як одна мережа
  14. +
  15. Мережі P2P мають або центральний орган управління, або всю мережу можна порушити — дивіться тут
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — дивіться тут.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/zh_Hans/contact/index.html b/zh_Hans/contact/index.html index ab1b5b24fe..222c1c00b8 100644 --- a/zh_Hans/contact/index.html +++ b/zh_Hans/contact/index.html @@ -29,6 +29,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -97,6 +100,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/zh_Hans/fdroid/index.html b/zh_Hans/fdroid/index.html index 711a761171..00576cfe1f 100644 --- a/zh_Hans/fdroid/index.html +++ b/zh_Hans/fdroid/index.html @@ -29,6 +29,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -97,6 +100,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + - -
-
-

SimpleX 简述

- - - - - - - -
-
- -
-
1. 用户会体验到什么
-
- -

- 您可以创建联系人和群组,并进行双向对话,就像是任何其他即时通讯软件一样。 -

-

- 它是如何利用单向消息队列并不利用用户识别符工作的? -

-
-
- -
-
2. 背后的运作原理
-
- -

- 对于每个连接,您都会使用两个单独的消息队列,通过不同的服务器发送和接收消息。 -

-

- 服务器只单向传输消息,无法掌握用户的对话或连接的全貌。 -

-
-
- -
-
3. 服务器能看到什么
-
- -

- 服务器对每个队列都有单独的匿名凭证,并且不知道这些凭证属于哪些用户。 -

-

- 用户可以通过使用 Tor 访问服务器以进一步提高元数据隐私,防止通过 IP 地址关联实际身份。 -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

与其他协议的比较

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal、其他大平台XMPP、MatrixP2P协议
需要全局身份否 - 私密123
中间人攻击的可能性不可能 - 安全 45
对 DNS 的依赖不依赖 - 有韧性
单一或中心化网络不依赖 - 去中心化的不依赖 - 联邦式网络 67
中央组件或其他全网攻击不依赖 - 有韧性28
-
- -
- -
-
-
    -
  1. 通常基于电话号码,在某些情况下基于用户名
  2. -
  3. 基于 DNS 的地址
  4. -
  5. 公钥或其他一些全球唯一的 ID
  6. -
  7. SimpleX 中继无法破坏 e2e 加密。 验证安全代码以减轻对带外通道的攻击
  8. -
  9. 如果运营商的服务器受到威胁。 验证 Signal 和其他一些应用程序中的安全代码以缓解该问题
  10. -
  11. 不保护用户的元数据隐私
  12. -
  13. P2P 是分布式的,但并非联邦式的 — 它们作为单个网络运行
  14. -
  15. P2P 网络要么拥有中央权威,要么整个网络可能被攻陷 - 参见此处
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

加入 SimpleX

-

我们邀请您加入对话

- - - -

注册以接收我们的更新

- -
- - - -
- -
- -

获取 SimpleX desktop app

-
- - - - - -
-
-
-

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/zh_Hans/invitation/index.html b/zh_Hans/invitation/index.html index 838c5d9769..b50454b95d 100644 --- a/zh_Hans/invitation/index.html +++ b/zh_Hans/invitation/index.html @@ -29,6 +29,8 @@ + + @@ -58,15 +60,16 @@ + + - -
- + + @@ -97,6 +100,8 @@ + + @@ -108,182 +113,171 @@ -
-
- - - - + +
+ + + + +
- - -
+}); + @@ -851,7 +827,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/zh_Hans/messaging/index.html b/zh_Hans/messaging/index.html new file mode 100644 index 0000000000..9dc96aa5f7 --- /dev/null +++ b/zh_Hans/messaging/index.html @@ -0,0 +1,1936 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

为什么 SimpleX 是独特的

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

您有完整的隐私

+
+ +
+ +
+

+ SimpleX 保护您的个人资料、联系人和元数据的隐私,不让 SimpleX 网络服务器和任何观察者看到它们。 +

+

+ 与任何其他现有的消息传递网络不同,SimpleX 没有分配给用户的标识符—— 甚至随机数也没有。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

您可以免受垃圾消息和平台滥用的侵害

+
+ +
+ +
+

+ 因为您在 SimpleX 网络上没有标识符或固定地址,所以除非您以二维码或链接的形式分享一次性或临时用户地址,没有人可以联系您。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

您控制您的数据

+
+ +
+ +
+

+ SimpleX 以便携式加密数据库格式将所有用户数据存储在客户端设备上—— 它可以转移到另一个设备。 +

+

+ 端到端加密的消息在被收到前会暂时保存在 SimpleX 中继服务器上,传送完成后它们会被永久删除。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

您拥有 SimpleX 网络

+
+ +
+ +
+

+ SimpleX 网络是完全去中心化的,并且独立于任何加密货币或除互联网以外的任何其他网络。 +

+

+ 您可以搭配自己的服务器来使用 SimpleX 或使用我们提供的服务器 — 并仍然连接到任何用户。 +

+ +
+ + + 了解更多 + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

功能

+ +
+ +
+
+ + +
+

端到端加密的文字消息,支持markdown和编辑

+
+ +
+
+ + +
+

端到端加密的
图片、视频和文件

+
+ +
+
+ + +
+

端到端加密的去中心化的秘密群组 —只有用户知道它们的存在

+
+ +
+
+ + +
+

端到端加密的语音消息

+
+ +
+
+ + +
+

支持消息自动销毁

+
+ +
+
+ + +
+

端到端加密的音视频通话

+
+ +
+
+ + +
+

便携的加密应用存储— 可将您的个人资料移至另一台设备

+
+ +
+
+ + +
+

隐身模式 —
SimpleX Chat 独有

+
+ +
+
+
+ + +
+
+

是什么让 SimpleX 能够保密

+ +
+
+ + +
+
+ + +
+
+

临时匿名成对标识符

+
+ +

SimpleX 为每个用户的联系人或群组成员均使用临时匿名成对地址和凭据。

+ +

它让在没有用户标识符的情况下传递消息成为可能,并提供比替代方案更好的元数据隐私。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

带外密钥交换

+
+ +

许多通信平台容易受到服务器或网络提供商的中间人攻击。

+ +

为防止这种情况,当您将通讯地址作为链接或二维码共享时,SimpleX 应用程序会在带外传递一次性密钥。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

双层端到端加密

+
+ +

双棘轮协议——具有完美前向保密和入侵恢复功能的 OTR(不留记录即时通讯) 消息传递。

+ +

每个队列中的网络与密码学库加密盒(NaCL cryptobox)可防止 TLS 受到威胁时消息队列之间的流量关联。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

消息完整性验证

+
+ +

为了保证消息完整性,消息按顺序编号并会包含前一条消息的哈希值。

+ +

如果添加、删除或更改任何消息,收件人都会收到警告。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

服务器提供的另一层加密

+
+ +

为来信附加服务器加密层,以防止在 TLS 受破坏时接收和发送的服务器流量之间发生关联。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

通过消息混合减少相关性

+
+ +

SimpleX 服务器会充当低延迟混合节点,打乱传入和传出消息的顺序。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

安全认证的TLS传输

+
+ +

客户端与服务器之间的连接只使用强加密的 TLS 1.2/1.3。

+ +

服务器指纹和通道绑定可防止中间人与重放攻击。

+ +

禁用连接恢复以防止会话攻击。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

可选择通过 Tor 访问

+
+ +

为了保护您的 IP 地址,您可以通过 Tor 或其他传输覆盖网络访问服务器。

+ +

要通过 Tor 使用 SimpleX,请安装 Orbot 应用并启用 SOCKS5 代理(在 iOS上需要使用 VPN 模式)。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

单向消息队列

+
+ +

每个消息队列都有不同的发送和接收地址,单向地传递消息。

+ +

与传统的消息代理相比,它减少了攻击媒介和可用的元数据。

+ +
+

点击关闭

+
+
+ +
+
+ + +
+
+

多层级的内容填充

+
+ +

SimpleX 为每个加密层进行内容填充来对抗长度扩展攻击。

+ +

它使不同大小的消息在服务器和网络监视者看来是一样的。

+ +
+

点击关闭

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX 网络

+

Simplex Chat 通过结合 P2P 和联邦网络的优势使其保密性无与伦比。

+ +
+
+
+ + +
+
+

与 P2P 网络不同

+

+ 所有消息都通过服务器发送,既能更好地保护元数据隐私和可靠地传递异步消息,同时也能避免许多 P2P网络存在的问题. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

不同于联邦网络

+

+ SimpleX 中继服务器不存储用户配置文件、联系人和传递的消息,不相互连接,并且没有服务器目录。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX 网络

+

+ 服务器提供单向队列来连接用户,但是他们看不到网络连接图图谱— 只有用户可以。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX 简述

+ + + + + + + +
+
+ +
+
1. 用户会体验到什么
+
+ +

+ 您可以创建联系人和群组,并进行双向对话,就像是任何其他即时通讯软件一样。 +

+

+ 它是如何利用单向消息队列并不利用用户识别符工作的? +

+
+
+ +
+
2. 背后的运作原理
+
+ +

+ 对于每个连接,您都会使用两个单独的消息队列,通过不同的服务器发送和接收消息。 +

+

+ 服务器只单向传输消息,无法掌握用户的对话或连接的全貌。 +

+
+
+ +
+
3. 服务器能看到什么
+
+ +

+ 服务器对每个队列都有单独的匿名凭证,并且不知道这些凭证属于哪些用户。 +

+

+ 用户可以通过使用 Tor 访问服务器以进一步提高元数据隐私,防止通过 IP 地址关联实际身份。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

与其他协议的比较

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal、其他大平台XMPP、MatrixP2P协议
需要全局身份否 - 私密123
中间人攻击的可能性不可能 - 安全 45
对 DNS 的依赖不依赖 - 有韧性
单一或中心化网络不依赖 - 去中心化的不依赖 - 联邦式网络 67
中央组件或其他全网攻击不依赖 - 有韧性28
+
+ +
+ +
+
+
    +
  1. 通常基于电话号码,在某些情况下基于用户名
  2. +
  3. 基于 DNS 的地址
  4. +
  5. 公钥或其他一些全球唯一的 ID
  6. +
  7. SimpleX 中继无法破坏 e2e 加密。 验证安全代码以减轻对带外通道的攻击
  8. +
  9. 如果运营商的服务器受到威胁。 验证 Signal 和其他一些应用程序中的安全代码以缓解该问题
  10. +
  11. 不保护用户的元数据隐私
  12. +
  13. P2P 是分布式的,但并非联邦式的 — 它们作为单个网络运行
  14. +
  15. P2P 网络要么拥有中央权威,要么整个网络可能被攻陷 — 参见此处
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — 参见此处.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + + diff --git a/zh_Hant/contact/index.html b/zh_Hant/contact/index.html index d61dbb823c..eb35dc1cdb 100644 --- a/zh_Hant/contact/index.html +++ b/zh_Hant/contact/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/zh_Hant/fdroid/index.html b/zh_Hant/fdroid/index.html index 2ee38107a6..fe4a34ccb6 100644 --- a/zh_Hant/fdroid/index.html +++ b/zh_Hant/fdroid/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + - -
-
-

SimpleX 解釋

- - - - - - - -
-
- -
-
1. 用戶體驗
-
- -

- 你可以建立聯絡人和群組,並進行雙向對話,就像在任何其他即時通訊軟件中一樣。 -

-

- 它如何在沒有使用者個人檔案識別符的情況下使用單向佇列? -

-
-
- -
-
2. 它是如何工作的
-
- -

- 對於每個連接,您可以使用兩個單獨的消息佇列通過不同的伺服器發送和接收消息。 -

-

- 伺服器僅單向傳遞消息,無法全面瞭解使用者的對話記錄或連接。 -

-
-
- -
-
3. 伺服器可以看到什麼
-
- -

- 伺服器對每個佇列都有單獨的匿名憑證,並且不知道它們屬於哪些使用者。 -

-

- 用戶可以通過使用 Tor 訪問伺服器來進一步提高元數據隱私,防止按 IP 位址進行序列化。 -

-
-
- -
-
-
-
-
- - - + +
+
+
+
+

Be
Free

+

Freedom & Security
of Your Communications

+

The first network where you own your identity, contacts, and groups.

- -
-
-

與其他協議之比較

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- simplex logo - - Signal,大平台XMPP、Matrix點對點協議
需要全局身份No - privateYes 1Yes 2Yes 3
中間人攻擊之可能No - secure 4Yes 5YesYes
對DNS的依賴No - resilientYesYesNo
單一或集中式網路No - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
-
- -
- -
-
-
    -
  1. 通常基於電話號碼,有時用戶名
  2. -
  3. 基於DNS的位址
  4. -
  5. 公鑰或其他某種全局獨一的標識符
  6. -
  7. SimpleX中繼不可能威脅端到端加密。由其他方式驗證安全碼以杜絕攻擊之可能
  8. -
  9. 如果運營商的伺服器受到攻擊,用其他應用程式(如 Signal)驗證 SimpleX 安全碼,以減輕風險
  10. -
  11. 不保護使用者的元數據隱私
  12. -
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. -
  15. 點對點網路必須有中央權威,否則整個網路都可能受到攻擊 - 見此
  16. -
+ +
+ + Trail of Bits + + + 2022 + + + 2024 + +

+ Security
Audits +

+
+ +
-
-
-
+
+
+
+
+
+
+

World's Most Secure Messaging

+

SimpleX messaging has cutting-edge end-to-end encryption.

+

For your security and privacy, servers can't see your messages and who you talk to.

+ Learn more about SimpleX messaging +
+
+
+
+
+
+

You Own
The Next Web

+

SimpleX is founded on the belief that you must own your identity, contacts and communities.

+

Open and decentralized network lets you connect with people and share ideas: be free and secure.

+
+
+
+
+
+
+

Communities That Last

+

You will support your favorite groups with future Community Vouchers.

+

Vouchers will pay for servers, to let your communities stay free and independent.

+ Learn more and get your free NFT
for early testing.
+
+
+
-
-
-

加入 SimpleX

-

We invite you to join the conversation

- - - -

登記以收取更新

- -
- - - -
- -
- -

下載SimpleX 桌面版應用程式

-
- - - - - -
-
-
-

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

- +
+
+
+

SimpleX Roadmap to Free Internet

+
+

2025

+

: Scale to Large Communities

+

Escaping centralized platforms

+
+
+

2026

+

: Sustainable Communities & Servers

+

Launching Community Vouchers

+
+
+

2027

+

: Make Your Communities Grow

+

Tools to promote your communities

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Join SimpleX Communities

+

Hundreds of thousands people already trust SimpleX messaging.

+

Find your communities in SimpleX directory and create your own!

+ View SimpleX Directory +
+
+
-
+ +
+ + + + + + + - - - - diff --git a/zh_Hant/invitation/index.html b/zh_Hant/invitation/index.html index f415a2ef3c..9c9e16cd64 100644 --- a/zh_Hant/invitation/index.html +++ b/zh_Hant/invitation/index.html @@ -33,6 +33,8 @@ + + @@ -56,15 +58,16 @@ + + - -
- + + @@ -103,183 +106,176 @@ + -
-
- - - - - +
+ + + +
+ + + + + +
+
+ + + + +
- - -
+}); + @@ -843,7 +818,7 @@ window.addEventListener('scroll',changeHeaderBg); - -
+ - diff --git a/zh_Hant/messaging/index.html b/zh_Hant/messaging/index.html new file mode 100644 index 0000000000..489e67e33a --- /dev/null +++ b/zh_Hant/messaging/index.html @@ -0,0 +1,1927 @@ + + + + + + + SimpleX Chat: Learn more about SimpleX messaging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+
+

The World's Most Secure Messaging

+ + +

Ultimate security: SimpleX network uses the most secure end-to-end encryption, with continuous post-quantum key exchange to protect all messages and metadata.

+

Unique privacy: SimpleX network has no user profile IDs, not even random numbers or keys. It provides better privacy of your contacts, protecting who you talk with from network servers.

+

No spam: nobody can contact you unless you share 1-time link or long-term address.

+

Data ownership: only your device stores your profiles, contacts and messages. You can securely move your data to another device. Servers store encrypted messages only while your device is offline.

+

Secure decentralization: you control which servers to connect to. For security 4 different servers are used in each chat — they can't observe which IP addresses talk to each other.

+

How to connect to others

+
    +
  • Tap new chat button in the corner, then create 1-time link.
  • +
  • Share the link with your contact via any other messenger or email - it is secure.
  • +
  • Ask your contact to use the link in the app - click it after the app is installed or paste into the search field in the app.
  • +
+ +
+
+ + +
+
+

SimpleX為何與眾不同

+ +
+
+ + +
+ +
+ + +
+ +
+
+

#1

+

您擁有完整的私隱權

+
+ +
+ +
+

+ SimpleX 保護您的個人資料、聯絡人和元資料的隱私,使其對 SimpleX 網路伺服器和任何觀察者隱藏。 +

+

+ 與任何其他現有的訊息網路不同,SimpleX 不指定使用者的標識符—甚至沒有隨機數。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#2

+

SimpleX保護您免受垃圾訊息、濫用之害

+
+ +
+ +
+

+ 由於您在 SimpleX 網路上沒有任何標識符或固定地址,因此除非您分享一次性或臨時地址 (如 二維碼或連結),任何人都無法與您聯絡。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#3

+

您掌控您的數據

+
+ +
+ +
+

+ SimpleX 以 可攜式加密數據庫格式 儲存用戶端裝置上的所有使用者資料;這些資料可傳輸至其他設備。 +

+

+ 端對端加密的訊息暫時保留在 SimpleX 中繼伺服器上,收到訊息後會被永久刪除。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ +
+ +
+ + +
+ +
+
+

#4

+

您擁有SimpleX網路

+
+ +
+ +
+

+ SimpleX 網路是完全去中心化的,獨立於任何加密貨幣或任何其他網路(除Internet)。 +

+

+ 您可以使用您自己的伺服器運行SimpleX,或使用我們提供的伺服器並仍連線到任何使用者。 +

+ +
+ + + 查看更多 + +
+
+ + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

特徵

+ +
+ +
+
+ + +
+

支持Markdown與編輯的、端到端加密的訊息

+
+ +
+
+ + +
+

端到端加密的圖像、視訊、檔案

+
+ +
+
+ + +
+

端到端加密的、去中心化的群組—存在只有用戶自己知道

+
+ +
+
+ + +
+

端到端加密的語音訊息

+
+ +
+
+ + +
+

自刪除訊息

+
+ +
+
+ + +
+

端到端加密的語音、視訊通話

+
+ +
+
+ + +
+

可攜、加密存儲—將設定檔移至另一設備

+
+ +
+
+ + +
+

隱身模式—SimpleX獨有

+
+ +
+
+
+ + +
+
+

What makes SimpleX private

+ +
+
+ + +
+
+ + +
+
+

臨時匿名標識符對

+
+ +

對用戶與群組成員,SimpleX使用臨時、匿名的地址對與憑證對。

+ +

SimpleX使不用用戶設定檔傳輸訊息成為可能,與其他軟體相比提供更強的詮釋資料私隱性。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

頻帶外密鑰交換

+
+ +

許多通訊網路容易受到伺服器或網路供應商的中間人攻擊。

+ +

To prevent it SimpleX apps pass one-time keys out-of-band, when you share an address as a link or a QR code.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

雙層端到端加密

+
+ +

雙棘輪協定—帶有前向保密、入侵恢復特質的不留記錄即時通訊協定。

+ +

如TLS安全受威脅,每個隊列中的NaCL cryptobox可防止關聯訊息隊列間的通訊。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

訊息完整性驗證

+
+ +

To guarantee integrity the messages are sequentially numbered and include the hash of the previous message.

+ +

If any message is added, removed or changed the recipient will be alerted.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

伺服器附加加密層

+
+ +

傳送至收件者的伺服器加密附加層,以防止 TLS 遭到攻擊時,接收和傳送的伺服器流量之間的關聯。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

訊息混雜以降低關聯性

+
+ +

SimpleX servers act as low latency mix nodes — the incoming and outgoing messages have different order.

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

經安全鑑權的TLS 傳送

+
+ +

Only TLS 1.2/1.3 with strong algorithms is used for client-server connections.

+ +

Server fingerprint and channel binding prevent MITM and replay attacks.

+ +

連線恢復被停用,以防止會話攻擊。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

選擇性
經由 Tor 訪問

+
+ +

為保護您的 IP 位址,您可透過 Tor 或其他傳輸覆蓋網路訪問伺服器。

+ +

To use SimpleX via Tor please install Orbot app and enable SOCKS5 proxy (or VPN on iOS).

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

單向訊息隊列

+
+ +

Each message queue passes messages in one direction, with the different send and receive addresses.

+ +

與傳統的訊息代理相比,它可減小攻擊媒介及可見的詮釋資料量。

+ +
+

輕觸以關閉

+
+
+ +
+
+ + +
+
+

多層內容填充

+
+ +

SimpleX 為每個加密層使用內容填充,以挫敗通過監控訊息長度的攻擊。

+ +

它讓不同長度的訊息在伺服器和網路觀察者看來相同。

+ +
+

輕觸以關閉

+
+
+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+

SimpleX Network

+

SinpleX Chat 結合點對點和互聯網路的優點,提供最佳的隱私性。

+ +
+
+
+ + +
+
+

Unlike P2P networks

+

+ 所有訊息都經由伺服器傳送,既能提供更好的元資料隱私和可靠的異步訊息傳送,又能避免許多 點對點網路的弊病. + + +

+ +

+
+
+ + + +
+
+ + +
+
+

與互聯網路不同

+

+ SimpleX 中繼伺服器不儲存使用者個人資料、聯絡人和傳送的訊息,也不連線彼此,也沒有伺服器目錄。 +

+
+
+ + + +
+
+ + +
+
+

SimpleX網路

+

+ 伺服器提供單向佇列以連接使用者,但伺服器無法看到網路連線圖 —只有使用者能看到。 +

+
+
+ +
+
+ +
+ + + + + +
+
+

SimpleX 解釋

+ + + + + + + +
+
+ +
+
1. 用戶體驗
+
+ +

+ 你可以建立聯絡人和群組,並進行雙向對話,就像在任何其他即時通訊軟件中一樣。 +

+

+ 它如何在沒有使用者個人檔案識別符的情況下使用單向佇列? +

+
+
+ +
+
2. 它是如何工作的
+
+ +

+ 對於每個連接,您可以使用兩個單獨的消息佇列通過不同的伺服器發送和接收消息。 +

+

+ 伺服器僅單向傳遞消息,無法全面瞭解使用者的對話記錄或連接。 +

+
+
+ +
+
3. 伺服器可以看到什麼
+
+ +

+ 伺服器對每個佇列都有單獨的匿名憑證,並且不知道它們屬於哪些使用者。 +

+

+ 用戶可以通過使用 Tor 訪問伺服器來進一步提高元數據隱私,防止按 IP 位址進行序列化。 +

+
+
+ +
+
+
+
+
+ + + + + + +
+
+

與其他協議之比較

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo + + Signal,大平台XMPP、Matrix點對點協議
需要全局身份No - privateYes 1Yes 2Yes 3
中間人攻擊之可能No - secure 4Yes 5YesYes
對DNS的依賴No - resilientYesYesNo
單一或集中式網路No - decentralizedYesNo - federated 6Yes 7
Central component or other network-wide attackNo - resilientYesYes 2Yes 8
+
+ +
+ +
+
+
    +
  1. 通常基於電話號碼,有時用戶名
  2. +
  3. 基於DNS的位址
  4. +
  5. 公鑰或其他某種全局獨一的標識符
  6. +
  7. SimpleX中繼不可能威脅端到端加密。由其他方式驗證安全碼以杜絕攻擊之可能
  8. +
  9. 如果運營商的伺服器受到攻擊,用其他應用程式(如 Signal)驗證 SimpleX 安全碼,以減輕風險
  10. +
  11. 不保護使用者的元數據隱私
  12. +
  13. While P2P are distributed, they are not federated — they operate as a single network
  14. +
  15. 點對點網路必須有中央權威,否則整個網路都可能受到攻擊 — 見此
  16. +
+
+
+
+
+ +
+
+

Comparison of end-to-end encryption security in different messengers

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ simplex logo +

Session

+
+ simplex logo +

Briar

+
+ simplex logo +

Element

+
+ simplex logo +

Cwtch

+
+ simplex logo +

Signal

+
+ simplex logo + +

SimpleX

+
Message padding✔︎1✔︎✔︎1✔︎
Repudiation (deniability)✔︎2✔︎3✔︎
Forward secrecy✔︎✔︎✔︎✔︎✔︎
Post-compromise security✔︎4✔︎
2-factor key exchange✔︎✔︎5✔︎5✔︎✔︎5✔︎
Post-quantum hybrid crypto✔︎6✔︎
+
+ +
+ +
+
+
    +
  1. Briar pads messages to the size rounded up to 1024 bytes, Signal - to 160 bytes
  2. +
  3. Repudiation does not include client-server connection.
  4. +
  5. It appears that the usage of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
  6. +
  7. Multi-device implementation compromises post-compromise security of Double Ratchet — 見此.
  8. +
  9. 2-factor key exchange is optional via security code verification.
  10. +
  11. Post-quantum key agreement is "sparse" — it protects only some of the ratchet steps.
  12. +
+
+
+
+
+ + +

End-to-end encryption

A communication system where only the communicating parties can read the messages. It is designed to protect message content from any potential eavesdroppers – telecom and Internet providers, malicious actors, and also the provider of the communication service.

Forward secrecy

Also known as perfect forward secrecy, it is a feature of a key agreement protocol that ensures that session keys will not be compromised even if long-term secrets used in the session key exchange are compromised. Forward secrecy protects past sessions against future compromises of session or long-term keys.

Key exchange

Also known as key exchange, it is a process of agreeing cryptographic keys between the sender and the recipient(s) of the message. It is required for end-to-end encryption to work. Unless it is possible to secure the key exchange via some second factor, e.g. security code verification, it can be vulnerable to man-in-the-middle attack.

MITM attack

The attack when the attacker secretly relays and possibly alters the communications between two parties who believe that they are directly communicating with each other.

Message padding

Also known as content padding, it is the process of adding data to the beginning or the end of a message prior to encryption. Padding conceals the actual message size from any eavesdroppers. SimpleX has several encryption layers, and prior to each encryption the content is padded to a fixed size.

Post-compromise security

The quality of the end-to-end encryption scheme allowing to recover security against a passive attacker who observes encrypted messages after compromising one (or both) of the parties. Also known as recovery from compromise or break-in recovery. Double-ratchet algorithm has this quality.

Post-quantum hybrid crypto

Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is proven to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms.

Repudiation

The property of the cryptographic or communication system that allows the sender of the message to plausibly deny having sent the message, because while the recipient can verify that the message was sent by the sender, they cannot prove it to any third party - the recipient has a technical ability to forge the same encrypted message. This is an important quality of private communications, as it allows to have the conversation that can later be denied, similarly to having a private face-to-face conversation.

+ + + + + + + + +