@thru/wallet 0.2.22 → 0.2.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -97,6 +97,7 @@ function normalizeConnectionStateResult(result) {
97
97
  var PRODUCTION_IFRAME_ORIGINS = ["https://wallet.thru.org"];
98
98
  var SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1e3;
99
99
  var FAST_REQUEST_TIMEOUT_MS = 30 * 1e3;
100
+ var PARENT_ORIGIN_SEARCH_PARAM = "tn_parent_origin";
100
101
  var SLOW_REQUEST_TYPES = /* @__PURE__ */ new Set([
101
102
  POST_MESSAGE_REQUEST_TYPES.CONNECT,
102
103
  POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,
@@ -138,6 +139,16 @@ function validateIframeOrigin(iframeUrl) {
138
139
  );
139
140
  }
140
141
  }
142
+ function getCurrentWindowOrigin() {
143
+ if (typeof window === "undefined") {
144
+ return null;
145
+ }
146
+ const origin = window.location.origin;
147
+ if (!origin || origin === "null") {
148
+ return null;
149
+ }
150
+ return origin;
151
+ }
141
152
  var IframeManager = class {
142
153
  constructor(iframeUrl) {
143
154
  this.iframe = null;
@@ -155,6 +166,10 @@ var IframeManager = class {
155
166
  getIframeSrc() {
156
167
  const url = new URL(this.iframeUrl);
157
168
  url.searchParams.set("tn_frame_id", this.frameId);
169
+ const parentOrigin = getCurrentWindowOrigin();
170
+ if (parentOrigin) {
171
+ url.searchParams.set(PARENT_ORIGIN_SEARCH_PARAM, parentOrigin);
172
+ }
158
173
  return url.toString();
159
174
  }
160
175
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interfaces/accounts.ts","../src/interfaces/types.ts","../src/protocol/postMessage.ts","../src/protocol/walletState.ts","../src/provider/IframeManager.ts","../src/provider/chains/ThruChain.ts","../src/provider/EmbeddedProvider.ts","../src/BrowserSDK.ts"],"names":[],"mappings":";;;AAYO,SAAS,4BAAA,CACd,UACA,eAAA,EACsB;AACtB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OACE,QAAA,CAAS,KAAK,CAAC,OAAA,KAAY,QAAQ,OAAA,KAAY,eAAA,CAAgB,OAAO,CAAA,IACtE,eAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AACxB;AAEO,SAAS,6BAAA,CACd,UACA,OAAA,EACsB;AACtB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,OAAA,KAAY,OAAO,CAAA,IAAK,IAAA;AACpE;AAEO,SAAS,6BAAA,CACd,UACA,eAAA,EACsB;AACtB,EAAA,MAAM,aAAA,GAAgB,4BAAA,CAA6B,QAAA,EAAU,eAAe,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA,GAAgB,CAAC,aAAa,IAAI,EAAC;AAAA,IAC7C,eAAA,EAAiB;AAAA,GACnB;AACF;AAEO,SAAS,4BAAA,CAGd,QACA,eAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,6BAAA;AAAA,IACb,MAAA,CAAO,QAAA;AAAA,IACP,eAAA,IAAmB,OAAO,eAAA,IAAmB;AAAA,GAC/C;AACA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,iBAAiB,MAAA,CAAO;AAAA,GAC1B;AACF;;;AC5DO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM;AACR;AAyBO,IAAM,uBAAA,GAA0B;AAAA,EACrC,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB;AAC1B;;;ACvBO,IAAM,0BAAA,GAA6B;AAAA,EACxC,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,gBAAA,EAAkB,iBAAA;AAAA,EAClB,YAAA,EAAc,aAAA;AAAA,EACd,oBAAA,EAAsB,oBAAA;AAAA,EACtB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,EAAgB,eAAA;AAAA,EAChB,eAAA,EAAiB;AACnB;AAKO,IAAM,wBAAA,GAA2B;AAAA,EACtC,aAAA,EAAe,eAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,eAAA,EAAiB;AACnB;AAKO,IAAM,uBAAA,GAA0B;AAEhC,IAAM,kBAAA,GAAqB;AAE3B,IAAM,kBAAA,GAAqB;AAElC,IAAM,iBAAA,GAAoB,KAAA;AAEnB,IAAM,eAAA,GAAkB,CAAC,MAAA,GAAiB,iBAAA,KAA8B;AAC7E,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrD,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAA,EAAK,IAAI,MAAM,CAAA,CAAA;AAC1C;AAqJO,IAAM,SAAA,GAAY;AAAA,EACvB,aAAA,EAAe,eAAA;AAAA,EACf,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,aAAA,EAAe,eAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe;AACjB;;;AC9MO,SAAS,+BACd,MAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,CAAC,OAAO,UAAA,EAAY;AAC9C,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,UAAU,EAAC,EAAG,iBAAiB,IAAA,EAAK;AAAA,EAC1D;AAEA,EAAA,OAAO,6BAA6B,MAAM,CAAA;AAC5C;;;ACOA,IAAM,yBAAA,GAA4B,CAAC,yBAAyB,CAAA;AAE5D,IAAM,uBAAA,GAA0B,IAAI,EAAA,GAAK,GAAA;AACzC,IAAM,0BAA0B,EAAA,GAAK,GAAA;AAErC,IAAM,kBAAA,uBAA8C,GAAA,CAAI;AAAA,EACtD,0BAAA,CAA2B,OAAA;AAAA,EAC3B,0BAAA,CAA2B,YAAA;AAAA,EAC3B,0BAAA,CAA2B,gBAAA;AAAA,EAC3B,0BAAA,CAA2B;AAC7B,CAAC,CAAA;AAED,SAAS,kBAAkB,QAAA,EAA2B;AACpD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5D,EAAA,IACE,MAAM,MAAA,KAAW,CAAA,IACjB,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IAAK,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,GAAG,CAAA,EACtE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AACf,EAAA,OACE,MAAM,EAAA,IACN,CAAA,KAAM,OACL,CAAA,KAAM,GAAA,IAAO,KAAK,EAAA,IAAM,CAAA,IAAK,EAAA,IAC7B,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,IACnB,MAAM,GAAA,IAAO,CAAA,IAAK,MAAM,CAAA,IAAK,GAAA;AAElC;AAEA,SAAS,sBAAsB,QAAA,EAA2B;AACxD,EAAA,OACE,aAAa,WAAA,IACb,QAAA,KAAa,SACb,CAAC,QAAA,CAAS,SAAS,GAAG,CAAA,IACtB,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAC1B,QAAA,CAAS,SAAS,SAAS,CAAA,IAC3B,kBAAkB,QAAQ,CAAA;AAE9B;AAEA,SAAS,2BAA2B,GAAA,EAAmB;AACrD,EAAA,IAAI,IAAI,QAAA,KAAa,OAAA,IAAW,GAAA,CAAI,QAAA,KAAa,UAAU,OAAO,KAAA;AAClE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,WAAA,EAAY;AACzD,EAAA,IAAI,CAAC,qBAAA,CAAsB,WAAW,CAAA,EAAG,OAAO,KAAA;AAEhD,EAAA,OAAO,qBAAA,CAAsB,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,CAAA;AACzD;AAMA,SAAS,qBAAqB,SAAA,EAAyB;AACrD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,SAAS,CAAA;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,SAAS,CAAA,mCAAA;AAAA,KAClC;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,YACJ,yBAAA,CAA0B,QAAA,CAAS,MAAM,CAAA,IAAK,2BAA2B,GAAG,CAAA;AAE9E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,MAAM,CAAA,2CAAA,EACY,yBAAA,CAA0B,IAAA,CAAK,IAAI,CAAC,CAAA,uKAAA;AAAA,KAGpF;AAAA,EACF;AACF;AAMO,IAAM,gBAAN,MAAoB;AAAA,EAiBzB,YAAY,SAAA,EAAmB;AAhB/B,IAAA,IAAA,CAAQ,MAAA,GAAmC,IAAA;AAI3C,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAAqD;AACnF,IAAA,IAAA,CAAQ,eAAA,GAA0D,IAAA;AAClE,IAAA,IAAA,CAAQ,YAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,WAAA,GAAkC,OAAA;AAC1C,IAAA,IAAA,CAAQ,eAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAShB,IAAA,oBAAA,CAAqB,SAAS,CAAA;AAE9B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA;AAGvC,IAAA,IAAA,CAAK,OAAA,GAAU,gBAAgB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEQ,YAAA,GAAuB;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,GAA8B;AAClC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,gBAAgB,YAAY;AAC/B,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,YAAA,EAAa;AAEpC,QAAA,IAAA,CAAK,OAAO,KAAA,GAAQ,yDAAA;AACpB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,QAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAExB,QAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,QAAA,IAAY,IAAA,CAAK,eAAA,EAAiB;AACzD,UAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,QACvC;AAGA,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACnD,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,eAAe,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACpB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAA8B;AACpC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,IAAI,YAAA;AACJ,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA;AAAA,QACF;AACA,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,YAAY,CAAA;AAClD,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACtB,CAAA;AAEA,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,8CAA8C,CAAC,CAAA;AAAA,MAClE,GAAG,GAAK,CAAA;AAER,MAAA,YAAA,GAAe,CAAC,KAAA,KAAwB;AACtC,QAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,EAAG;AACpC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,KAAS,kBAAA,EAAoB;AAC3C,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAEA,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAAuC;AACvD,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AACnB,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AACnB,IAAA,IAAI,KAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,CAAO,aAAA,KAAkB,KAAK,eAAA,EAAiB;AAC9E,MAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,aAAA,KAAkB,QAAA,CAAS,IAAA,EAAM;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,WAAA,KAAgB,QAAA;AAAA,EAC9B;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAgB,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAS5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAW9B;AAAA,EAEQ,cAAc,OAAA,EAAwB;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,GAAA,GAAM,GAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,aAAA,GAAgB,OAAA,GAAU,MAAA,GAAS,MAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,OAAA,GAAU,SAAA,GAAY,QAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,OAAA,EACuD;AAIvD,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAA,CAAK,YAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,aAAA,EAAe;AAC/B,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO,IAAI,OAAA,CAAsD,CAAC,OAAA,EAAS,MAAA,KAAW;AAGpF,MAAA,MAAM,YAAY,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,IAAI,IACjD,uBAAA,GACA,uBAAA;AAEJ,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0CAA0C,CAAC,CAAA;AAAA,MAC9D,GAAG,SAAS,CAAA;AAGZ,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,CAAC,QAAA,KAAkC;AACtE,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAEtC,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,OAAA,CAAQ,QAAwD,CAAA;AAAA,QAClE,CAAA,MAAO;AACL,UAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,WAAW,eAAe,CAAA;AAClE,UAAC,KAAA,CAAc,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA;AACtC,UAAC,KAAA,CAAc,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA;AACtC,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,IAAA,CAAK,MAAA,CAAQ,aAAA,CAAe,WAAA,CAAY,OAAA,EAAS,KAAK,YAAY,CAAA;AAAA,IACpE,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAA2B;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,EAAG;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAGnB,IAAA,IAAI,KAAK,EAAA,IAAM,IAAA,CAAK,gBAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAChD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA;AAChD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAA2B,CAAA;AAAA,MACrC;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,uBAAA,EAAyB;AACzC,MAAA,IAAA,CAAK,YAAY,IAAwB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAA8B;AAEhD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAA8B;AACxD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,IAAA,CAAK,YAAA,EAAc;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,KAAY,KAAK,OAAA,EAAS;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AAIA,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ,aAAA,IAAiB,MAAM,MAAA,KAAW,IAAA,CAAK,OAAO,aAAA,EAAe;AAC5E,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,eAAe,CAAA;AAC1D,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AACF,CAAA;;;ACxaO,IAAM,oBAAN,MAA8C;AAAA,EAInD,WAAA,CAAY,eAA8B,QAAA,EAA4B;AACpE,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,GAA0C;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC3C,IAAA,MAAM,kBAAkB,MAAA,CAAO,eAAA;AAC/B,IAAA,MAAM,WAAA,GACJ,eAAA,EAAiB,WAAA,KAAgB,WAAA,CAAY,OACzC,eAAA,GACA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,KAAgB,YAAY,IAAI,CAAA;AAE1E,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,OAAA,EAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAAA,EACjC;AAAA,EAEA,MAAM,iBAAA,GAAiD;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY;AAAA,MACpD,IAAI,eAAA,EAAgB;AAAA,MACpB,MAAM,0BAAA,CAA2B,mBAAA;AAAA,MACjC,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,KACzB,CAAA;AAED,IAAA,OAAO,SAAS,MAAA,CAAO,cAAA;AAAA,EACzB;AAAA,EAEA,MAAM,gBAAgB,WAAA,EAAqD;AACzE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAExB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY;AAAA,QACpD,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,gBAAA;AAAA,QACjC,OAAA,EAAS;AAAA,UACP,eAAe,WAAA,CAAY,aAAA;AAAA,UAC3B,gBAAgB,WAAA,CAAY,cAAA;AAAA,UAC5B,iBAAiB,WAAA,CAAY,eAAA;AAAA,UAC7B,oBAAoB,WAAA,CAAY,kBAAA;AAAA,UAChC,mBAAmB,WAAA,CAAY,iBAAA;AAAA,UAC/B,QAAQ,WAAA,CAAY;AAAA,SACtB;AAAA,QACA,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OACzB,CAAA;AACD,MAAA,OAAO,SAAS,MAAA,CAAO,iBAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,IAC1B;AAAA,EACF;AACF,CAAA;;;ACjDO,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YAAY,MAAA,EAAgC;AAL5C,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,WAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,eAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAA2B;AACxD,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAEnB,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACtC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,SAAS,CAAA;AAGhD,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,GAAU,CAAC,SAAA,EAAmB,OAAA,KAAiB;AAChE,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAE5B,MAAA,IAAI,SAAA,KAAc,yBAAyB,OAAA,EAAS;AAClD,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,QAChC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAc,SAAA,EAAU;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IACE,SAAA,KAAc,wBAAA,CAAyB,UAAA,IACvC,SAAA,KAAc,yBAAyB,IAAA,EACvC;AACA,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,KAAc,yBAAyB,eAAA,EAAiB;AAC1D,QAAA,MAAM,OAAA,GACH,OAAA,IAAY,OAAA,CAAQ,OAAA,IAA0C,IAAA;AACjE,QAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,CAAC,YAAY,IAAI,CAAA;AAC7D,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,iBAAA,CAAkB,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,cAAc,YAAA,EAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAAuC;AACvD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,SAAS,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,OAAA,EAAkD;AAE9D,IAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,aAAA,EAAe,EAAE,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAc,SAAA,EAAU;AAAA,MAC/B;AAEA,MAAA,MAAM,UAAiC,EAAC;AAExC,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,QAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY;AAAA,QACpD,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,OAAA;AAAA,QACjC,OAAA;AAAA,QACA,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OACzB,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,QAAA,CAAS,MAAM,CAAA;AAC3D,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAG9B,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,OAAA,EAAS,MAAM,CAAA;AAGlD,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,MAC1B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,aAAA,EAAe,EAAE,OAAO,CAAA;AAC3D,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,cAAc,WAAA,CAAY;AAAA,QACnC,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,UAAA;AAAA,QACjC,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OACzB,CAAA;AAED,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,UAAA,EAAY,EAAE,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,kBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,SAAA,EAA2C;AAC7D,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,YAAA,GACJ,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,SAAS,CAAA,IAAK,IAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAgC,EAAE,SAAA,EAAU;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY;AAAA,MACpD,IAAI,eAAA,EAAgB;AAAA,MACpB,MAAM,0BAAA,CAA2B,cAAA;AAAA,MACjC,OAAA;AAAA,MACA,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,KACzB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,OAAA;AAEhC,IAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,GAAgD;AACpD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,cAAc,SAAA,EAAU;AAAA,IAC/B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY;AAAA,QACpD,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,eAAA;AAAA,QACjC,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OACzB,CAAA;AAED,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,QAAA,EAAU,SAAS,MAAA,CAAO,QAAA;AAAA,QAC1B,eAAA,EAAiB,SAAS,MAAA,CAAO;AAAA,OAClC,CAAA;AACD,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAC9B,MAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,QAAA,IAAA,CAAK,IAAA,CAAK,yBAAyB,eAAA,EAAiB;AAAA,UAClD,SAAS,IAAA,CAAK;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAmB;AACrB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAAG,OAAe,QAAA,EAA0B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,QAAA,EAA0B;AAC3C,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAA,CAAK,OAAe,IAAA,EAAkB;AAC5C,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,QAAA,KAAa;AACpD,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEQ,oBAAoB,OAAA,EAAqC;AAC/D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,WAAW,EAAC;AACjB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AAAA,EACzB;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AACF,CAAA;ACrSO,IAAM,aAAN,MAAiB;AAAA,EAQtB,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AAN3C,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAkC;AAC/D,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AAEtB,IAAA,IAAA,CAAQ,eAAA,GAAiD,IAAA;AACzD,IAAA,IAAA,CAAQ,iBAAA,GAA0C,IAAA;AAGhD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB;AAAA,MACnC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,CAAC,YAAY,IAAI;AAAA,KACvD,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,gBAAA,CAAiB;AAAA,MACjC,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAGD,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,OAAA,EAAkD;AAE9D,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,OAAO,IAAA,CAAK,eAAA;AAAA,IACd;AAEA,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,QAAA,CAAS,aAAY,EAAG;AACzD,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,cAAc,CAAA;AAE7C,IAAA,MAAM,YAAY,YAAY;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AACvD,QAAA,MAAM,eAAA,GAAkB,QAAA,GAAW,EAAE,QAAA,EAAS,GAAI,KAAA,CAAA;AAClD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,eAAe,CAAA;AAC1D,QAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAC3B,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,QAAA,MAAM,KAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAAuC;AACvD,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,SAAS,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,CAAA;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA+B;AAC7B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,sBAAsB,QAAQ,CAAA;AACnC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAAA,EAC1C;AAAA,EAEA,MAAM,cAAc,SAAA,EAA2C;AAC7D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,cAAc,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,OAAO,CAAA;AAC/D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,GAAgD;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,cAAA,EAAe;AAClD,IAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,eAAe,CAAA;AAClE,IAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,MAAA,CAAO,eAAe,CAAA;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAAG,OAAiB,QAAA,EAA+B;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAiB,QAAA,EAA+B;AAClD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,OAAiB,QAAA,EAA+B;AACnD,IAAA,MAAM,eAAA,GAAkB,IAAI,IAAA,KAAgB;AAC1C,MAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,eAAe,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,eAAe,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAA,CAAK,OAAiB,IAAA,EAAkB;AAC9C,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG,QAAQ,CAAA,QAAA,KAAY;AAClD,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AAEnC,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,OAAA,EAAS,CAAC,IAAA,KAAc;AAAA,IAElE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,UAAA,EAAY,CAAC,IAAA,KAAc;AACnE,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,KAAA,EAAO,CAAC,IAAA,KAAc;AAC9D,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACzB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,IAAA,EAAM,CAAC,IAAA,KAAc;AAC7D,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,eAAA,EAAiB,CAAC,IAAA,KAAc;AACxE,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,IAAA;AACjC,MAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG,WAAW,IAAI,CAAA;AACvE,MAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,EAC3B;AAAA,EAEQ,gBAAgB,KAAA,EAAgE;AACtF,IAAA,MAAM,gBAAgB,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,MAAA;AAC/E,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,KAAA,EAAO;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,aAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,aAAA,EAAe,OAAO,MAAM,CAAA;AAC9D,IAAA,MAAM,UAAU,KAAA,EAAO,OAAA,IAAW,IAAA,CAAK,aAAA,CAAc,UAAU,KAAK,CAAA;AAEpE,IAAA,MAAM,WAAiC,EAAC;AACxC,IAAA,IAAI,KAAA,WAAgB,KAAA,GAAQ,KAAA;AAC5B,IAAA,IAAI,MAAA,WAAiB,MAAA,GAAS,MAAA;AAC9B,IAAA,IAAI,OAAA,WAAkB,OAAA,GAAU,OAAA;AAChC,IAAA,IAAI,KAAA,EAAO,QAAA,EAAU,QAAA,CAAS,QAAA,GAAW,KAAA,CAAM,QAAA;AAE/C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CAAc,eAAwB,WAAA,EAA0C;AACtF,IAAA,MAAM,YAAY,WAAA,IAAe,aAAA;AACjC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAA,EAAW,aAAa,CAAA;AAC5C,MAAA,OAAO,IAAI,QAAA,EAAS;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,aAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,cAAc,MAAA,EAAqC;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,MAAM,CAAA,CAAE,QAAA;AACjC,MAAA,OAAO,QAAA,IAAY,MAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEO,OAAA,GAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEQ,qBAAA,CAAsB,UAA2B,eAAA,EAA8C;AACrG,IAAA,MAAM,MAAA,GAAS,6BAAA,CAA8B,QAAA,EAAU,eAAe,CAAA;AAEtE,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB;AAAA,QACvB,GAAG,IAAA,CAAK,iBAAA;AAAA,QACR,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import { normalizeWalletAccountResult } from \"../interfaces\";\nimport type { GetConnectionStateResult } from \"./postMessage\";\n\nexport function normalizeConnectionStateResult(\n result: GetConnectionStateResult,\n): GetConnectionStateResult {\n if (!result.isAuthorized || !result.hasPasskey) {\n return { ...result, accounts: [], selectedAccount: null };\n }\n\n return normalizeWalletAccountResult(result);\n}\n","import type {\n InferSuccessfulPostMessageResponse,\n PostMessageEvent,\n PostMessageRequest,\n PostMessageResponse,\n} from './types/messages';\nimport {\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n} from './types/messages';\n\n/**\n * Allowed production origins for wallet iframe URLs.\n * Development builds additionally allow localhost, LAN, and Tailscale\n * origins so local HTTPS RP-ID testing can use the hosted wallet path.\n */\nconst PRODUCTION_IFRAME_ORIGINS = ['https://wallet.thru.org'];\n\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n if (typeof window === 'undefined') return false;\n\n const appHostname = window.location.hostname.toLowerCase();\n if (!isDevelopmentHostname(appHostname)) return false;\n\n return isDevelopmentHostname(url.hostname.toLowerCase());\n}\n\n/**\n * Validates that the iframe URL is from a trusted origin\n * @throws Error if the origin is not allowed\n */\nfunction validateIframeOrigin(iframeUrl: string): void {\n let url: URL;\n try {\n url = new URL(iframeUrl);\n } catch (error) {\n throw new Error(\n `Invalid iframe URL: ${iframeUrl}. URL must be a valid absolute URL.`\n );\n }\n\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_IFRAME_ORIGINS.includes(origin) || isAllowedDevelopmentOrigin(url);\n\n if (!isAllowed) {\n throw new Error(\n `Untrusted iframe origin: ${origin}. ` +\n `Only trusted wallet origins are allowed: ${PRODUCTION_IFRAME_ORIGINS.join(', ')}. ` +\n `Development builds also allow localhost, LAN, and Tailscale wallet origins. ` +\n `This security check prevents malicious websites from loading unauthorized wallet iframes.`\n );\n }\n}\n\n/**\n * Manages iframe lifecycle and postMessage communication\n * Handles creating, showing/hiding iframe, and message passing\n */\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private iframeOrigin: string;\n private frameId: string;\n private messageHandlers = new Map<string, (response: PostMessageResponse) => void>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readyPromise: Promise<void> | null = null;\n private displayMode: 'modal' | 'inline' = 'modal';\n private inlineContainer: HTMLElement | null = null;\n private visible = false;\n\n /**\n * Callback for event broadcasts from iframe (no request id)\n */\n public onEvent?: (eventType: string, payload: any) => void;\n\n constructor(iframeUrl: string) {\n // Validate origin before accepting the URL\n validateIframeOrigin(iframeUrl);\n\n this.iframeUrl = iframeUrl;\n this.iframeOrigin = new URL(iframeUrl).origin;\n /* Used to correlate postMessage traffic with the correct iframe instance.\n Important in dev (React Strict Mode) where iframes can be created twice. */\n this.frameId = createRequestId('frame');\n }\n\n private getIframeSrc(): string {\n const url = new URL(this.iframeUrl);\n url.searchParams.set('tn_frame_id', this.frameId);\n return url.toString();\n }\n\n /**\n * Create and inject iframe into DOM\n * Returns a promise that resolves when iframe is ready\n */\n async createIframe(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n\n this.readyPromise = (async () => {\n if (!this.iframe) {\n this.iframe = document.createElement('iframe');\n this.iframe.src = this.getIframeSrc();\n /* Allow WebAuthn in cross-origin iframe for passkey auth. */\n this.iframe.allow = 'publickey-credentials-get; publickey-credentials-create';\n this.applyIframeStyles();\n /* Keep hidden (but still load) until the wallet asks to show UI. */\n this.setVisibility(false);\n\n if (this.displayMode === 'inline' && this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n } else {\n document.body.appendChild(this.iframe);\n }\n\n // Set up message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n }\n\n await this.waitForReady();\n })().catch((error) => {\n this.readyPromise = null;\n throw error;\n });\n\n return this.readyPromise;\n }\n\n /**\n * Wait for iframe to send 'ready' signal\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n let readyHandler: (event: MessageEvent) => void;\n const cleanup = () => {\n if (resolved) {\n return;\n }\n resolved = true;\n window.removeEventListener('message', readyHandler);\n clearTimeout(timeout);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe ready timeout - wallet failed to load'));\n }, 10000);\n\n readyHandler = (event: MessageEvent) => {\n if (!this.isMessageFromIframe(event)) {\n return;\n }\n\n if (event.data?.type === IFRAME_READY_EVENT) {\n cleanup();\n resolve();\n }\n };\n\n window.addEventListener('message', readyHandler);\n });\n }\n\n /**\n * Mount iframe inline inside the provided container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineContainer = container;\n this.displayMode = 'inline';\n await this.createIframe();\n this.showInline();\n }\n\n /**\n * Show iframe inline (embedded in container).\n */\n showInline(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'inline';\n if (this.inlineContainer && this.iframe.parentElement !== this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe as a full-screen modal.\n */\n showModal(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'modal';\n if (this.iframe.parentElement !== document.body) {\n document.body.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe modal\n */\n show(): void {\n this.showModal();\n }\n\n /**\n * Hide iframe modal\n */\n hide(): void {\n this.setVisibility(false);\n }\n\n isInline(): boolean {\n return this.displayMode === 'inline';\n }\n\n private applyIframeStyles(): void {\n if (!this.iframe) {\n return;\n }\n\n if (this.displayMode === 'inline') {\n this.iframe.style.cssText = `\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 1;\n display: block;\n background: transparent;\n `;\n return;\n }\n\n this.iframe.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 999999;\n display: block;\n background: rgba(0, 0, 0, 0.5);\n `;\n }\n\n private setVisibility(visible: boolean): void {\n if (!this.iframe) {\n return;\n }\n this.visible = visible;\n this.iframe.style.opacity = visible ? '1' : '0';\n this.iframe.style.pointerEvents = visible ? 'auto' : 'none';\n this.iframe.style.visibility = visible ? 'visible' : 'hidden';\n }\n\n /**\n * Send message to iframe and wait for response\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n /* Ensure the iframe has navigated to the wallet origin before we try to\n postMessage to a strict targetOrigin. Otherwise the iframe can still be\n about:blank (same-origin with the dapp) and postMessage will throw. */\n if (this.readyPromise) {\n await this.readyPromise;\n } else {\n await this.createIframe();\n }\n\n if (!this.iframe?.contentWindow) {\n throw new Error('Iframe not initialized - call createIframe() first');\n }\n\n return new Promise<InferSuccessfulPostMessageResponse<TRequest>>((resolve, reject) => {\n /* CONNECT, signing, and account-management requests require a human click and can take minutes.\n Keep a longer timeout to avoid breaking \"inline connect button\" flows. */\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n const timeout = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n // Store handler for this request\n this.messageHandlers.set(request.id, (response: PostMessageResponse) => {\n clearTimeout(timeout);\n this.messageHandlers.delete(request.id);\n\n if (response.success) {\n resolve(response as InferSuccessfulPostMessageResponse<TRequest>);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n (error as any).code = response.error?.code;\n (error as any).data = response.error?.data;\n reject(error);\n }\n });\n\n // Send message to iframe\n this.iframe!.contentWindow!.postMessage(request, this.iframeOrigin);\n });\n }\n\n /**\n * Handle incoming messages from iframe\n */\n private handleMessage(event: MessageEvent): void {\n if (!this.isMessageFromIframe(event)) {\n return; // Ignore messages from other origins\n }\n\n const data = event.data;\n\n // Handle response to a specific request (has id)\n if (data.id && this.messageHandlers.has(data.id)) {\n const handler = this.messageHandlers.get(data.id);\n if (handler) {\n handler(data as PostMessageResponse);\n }\n return;\n }\n\n // Handle event broadcasts (type === 'event')\n if (data.type === POST_MESSAGE_EVENT_TYPE) {\n this.handleEvent(data as PostMessageEvent);\n }\n }\n\n /**\n * Handle event broadcasts from iframe\n */\n private handleEvent(data: PostMessageEvent): void {\n // Forward to EmbeddedProvider via callback\n if (this.onEvent) {\n this.onEvent(data.event, data.data);\n }\n }\n\n private isMessageFromIframe(event: MessageEvent): boolean {\n if (event.origin !== this.iframeOrigin) {\n return false;\n }\n\n const data = event.data as any;\n if (!data || data.frameId !== this.frameId) {\n return false;\n }\n\n /* Some browsers (notably Safari) can provide a null `event.source` for\n cross-origin postMessage events. Frame id + origin is sufficient. */\n if (!event.source) {\n return true;\n }\n\n if (this.iframe?.contentWindow && event.source !== this.iframe.contentWindow) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Destroy iframe and cleanup\n */\n destroy(): void {\n if (this.iframe) {\n this.iframe.remove();\n this.iframe = null;\n }\n\n this.readyPromise = null;\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.messageHandlers.clear();\n }\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../protocol\";\nimport type { EmbeddedProvider } from \"../EmbeddedProvider\";\nimport type { IframeManager } from \"../IframeManager\";\n\n/**\n * EmbeddedThruChain - postMessage-backed Thru chain adapter.\n */\nexport class EmbeddedThruChain implements IThruChain {\n private readonly iframeManager: IframeManager;\n private readonly provider: EmbeddedProvider;\n\n constructor(iframeManager: IframeManager, provider: EmbeddedProvider) {\n this.iframeManager = iframeManager;\n this.provider = provider;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: window.location.origin,\n });\n\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.iframeManager.show();\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: window.location.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.iframeManager.hide();\n }\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n} from '../interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from '../interfaces';\nimport {\n DEFAULT_IFRAME_URL,\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type ManageAccountsResult,\n type SelectAccountPayload,\n} from '../protocol';\nimport { IframeManager } from './IframeManager';\nimport { EmbeddedThruChain } from './chains/ThruChain';\n\nexport interface EmbeddedProviderConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\n/**\n * Main embedded provider class\n * Manages iframe lifecycle, connection state, and chain-specific interfaces\n */\nexport class EmbeddedProvider {\n private iframeManager: IframeManager;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private eventListeners = new Map<string, Set<Function>>();\n private inlineMode = false;\n constructor(config: EmbeddedProviderConfig) {\n const iframeUrl = config.iframeUrl || DEFAULT_IFRAME_URL;\n this.iframeManager = new IframeManager(iframeUrl);\n\n // Set up event forwarding from iframe\n this.iframeManager.onEvent = (eventType: string, payload: any) => {\n this.emit(eventType, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload && (payload.account as WalletAccount | undefined)) || null;\n this.refreshAccountCache(account ?? null);\n }\n };\n\n // Create chain instances\n const addressTypes = config.addressTypes || [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new EmbeddedThruChain(this.iframeManager, this);\n }\n }\n\n /**\n * Initialize the provider (must be called before use)\n * Creates iframe and waits for it to be ready\n */\n async initialize(): Promise<void> {\n await this.iframeManager.createIframe();\n }\n\n /**\n * Mount the wallet iframe inline in a container (for inline connect button).\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineMode = true;\n await this.iframeManager.mountInline(container);\n }\n\n /**\n * Connect to wallet\n * Shows iframe modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Emit connecting event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n\n try {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n const payload: ConnectRequestPayload = {};\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n // Emit success event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n\n // Hide iframe after successful connection\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n\n return result;\n } catch (error) {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: window.location.origin,\n });\n\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get accounts\n */\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n const knownAccount =\n this.accounts.find((acc) => acc.address === publicKey) ?? null;\n if (!knownAccount) {\n console.warn(\n \"[EmbeddedProvider] Selecting account not present in local cache\",\n );\n }\n const payload: SelectAccountPayload = { publicKey };\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: window.location.origin,\n });\n\n const account = response.result.account;\n\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult({\n accounts: response.result.accounts,\n selectedAccount: response.result.selectedAccount,\n });\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n if (this.selectedAccount) {\n this.emit(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, {\n account: this.selectedAccount,\n });\n }\n return result;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Get Thru chain API\n */\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n /**\n * Event emitter: on\n */\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: string, callback: Function): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: string, data?: any): void {\n this.eventListeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Get iframe manager (for chain implementations)\n * @internal\n */\n getIframeManager(): IframeManager {\n return this.iframeManager;\n }\n\n /**\n * Destroy provider and cleanup\n */\n destroy(): void {\n this.iframeManager.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n\n this.accounts = [account];\n this.selectedAccount = account;\n }\n\n private clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n}\n","import {\n AddressType,\n normalizeActiveWalletAccounts,\n} from './interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from './interfaces';\nimport { EmbeddedProvider } from './provider/EmbeddedProvider';\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n type ConnectMetadataInput,\n type ManageAccountsResult,\n} from './protocol';\nimport { createThruClient, Thru } from '@thru/sdk/client';\n\nexport interface BrowserSDKConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n rpcUrl?: string;\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\nexport type SDKEvent = 'connect' | 'disconnect' | 'lock' | 'error' | 'accountChanged';\n\nexport type EventCallback = (...args: any[]) => void;\n\n/**\n * Browser SDK - Main entry point for dApp developers\n * Wraps EmbeddedProvider with a clean, simple API\n */\nexport class BrowserSDK {\n private provider: EmbeddedProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n\n constructor(config: BrowserSDKConfig = {}) {\n this.provider = new EmbeddedProvider({\n iframeUrl: config.iframeUrl,\n addressTypes: config.addressTypes || [AddressType.THRU],\n });\n\n this.thruClient = createThruClient({\n baseUrl: config.rpcUrl,\n });\n\n // Forward provider events to SDK events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the SDK (creates iframe)\n * Must be called before using the SDK\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n await this.provider.initialize();\n this.initialized = true;\n }\n\n /**\n * Connect to wallet\n * Shows wallet modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Auto-initialize if not done yet\n if (!this.initialized) {\n await this.initialize();\n }\n\n if (this.connectInFlight) {\n return this.connectInFlight;\n }\n\n if (this.lastConnectResult && this.provider.isConnected()) {\n return this.lastConnectResult;\n }\n\n this.emit('connect', { status: 'connecting' });\n\n const inFlight = (async () => {\n try {\n const metadata = this.resolveMetadata(options?.metadata);\n const providerOptions = metadata ? { metadata } : undefined;\n const result = await this.provider.connect(providerOptions);\n this.lastConnectResult = result;\n this.emit('connect', result);\n return result;\n } catch (error) {\n this.emit('error', error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n /**\n * Mount the wallet iframe inline in a container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n await this.provider.mountInline(container);\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit('disconnect', {});\n this.lastConnectResult = null;\n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n /**\n * Get all accounts\n */\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n this.refreshCachedAccounts(accounts);\n return accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n const result = await this.provider.manageAccounts();\n this.refreshCachedAccounts(result.accounts, result.selectedAccount);\n this.emit('accountChanged', result.selectedAccount);\n return result;\n }\n\n /**\n * Get Thru chain API (iframe-backed signer)\n */\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n /**\n * Event emitter: on\n */\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Event emitter: once (listen once and auto-remove)\n */\n once(event: SDKEvent, callback: EventCallback): void {\n const wrappedCallback = (...args: any[]) => {\n callback(...args);\n this.off(event, wrappedCallback);\n };\n this.on(event, wrappedCallback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in SDK event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Set up event forwarding from provider to SDK\n */\n private setupEventForwarding(): void {\n // Forward all relevant provider events to SDK events\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.CONNECT, (data: any) => {\n // Already handled in connect() method\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data: any) => {\n this.emit('disconnect', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data: any) => {\n this.emit('error', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data: any) => {\n this.emit('lock', data);\n this.emit('disconnect', { reason: 'locked' });\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data: any) => {\n const account = data?.account ?? data;\n this.refreshCachedAccounts(this.provider.getAccounts(), account ?? null);\n this.emit('accountChanged', account);\n });\n }\n\n /**\n * Destroy SDK and cleanup\n */\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n }\n\n private resolveMetadata(input?: ConnectMetadataInput): ConnectMetadataInput | undefined {\n const defaultOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;\n if (!defaultOrigin && !input) {\n return undefined;\n }\n\n const appId = input?.appId || defaultOrigin;\n const appUrl = this.resolveAppUrl(defaultOrigin, input?.appUrl);\n const appName = input?.appName || this.deriveAppName(appUrl ?? appId);\n\n const metadata: ConnectMetadataInput = {};\n if (appId) metadata.appId = appId;\n if (appUrl) metadata.appUrl = appUrl;\n if (appName) metadata.appName = appName;\n if (input?.imageUrl) metadata.imageUrl = input.imageUrl;\n\n return metadata;\n }\n\n private resolveAppUrl(defaultOrigin?: string, providedUrl?: string): string | undefined {\n const candidate = providedUrl || defaultOrigin;\n if (!candidate) {\n return undefined;\n }\n\n try {\n const url = new URL(candidate, defaultOrigin);\n return url.toString();\n } catch {\n return defaultOrigin;\n }\n }\n\n private deriveAppName(source?: string): string | undefined {\n if (!source) {\n return undefined;\n }\n\n try {\n const hostname = new URL(source).hostname;\n return hostname || source;\n } catch {\n return source;\n }\n }\n\n public getThru(): Thru {\n return this.thruClient;\n }\n\n private refreshCachedAccounts(accounts: WalletAccount[], selectedAccount?: WalletAccount | null): void {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n\n if (this.lastConnectResult) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/interfaces/accounts.ts","../src/interfaces/types.ts","../src/protocol/postMessage.ts","../src/protocol/walletState.ts","../src/provider/IframeManager.ts","../src/provider/chains/ThruChain.ts","../src/provider/EmbeddedProvider.ts","../src/BrowserSDK.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import { normalizeWalletAccountResult } from \"../interfaces\";\nimport type { GetConnectionStateResult } from \"./postMessage\";\n\nexport function normalizeConnectionStateResult(\n result: GetConnectionStateResult,\n): GetConnectionStateResult {\n if (!result.isAuthorized || !result.hasPasskey) {\n return { ...result, accounts: [], selectedAccount: null };\n }\n\n return normalizeWalletAccountResult(result);\n}\n","import type {\n InferSuccessfulPostMessageResponse,\n PostMessageEvent,\n PostMessageRequest,\n PostMessageResponse,\n} from './types/messages';\nimport {\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n} from './types/messages';\n\n/**\n * Allowed production origins for wallet iframe URLs.\n * Development builds additionally allow localhost, LAN, and Tailscale\n * origins so local HTTPS RP-ID testing can use the hosted wallet path.\n */\nconst PRODUCTION_IFRAME_ORIGINS = ['https://wallet.thru.org'];\n\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\nconst PARENT_ORIGIN_SEARCH_PARAM = 'tn_parent_origin';\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n if (typeof window === 'undefined') return false;\n\n const appHostname = window.location.hostname.toLowerCase();\n if (!isDevelopmentHostname(appHostname)) return false;\n\n return isDevelopmentHostname(url.hostname.toLowerCase());\n}\n\n/**\n * Validates that the iframe URL is from a trusted origin\n * @throws Error if the origin is not allowed\n */\nfunction validateIframeOrigin(iframeUrl: string): void {\n let url: URL;\n try {\n url = new URL(iframeUrl);\n } catch (error) {\n throw new Error(\n `Invalid iframe URL: ${iframeUrl}. URL must be a valid absolute URL.`\n );\n }\n\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_IFRAME_ORIGINS.includes(origin) || isAllowedDevelopmentOrigin(url);\n\n if (!isAllowed) {\n throw new Error(\n `Untrusted iframe origin: ${origin}. ` +\n `Only trusted wallet origins are allowed: ${PRODUCTION_IFRAME_ORIGINS.join(', ')}. ` +\n `Development builds also allow localhost, LAN, and Tailscale wallet origins. ` +\n `This security check prevents malicious websites from loading unauthorized wallet iframes.`\n );\n }\n}\n\nfunction getCurrentWindowOrigin(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const origin = window.location.origin;\n if (!origin || origin === 'null') {\n return null;\n }\n\n return origin;\n}\n\n/**\n * Manages iframe lifecycle and postMessage communication\n * Handles creating, showing/hiding iframe, and message passing\n */\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private iframeOrigin: string;\n private frameId: string;\n private messageHandlers = new Map<string, (response: PostMessageResponse) => void>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readyPromise: Promise<void> | null = null;\n private displayMode: 'modal' | 'inline' = 'modal';\n private inlineContainer: HTMLElement | null = null;\n private visible = false;\n\n /**\n * Callback for event broadcasts from iframe (no request id)\n */\n public onEvent?: (eventType: string, payload: any) => void;\n\n constructor(iframeUrl: string) {\n // Validate origin before accepting the URL\n validateIframeOrigin(iframeUrl);\n\n this.iframeUrl = iframeUrl;\n this.iframeOrigin = new URL(iframeUrl).origin;\n /* Used to correlate postMessage traffic with the correct iframe instance.\n Important in dev (React Strict Mode) where iframes can be created twice. */\n this.frameId = createRequestId('frame');\n }\n\n private getIframeSrc(): string {\n const url = new URL(this.iframeUrl);\n url.searchParams.set('tn_frame_id', this.frameId);\n const parentOrigin = getCurrentWindowOrigin();\n if (parentOrigin) {\n url.searchParams.set(PARENT_ORIGIN_SEARCH_PARAM, parentOrigin);\n }\n return url.toString();\n }\n\n /**\n * Create and inject iframe into DOM\n * Returns a promise that resolves when iframe is ready\n */\n async createIframe(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n\n this.readyPromise = (async () => {\n if (!this.iframe) {\n this.iframe = document.createElement('iframe');\n this.iframe.src = this.getIframeSrc();\n /* Allow WebAuthn in cross-origin iframe for passkey auth. */\n this.iframe.allow = 'publickey-credentials-get; publickey-credentials-create';\n this.applyIframeStyles();\n /* Keep hidden (but still load) until the wallet asks to show UI. */\n this.setVisibility(false);\n\n if (this.displayMode === 'inline' && this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n } else {\n document.body.appendChild(this.iframe);\n }\n\n // Set up message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n }\n\n await this.waitForReady();\n })().catch((error) => {\n this.readyPromise = null;\n throw error;\n });\n\n return this.readyPromise;\n }\n\n /**\n * Wait for iframe to send 'ready' signal\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n let readyHandler: (event: MessageEvent) => void;\n const cleanup = () => {\n if (resolved) {\n return;\n }\n resolved = true;\n window.removeEventListener('message', readyHandler);\n clearTimeout(timeout);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe ready timeout - wallet failed to load'));\n }, 10000);\n\n readyHandler = (event: MessageEvent) => {\n if (!this.isMessageFromIframe(event)) {\n return;\n }\n\n if (event.data?.type === IFRAME_READY_EVENT) {\n cleanup();\n resolve();\n }\n };\n\n window.addEventListener('message', readyHandler);\n });\n }\n\n /**\n * Mount iframe inline inside the provided container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineContainer = container;\n this.displayMode = 'inline';\n await this.createIframe();\n this.showInline();\n }\n\n /**\n * Show iframe inline (embedded in container).\n */\n showInline(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'inline';\n if (this.inlineContainer && this.iframe.parentElement !== this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe as a full-screen modal.\n */\n showModal(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'modal';\n if (this.iframe.parentElement !== document.body) {\n document.body.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe modal\n */\n show(): void {\n this.showModal();\n }\n\n /**\n * Hide iframe modal\n */\n hide(): void {\n this.setVisibility(false);\n }\n\n isInline(): boolean {\n return this.displayMode === 'inline';\n }\n\n private applyIframeStyles(): void {\n if (!this.iframe) {\n return;\n }\n\n if (this.displayMode === 'inline') {\n this.iframe.style.cssText = `\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 1;\n display: block;\n background: transparent;\n `;\n return;\n }\n\n this.iframe.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 999999;\n display: block;\n background: rgba(0, 0, 0, 0.5);\n `;\n }\n\n private setVisibility(visible: boolean): void {\n if (!this.iframe) {\n return;\n }\n this.visible = visible;\n this.iframe.style.opacity = visible ? '1' : '0';\n this.iframe.style.pointerEvents = visible ? 'auto' : 'none';\n this.iframe.style.visibility = visible ? 'visible' : 'hidden';\n }\n\n /**\n * Send message to iframe and wait for response\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n /* Ensure the iframe has navigated to the wallet origin before we try to\n postMessage to a strict targetOrigin. Otherwise the iframe can still be\n about:blank (same-origin with the dapp) and postMessage will throw. */\n if (this.readyPromise) {\n await this.readyPromise;\n } else {\n await this.createIframe();\n }\n\n if (!this.iframe?.contentWindow) {\n throw new Error('Iframe not initialized - call createIframe() first');\n }\n\n return new Promise<InferSuccessfulPostMessageResponse<TRequest>>((resolve, reject) => {\n /* CONNECT, signing, and account-management requests require a human click and can take minutes.\n Keep a longer timeout to avoid breaking \"inline connect button\" flows. */\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n const timeout = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n // Store handler for this request\n this.messageHandlers.set(request.id, (response: PostMessageResponse) => {\n clearTimeout(timeout);\n this.messageHandlers.delete(request.id);\n\n if (response.success) {\n resolve(response as InferSuccessfulPostMessageResponse<TRequest>);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n (error as any).code = response.error?.code;\n (error as any).data = response.error?.data;\n reject(error);\n }\n });\n\n // Send message to iframe\n this.iframe!.contentWindow!.postMessage(request, this.iframeOrigin);\n });\n }\n\n /**\n * Handle incoming messages from iframe\n */\n private handleMessage(event: MessageEvent): void {\n if (!this.isMessageFromIframe(event)) {\n return; // Ignore messages from other origins\n }\n\n const data = event.data;\n\n // Handle response to a specific request (has id)\n if (data.id && this.messageHandlers.has(data.id)) {\n const handler = this.messageHandlers.get(data.id);\n if (handler) {\n handler(data as PostMessageResponse);\n }\n return;\n }\n\n // Handle event broadcasts (type === 'event')\n if (data.type === POST_MESSAGE_EVENT_TYPE) {\n this.handleEvent(data as PostMessageEvent);\n }\n }\n\n /**\n * Handle event broadcasts from iframe\n */\n private handleEvent(data: PostMessageEvent): void {\n // Forward to EmbeddedProvider via callback\n if (this.onEvent) {\n this.onEvent(data.event, data.data);\n }\n }\n\n private isMessageFromIframe(event: MessageEvent): boolean {\n if (event.origin !== this.iframeOrigin) {\n return false;\n }\n\n const data = event.data as any;\n if (!data || data.frameId !== this.frameId) {\n return false;\n }\n\n /* Some browsers (notably Safari) can provide a null `event.source` for\n cross-origin postMessage events. Frame id + origin is sufficient. */\n if (!event.source) {\n return true;\n }\n\n if (this.iframe?.contentWindow && event.source !== this.iframe.contentWindow) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Destroy iframe and cleanup\n */\n destroy(): void {\n if (this.iframe) {\n this.iframe.remove();\n this.iframe = null;\n }\n\n this.readyPromise = null;\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.messageHandlers.clear();\n }\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../protocol\";\nimport type { EmbeddedProvider } from \"../EmbeddedProvider\";\nimport type { IframeManager } from \"../IframeManager\";\n\n/**\n * EmbeddedThruChain - postMessage-backed Thru chain adapter.\n */\nexport class EmbeddedThruChain implements IThruChain {\n private readonly iframeManager: IframeManager;\n private readonly provider: EmbeddedProvider;\n\n constructor(iframeManager: IframeManager, provider: EmbeddedProvider) {\n this.iframeManager = iframeManager;\n this.provider = provider;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: window.location.origin,\n });\n\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.iframeManager.show();\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: window.location.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.iframeManager.hide();\n }\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n} from '../interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from '../interfaces';\nimport {\n DEFAULT_IFRAME_URL,\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type ManageAccountsResult,\n type SelectAccountPayload,\n} from '../protocol';\nimport { IframeManager } from './IframeManager';\nimport { EmbeddedThruChain } from './chains/ThruChain';\n\nexport interface EmbeddedProviderConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\n/**\n * Main embedded provider class\n * Manages iframe lifecycle, connection state, and chain-specific interfaces\n */\nexport class EmbeddedProvider {\n private iframeManager: IframeManager;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private eventListeners = new Map<string, Set<Function>>();\n private inlineMode = false;\n constructor(config: EmbeddedProviderConfig) {\n const iframeUrl = config.iframeUrl || DEFAULT_IFRAME_URL;\n this.iframeManager = new IframeManager(iframeUrl);\n\n // Set up event forwarding from iframe\n this.iframeManager.onEvent = (eventType: string, payload: any) => {\n this.emit(eventType, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload && (payload.account as WalletAccount | undefined)) || null;\n this.refreshAccountCache(account ?? null);\n }\n };\n\n // Create chain instances\n const addressTypes = config.addressTypes || [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new EmbeddedThruChain(this.iframeManager, this);\n }\n }\n\n /**\n * Initialize the provider (must be called before use)\n * Creates iframe and waits for it to be ready\n */\n async initialize(): Promise<void> {\n await this.iframeManager.createIframe();\n }\n\n /**\n * Mount the wallet iframe inline in a container (for inline connect button).\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineMode = true;\n await this.iframeManager.mountInline(container);\n }\n\n /**\n * Connect to wallet\n * Shows iframe modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Emit connecting event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n\n try {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n const payload: ConnectRequestPayload = {};\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n // Emit success event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n\n // Hide iframe after successful connection\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n\n return result;\n } catch (error) {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: window.location.origin,\n });\n\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get accounts\n */\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n const knownAccount =\n this.accounts.find((acc) => acc.address === publicKey) ?? null;\n if (!knownAccount) {\n console.warn(\n \"[EmbeddedProvider] Selecting account not present in local cache\",\n );\n }\n const payload: SelectAccountPayload = { publicKey };\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: window.location.origin,\n });\n\n const account = response.result.account;\n\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult({\n accounts: response.result.accounts,\n selectedAccount: response.result.selectedAccount,\n });\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n if (this.selectedAccount) {\n this.emit(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, {\n account: this.selectedAccount,\n });\n }\n return result;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Get Thru chain API\n */\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n /**\n * Event emitter: on\n */\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: string, callback: Function): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: string, data?: any): void {\n this.eventListeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Get iframe manager (for chain implementations)\n * @internal\n */\n getIframeManager(): IframeManager {\n return this.iframeManager;\n }\n\n /**\n * Destroy provider and cleanup\n */\n destroy(): void {\n this.iframeManager.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n\n this.accounts = [account];\n this.selectedAccount = account;\n }\n\n private clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n}\n","import {\n AddressType,\n normalizeActiveWalletAccounts,\n} from './interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from './interfaces';\nimport { EmbeddedProvider } from './provider/EmbeddedProvider';\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n type ConnectMetadataInput,\n type ManageAccountsResult,\n} from './protocol';\nimport { createThruClient, Thru } from '@thru/sdk/client';\n\nexport interface BrowserSDKConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n rpcUrl?: string;\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\nexport type SDKEvent = 'connect' | 'disconnect' | 'lock' | 'error' | 'accountChanged';\n\nexport type EventCallback = (...args: any[]) => void;\n\n/**\n * Browser SDK - Main entry point for dApp developers\n * Wraps EmbeddedProvider with a clean, simple API\n */\nexport class BrowserSDK {\n private provider: EmbeddedProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n\n constructor(config: BrowserSDKConfig = {}) {\n this.provider = new EmbeddedProvider({\n iframeUrl: config.iframeUrl,\n addressTypes: config.addressTypes || [AddressType.THRU],\n });\n\n this.thruClient = createThruClient({\n baseUrl: config.rpcUrl,\n });\n\n // Forward provider events to SDK events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the SDK (creates iframe)\n * Must be called before using the SDK\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n await this.provider.initialize();\n this.initialized = true;\n }\n\n /**\n * Connect to wallet\n * Shows wallet modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Auto-initialize if not done yet\n if (!this.initialized) {\n await this.initialize();\n }\n\n if (this.connectInFlight) {\n return this.connectInFlight;\n }\n\n if (this.lastConnectResult && this.provider.isConnected()) {\n return this.lastConnectResult;\n }\n\n this.emit('connect', { status: 'connecting' });\n\n const inFlight = (async () => {\n try {\n const metadata = this.resolveMetadata(options?.metadata);\n const providerOptions = metadata ? { metadata } : undefined;\n const result = await this.provider.connect(providerOptions);\n this.lastConnectResult = result;\n this.emit('connect', result);\n return result;\n } catch (error) {\n this.emit('error', error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n /**\n * Mount the wallet iframe inline in a container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n await this.provider.mountInline(container);\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit('disconnect', {});\n this.lastConnectResult = null;\n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n /**\n * Get all accounts\n */\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n this.refreshCachedAccounts(accounts);\n return accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n const result = await this.provider.manageAccounts();\n this.refreshCachedAccounts(result.accounts, result.selectedAccount);\n this.emit('accountChanged', result.selectedAccount);\n return result;\n }\n\n /**\n * Get Thru chain API (iframe-backed signer)\n */\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n /**\n * Event emitter: on\n */\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Event emitter: once (listen once and auto-remove)\n */\n once(event: SDKEvent, callback: EventCallback): void {\n const wrappedCallback = (...args: any[]) => {\n callback(...args);\n this.off(event, wrappedCallback);\n };\n this.on(event, wrappedCallback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in SDK event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Set up event forwarding from provider to SDK\n */\n private setupEventForwarding(): void {\n // Forward all relevant provider events to SDK events\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.CONNECT, (data: any) => {\n // Already handled in connect() method\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data: any) => {\n this.emit('disconnect', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data: any) => {\n this.emit('error', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data: any) => {\n this.emit('lock', data);\n this.emit('disconnect', { reason: 'locked' });\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data: any) => {\n const account = data?.account ?? data;\n this.refreshCachedAccounts(this.provider.getAccounts(), account ?? null);\n this.emit('accountChanged', account);\n });\n }\n\n /**\n * Destroy SDK and cleanup\n */\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n }\n\n private resolveMetadata(input?: ConnectMetadataInput): ConnectMetadataInput | undefined {\n const defaultOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;\n if (!defaultOrigin && !input) {\n return undefined;\n }\n\n const appId = input?.appId || defaultOrigin;\n const appUrl = this.resolveAppUrl(defaultOrigin, input?.appUrl);\n const appName = input?.appName || this.deriveAppName(appUrl ?? appId);\n\n const metadata: ConnectMetadataInput = {};\n if (appId) metadata.appId = appId;\n if (appUrl) metadata.appUrl = appUrl;\n if (appName) metadata.appName = appName;\n if (input?.imageUrl) metadata.imageUrl = input.imageUrl;\n\n return metadata;\n }\n\n private resolveAppUrl(defaultOrigin?: string, providedUrl?: string): string | undefined {\n const candidate = providedUrl || defaultOrigin;\n if (!candidate) {\n return undefined;\n }\n\n try {\n const url = new URL(candidate, defaultOrigin);\n return url.toString();\n } catch {\n return defaultOrigin;\n }\n }\n\n private deriveAppName(source?: string): string | undefined {\n if (!source) {\n return undefined;\n }\n\n try {\n const hostname = new URL(source).hostname;\n return hostname || source;\n } catch {\n return source;\n }\n }\n\n public getThru(): Thru {\n return this.thruClient;\n }\n\n private refreshCachedAccounts(accounts: WalletAccount[], selectedAccount?: WalletAccount | null): void {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n\n if (this.lastConnectResult) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n }\n }\n}\n"]}
package/dist/react.js CHANGED
@@ -83,6 +83,7 @@ var ErrorCode = {
83
83
  var PRODUCTION_IFRAME_ORIGINS = ["https://wallet.thru.org"];
84
84
  var SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1e3;
85
85
  var FAST_REQUEST_TIMEOUT_MS = 30 * 1e3;
86
+ var PARENT_ORIGIN_SEARCH_PARAM = "tn_parent_origin";
86
87
  var SLOW_REQUEST_TYPES = /* @__PURE__ */ new Set([
87
88
  POST_MESSAGE_REQUEST_TYPES.CONNECT,
88
89
  POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,
@@ -124,6 +125,16 @@ function validateIframeOrigin(iframeUrl) {
124
125
  );
125
126
  }
126
127
  }
128
+ function getCurrentWindowOrigin() {
129
+ if (typeof window === "undefined") {
130
+ return null;
131
+ }
132
+ const origin = window.location.origin;
133
+ if (!origin || origin === "null") {
134
+ return null;
135
+ }
136
+ return origin;
137
+ }
127
138
  var IframeManager = class {
128
139
  constructor(iframeUrl) {
129
140
  this.iframe = null;
@@ -141,6 +152,10 @@ var IframeManager = class {
141
152
  getIframeSrc() {
142
153
  const url = new URL(this.iframeUrl);
143
154
  url.searchParams.set("tn_frame_id", this.frameId);
155
+ const parentOrigin = getCurrentWindowOrigin();
156
+ if (parentOrigin) {
157
+ url.searchParams.set(PARENT_ORIGIN_SEARCH_PARAM, parentOrigin);
158
+ }
144
159
  return url.toString();
145
160
  }
146
161
  /**
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interfaces/accounts.ts","../src/interfaces/types.ts","../src/protocol/postMessage.ts","../src/provider/IframeManager.ts","../src/provider/chains/ThruChain.ts","../src/provider/EmbeddedProvider.ts","../src/BrowserSDK.ts","../src/react/ThruContext.ts","../src/react/ThruProvider.tsx","../src/react/hooks/useThru.ts","../src/react/hooks/useAccounts.ts","../src/react/hooks/useWallet.ts"],"names":["useEffect"],"mappings":"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","file":"react.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import type {\n InferSuccessfulPostMessageResponse,\n PostMessageEvent,\n PostMessageRequest,\n PostMessageResponse,\n} from './types/messages';\nimport {\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n} from './types/messages';\n\n/**\n * Allowed production origins for wallet iframe URLs.\n * Development builds additionally allow localhost, LAN, and Tailscale\n * origins so local HTTPS RP-ID testing can use the hosted wallet path.\n */\nconst PRODUCTION_IFRAME_ORIGINS = ['https://wallet.thru.org'];\n\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n if (typeof window === 'undefined') return false;\n\n const appHostname = window.location.hostname.toLowerCase();\n if (!isDevelopmentHostname(appHostname)) return false;\n\n return isDevelopmentHostname(url.hostname.toLowerCase());\n}\n\n/**\n * Validates that the iframe URL is from a trusted origin\n * @throws Error if the origin is not allowed\n */\nfunction validateIframeOrigin(iframeUrl: string): void {\n let url: URL;\n try {\n url = new URL(iframeUrl);\n } catch (error) {\n throw new Error(\n `Invalid iframe URL: ${iframeUrl}. URL must be a valid absolute URL.`\n );\n }\n\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_IFRAME_ORIGINS.includes(origin) || isAllowedDevelopmentOrigin(url);\n\n if (!isAllowed) {\n throw new Error(\n `Untrusted iframe origin: ${origin}. ` +\n `Only trusted wallet origins are allowed: ${PRODUCTION_IFRAME_ORIGINS.join(', ')}. ` +\n `Development builds also allow localhost, LAN, and Tailscale wallet origins. ` +\n `This security check prevents malicious websites from loading unauthorized wallet iframes.`\n );\n }\n}\n\n/**\n * Manages iframe lifecycle and postMessage communication\n * Handles creating, showing/hiding iframe, and message passing\n */\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private iframeOrigin: string;\n private frameId: string;\n private messageHandlers = new Map<string, (response: PostMessageResponse) => void>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readyPromise: Promise<void> | null = null;\n private displayMode: 'modal' | 'inline' = 'modal';\n private inlineContainer: HTMLElement | null = null;\n private visible = false;\n\n /**\n * Callback for event broadcasts from iframe (no request id)\n */\n public onEvent?: (eventType: string, payload: any) => void;\n\n constructor(iframeUrl: string) {\n // Validate origin before accepting the URL\n validateIframeOrigin(iframeUrl);\n\n this.iframeUrl = iframeUrl;\n this.iframeOrigin = new URL(iframeUrl).origin;\n /* Used to correlate postMessage traffic with the correct iframe instance.\n Important in dev (React Strict Mode) where iframes can be created twice. */\n this.frameId = createRequestId('frame');\n }\n\n private getIframeSrc(): string {\n const url = new URL(this.iframeUrl);\n url.searchParams.set('tn_frame_id', this.frameId);\n return url.toString();\n }\n\n /**\n * Create and inject iframe into DOM\n * Returns a promise that resolves when iframe is ready\n */\n async createIframe(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n\n this.readyPromise = (async () => {\n if (!this.iframe) {\n this.iframe = document.createElement('iframe');\n this.iframe.src = this.getIframeSrc();\n /* Allow WebAuthn in cross-origin iframe for passkey auth. */\n this.iframe.allow = 'publickey-credentials-get; publickey-credentials-create';\n this.applyIframeStyles();\n /* Keep hidden (but still load) until the wallet asks to show UI. */\n this.setVisibility(false);\n\n if (this.displayMode === 'inline' && this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n } else {\n document.body.appendChild(this.iframe);\n }\n\n // Set up message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n }\n\n await this.waitForReady();\n })().catch((error) => {\n this.readyPromise = null;\n throw error;\n });\n\n return this.readyPromise;\n }\n\n /**\n * Wait for iframe to send 'ready' signal\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n let readyHandler: (event: MessageEvent) => void;\n const cleanup = () => {\n if (resolved) {\n return;\n }\n resolved = true;\n window.removeEventListener('message', readyHandler);\n clearTimeout(timeout);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe ready timeout - wallet failed to load'));\n }, 10000);\n\n readyHandler = (event: MessageEvent) => {\n if (!this.isMessageFromIframe(event)) {\n return;\n }\n\n if (event.data?.type === IFRAME_READY_EVENT) {\n cleanup();\n resolve();\n }\n };\n\n window.addEventListener('message', readyHandler);\n });\n }\n\n /**\n * Mount iframe inline inside the provided container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineContainer = container;\n this.displayMode = 'inline';\n await this.createIframe();\n this.showInline();\n }\n\n /**\n * Show iframe inline (embedded in container).\n */\n showInline(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'inline';\n if (this.inlineContainer && this.iframe.parentElement !== this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe as a full-screen modal.\n */\n showModal(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'modal';\n if (this.iframe.parentElement !== document.body) {\n document.body.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe modal\n */\n show(): void {\n this.showModal();\n }\n\n /**\n * Hide iframe modal\n */\n hide(): void {\n this.setVisibility(false);\n }\n\n isInline(): boolean {\n return this.displayMode === 'inline';\n }\n\n private applyIframeStyles(): void {\n if (!this.iframe) {\n return;\n }\n\n if (this.displayMode === 'inline') {\n this.iframe.style.cssText = `\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 1;\n display: block;\n background: transparent;\n `;\n return;\n }\n\n this.iframe.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 999999;\n display: block;\n background: rgba(0, 0, 0, 0.5);\n `;\n }\n\n private setVisibility(visible: boolean): void {\n if (!this.iframe) {\n return;\n }\n this.visible = visible;\n this.iframe.style.opacity = visible ? '1' : '0';\n this.iframe.style.pointerEvents = visible ? 'auto' : 'none';\n this.iframe.style.visibility = visible ? 'visible' : 'hidden';\n }\n\n /**\n * Send message to iframe and wait for response\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n /* Ensure the iframe has navigated to the wallet origin before we try to\n postMessage to a strict targetOrigin. Otherwise the iframe can still be\n about:blank (same-origin with the dapp) and postMessage will throw. */\n if (this.readyPromise) {\n await this.readyPromise;\n } else {\n await this.createIframe();\n }\n\n if (!this.iframe?.contentWindow) {\n throw new Error('Iframe not initialized - call createIframe() first');\n }\n\n return new Promise<InferSuccessfulPostMessageResponse<TRequest>>((resolve, reject) => {\n /* CONNECT, signing, and account-management requests require a human click and can take minutes.\n Keep a longer timeout to avoid breaking \"inline connect button\" flows. */\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n const timeout = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n // Store handler for this request\n this.messageHandlers.set(request.id, (response: PostMessageResponse) => {\n clearTimeout(timeout);\n this.messageHandlers.delete(request.id);\n\n if (response.success) {\n resolve(response as InferSuccessfulPostMessageResponse<TRequest>);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n (error as any).code = response.error?.code;\n (error as any).data = response.error?.data;\n reject(error);\n }\n });\n\n // Send message to iframe\n this.iframe!.contentWindow!.postMessage(request, this.iframeOrigin);\n });\n }\n\n /**\n * Handle incoming messages from iframe\n */\n private handleMessage(event: MessageEvent): void {\n if (!this.isMessageFromIframe(event)) {\n return; // Ignore messages from other origins\n }\n\n const data = event.data;\n\n // Handle response to a specific request (has id)\n if (data.id && this.messageHandlers.has(data.id)) {\n const handler = this.messageHandlers.get(data.id);\n if (handler) {\n handler(data as PostMessageResponse);\n }\n return;\n }\n\n // Handle event broadcasts (type === 'event')\n if (data.type === POST_MESSAGE_EVENT_TYPE) {\n this.handleEvent(data as PostMessageEvent);\n }\n }\n\n /**\n * Handle event broadcasts from iframe\n */\n private handleEvent(data: PostMessageEvent): void {\n // Forward to EmbeddedProvider via callback\n if (this.onEvent) {\n this.onEvent(data.event, data.data);\n }\n }\n\n private isMessageFromIframe(event: MessageEvent): boolean {\n if (event.origin !== this.iframeOrigin) {\n return false;\n }\n\n const data = event.data as any;\n if (!data || data.frameId !== this.frameId) {\n return false;\n }\n\n /* Some browsers (notably Safari) can provide a null `event.source` for\n cross-origin postMessage events. Frame id + origin is sufficient. */\n if (!event.source) {\n return true;\n }\n\n if (this.iframe?.contentWindow && event.source !== this.iframe.contentWindow) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Destroy iframe and cleanup\n */\n destroy(): void {\n if (this.iframe) {\n this.iframe.remove();\n this.iframe = null;\n }\n\n this.readyPromise = null;\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.messageHandlers.clear();\n }\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../protocol\";\nimport type { EmbeddedProvider } from \"../EmbeddedProvider\";\nimport type { IframeManager } from \"../IframeManager\";\n\n/**\n * EmbeddedThruChain - postMessage-backed Thru chain adapter.\n */\nexport class EmbeddedThruChain implements IThruChain {\n private readonly iframeManager: IframeManager;\n private readonly provider: EmbeddedProvider;\n\n constructor(iframeManager: IframeManager, provider: EmbeddedProvider) {\n this.iframeManager = iframeManager;\n this.provider = provider;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: window.location.origin,\n });\n\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.iframeManager.show();\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: window.location.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.iframeManager.hide();\n }\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n} from '../interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from '../interfaces';\nimport {\n DEFAULT_IFRAME_URL,\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type ManageAccountsResult,\n type SelectAccountPayload,\n} from '../protocol';\nimport { IframeManager } from './IframeManager';\nimport { EmbeddedThruChain } from './chains/ThruChain';\n\nexport interface EmbeddedProviderConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\n/**\n * Main embedded provider class\n * Manages iframe lifecycle, connection state, and chain-specific interfaces\n */\nexport class EmbeddedProvider {\n private iframeManager: IframeManager;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private eventListeners = new Map<string, Set<Function>>();\n private inlineMode = false;\n constructor(config: EmbeddedProviderConfig) {\n const iframeUrl = config.iframeUrl || DEFAULT_IFRAME_URL;\n this.iframeManager = new IframeManager(iframeUrl);\n\n // Set up event forwarding from iframe\n this.iframeManager.onEvent = (eventType: string, payload: any) => {\n this.emit(eventType, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload && (payload.account as WalletAccount | undefined)) || null;\n this.refreshAccountCache(account ?? null);\n }\n };\n\n // Create chain instances\n const addressTypes = config.addressTypes || [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new EmbeddedThruChain(this.iframeManager, this);\n }\n }\n\n /**\n * Initialize the provider (must be called before use)\n * Creates iframe and waits for it to be ready\n */\n async initialize(): Promise<void> {\n await this.iframeManager.createIframe();\n }\n\n /**\n * Mount the wallet iframe inline in a container (for inline connect button).\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineMode = true;\n await this.iframeManager.mountInline(container);\n }\n\n /**\n * Connect to wallet\n * Shows iframe modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Emit connecting event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n\n try {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n const payload: ConnectRequestPayload = {};\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n // Emit success event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n\n // Hide iframe after successful connection\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n\n return result;\n } catch (error) {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: window.location.origin,\n });\n\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get accounts\n */\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n const knownAccount =\n this.accounts.find((acc) => acc.address === publicKey) ?? null;\n if (!knownAccount) {\n console.warn(\n \"[EmbeddedProvider] Selecting account not present in local cache\",\n );\n }\n const payload: SelectAccountPayload = { publicKey };\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: window.location.origin,\n });\n\n const account = response.result.account;\n\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult({\n accounts: response.result.accounts,\n selectedAccount: response.result.selectedAccount,\n });\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n if (this.selectedAccount) {\n this.emit(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, {\n account: this.selectedAccount,\n });\n }\n return result;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Get Thru chain API\n */\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n /**\n * Event emitter: on\n */\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: string, callback: Function): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: string, data?: any): void {\n this.eventListeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Get iframe manager (for chain implementations)\n * @internal\n */\n getIframeManager(): IframeManager {\n return this.iframeManager;\n }\n\n /**\n * Destroy provider and cleanup\n */\n destroy(): void {\n this.iframeManager.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n\n this.accounts = [account];\n this.selectedAccount = account;\n }\n\n private clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n}\n","import {\n AddressType,\n normalizeActiveWalletAccounts,\n} from './interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from './interfaces';\nimport { EmbeddedProvider } from './provider/EmbeddedProvider';\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n type ConnectMetadataInput,\n type ManageAccountsResult,\n} from './protocol';\nimport { createThruClient, Thru } from '@thru/sdk/client';\n\nexport interface BrowserSDKConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n rpcUrl?: string;\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\nexport type SDKEvent = 'connect' | 'disconnect' | 'lock' | 'error' | 'accountChanged';\n\nexport type EventCallback = (...args: any[]) => void;\n\n/**\n * Browser SDK - Main entry point for dApp developers\n * Wraps EmbeddedProvider with a clean, simple API\n */\nexport class BrowserSDK {\n private provider: EmbeddedProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n\n constructor(config: BrowserSDKConfig = {}) {\n this.provider = new EmbeddedProvider({\n iframeUrl: config.iframeUrl,\n addressTypes: config.addressTypes || [AddressType.THRU],\n });\n\n this.thruClient = createThruClient({\n baseUrl: config.rpcUrl,\n });\n\n // Forward provider events to SDK events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the SDK (creates iframe)\n * Must be called before using the SDK\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n await this.provider.initialize();\n this.initialized = true;\n }\n\n /**\n * Connect to wallet\n * Shows wallet modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Auto-initialize if not done yet\n if (!this.initialized) {\n await this.initialize();\n }\n\n if (this.connectInFlight) {\n return this.connectInFlight;\n }\n\n if (this.lastConnectResult && this.provider.isConnected()) {\n return this.lastConnectResult;\n }\n\n this.emit('connect', { status: 'connecting' });\n\n const inFlight = (async () => {\n try {\n const metadata = this.resolveMetadata(options?.metadata);\n const providerOptions = metadata ? { metadata } : undefined;\n const result = await this.provider.connect(providerOptions);\n this.lastConnectResult = result;\n this.emit('connect', result);\n return result;\n } catch (error) {\n this.emit('error', error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n /**\n * Mount the wallet iframe inline in a container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n await this.provider.mountInline(container);\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit('disconnect', {});\n this.lastConnectResult = null;\n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n /**\n * Get all accounts\n */\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n this.refreshCachedAccounts(accounts);\n return accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n const result = await this.provider.manageAccounts();\n this.refreshCachedAccounts(result.accounts, result.selectedAccount);\n this.emit('accountChanged', result.selectedAccount);\n return result;\n }\n\n /**\n * Get Thru chain API (iframe-backed signer)\n */\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n /**\n * Event emitter: on\n */\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Event emitter: once (listen once and auto-remove)\n */\n once(event: SDKEvent, callback: EventCallback): void {\n const wrappedCallback = (...args: any[]) => {\n callback(...args);\n this.off(event, wrappedCallback);\n };\n this.on(event, wrappedCallback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in SDK event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Set up event forwarding from provider to SDK\n */\n private setupEventForwarding(): void {\n // Forward all relevant provider events to SDK events\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.CONNECT, (data: any) => {\n // Already handled in connect() method\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data: any) => {\n this.emit('disconnect', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data: any) => {\n this.emit('error', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data: any) => {\n this.emit('lock', data);\n this.emit('disconnect', { reason: 'locked' });\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data: any) => {\n const account = data?.account ?? data;\n this.refreshCachedAccounts(this.provider.getAccounts(), account ?? null);\n this.emit('accountChanged', account);\n });\n }\n\n /**\n * Destroy SDK and cleanup\n */\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n }\n\n private resolveMetadata(input?: ConnectMetadataInput): ConnectMetadataInput | undefined {\n const defaultOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;\n if (!defaultOrigin && !input) {\n return undefined;\n }\n\n const appId = input?.appId || defaultOrigin;\n const appUrl = this.resolveAppUrl(defaultOrigin, input?.appUrl);\n const appName = input?.appName || this.deriveAppName(appUrl ?? appId);\n\n const metadata: ConnectMetadataInput = {};\n if (appId) metadata.appId = appId;\n if (appUrl) metadata.appUrl = appUrl;\n if (appName) metadata.appName = appName;\n if (input?.imageUrl) metadata.imageUrl = input.imageUrl;\n\n return metadata;\n }\n\n private resolveAppUrl(defaultOrigin?: string, providedUrl?: string): string | undefined {\n const candidate = providedUrl || defaultOrigin;\n if (!candidate) {\n return undefined;\n }\n\n try {\n const url = new URL(candidate, defaultOrigin);\n return url.toString();\n } catch {\n return defaultOrigin;\n }\n }\n\n private deriveAppName(source?: string): string | undefined {\n if (!source) {\n return undefined;\n }\n\n try {\n const hostname = new URL(source).hostname;\n return hostname || source;\n } catch {\n return source;\n }\n }\n\n public getThru(): Thru {\n return this.thruClient;\n }\n\n private refreshCachedAccounts(accounts: WalletAccount[], selectedAccount?: WalletAccount | null): void {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n\n if (this.lastConnectResult) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n }\n }\n}\n","import { BrowserSDK } from \"../BrowserSDK\";\nimport type { WalletAccount } from \"../interfaces\";\nimport type { ManageAccountsResult } from \"../protocol\";\nimport { Thru } from \"@thru/sdk/client\";\nimport { createContext } from \"react\";\n\nexport interface ThruContextValue {\n wallet: BrowserSDK | null;\n isConnected: boolean;\n accounts: WalletAccount[];\n isConnecting: boolean;\n error: Error | null;\n thru: Thru | null;\n selectedAccount: WalletAccount | null;\n selectAccount: (account: WalletAccount) => Promise<void>;\n manageAccounts: () => Promise<ManageAccountsResult>;\n}\n\nconst defaultContextValue: ThruContextValue = {\n wallet: null,\n isConnected: false,\n accounts: [],\n isConnecting: false,\n error: null,\n thru: null,\n selectedAccount: null,\n selectAccount: async () => undefined,\n manageAccounts: async () => ({ accounts: [], selectedAccount: null }),\n};\n\nexport const ThruContext = createContext<ThruContextValue>(defaultContextValue);\n","'use client';\n\nimport {\n normalizeActiveWalletAccounts,\n normalizeWalletAccountResult,\n type WalletAccount,\n} from '../interfaces';\nimport { BrowserSDK, type BrowserSDKConfig } from '../BrowserSDK';\nimport type { ManageAccountsResult } from '../protocol';\nimport type { Thru } from '@thru/sdk/client';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { ThruContext } from './ThruContext';\n\nexport interface ThruProviderProps {\n children: ReactNode;\n config: BrowserSDKConfig;\n}\n\n/**\n * ThruProvider - React context provider for Thru Wallet SDK\n * Wraps the BrowserSDK and exposes state via context\n */\nexport function ThruProvider({ children, config }: ThruProviderProps) {\n const [sdk, setSdk] = useState<BrowserSDK | null>(null);\n const [thru, setThru] = useState<Thru | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [accounts, setAccounts] = useState<WalletAccount[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [selectedAccount, setSelectedAccount] = useState<WalletAccount | null>(null);\n\n useEffect(() => {\n // Create SDK instance\n const sdkInstance = new BrowserSDK(config);\n setSdk(sdkInstance);\n setThru(sdkInstance.getThru());\n\n const updateAccountsFromSdk = () => {\n const active = normalizeActiveWalletAccounts(\n sdkInstance.getAccounts(),\n sdkInstance.getSelectedAccount()\n );\n setAccounts(active.accounts);\n setSelectedAccount(active.selectedAccount);\n };\n\n const updateSelectedAccount = (account?: WalletAccount | null) => {\n const active = normalizeActiveWalletAccounts(\n sdkInstance.getAccounts(),\n account ?? sdkInstance.getSelectedAccount()\n );\n setAccounts(active.accounts);\n setSelectedAccount(active.selectedAccount);\n };\n\n sdkInstance.initialize().catch((err) => {\n console.error('Failed to initialize SDK:', err);\n setError(err);\n });\n\n // Listen to SDK events\n const handleConnect = (result: any) => {\n // Check if this is the initial \"connecting\" status or actual connection\n if (result.status === 'connecting') {\n setIsConnecting(true);\n setError(null);\n } else {\n setIsConnected(true);\n updateAccountsFromSdk();\n setIsConnecting(false);\n setError(null);\n updateSelectedAccount(result?.selectedAccount ?? null);\n }\n };\n\n const resetData = () => {\n setIsConnected(false);\n setAccounts([]);\n setIsConnecting(false);\n setSelectedAccount(null);\n };\n\n const handleDisconnect = () => {\n resetData();\n };\n\n const handleError = (err: any) => {\n setError(err.error || new Error('Unknown error'));\n setIsConnecting(false);\n };\n\n const handleLock = () => {\n resetData();\n };\n\n const handleAccountChanged = (account: WalletAccount | null | undefined) => {\n updateAccountsFromSdk();\n updateSelectedAccount(account ?? undefined);\n };\n\n sdkInstance.on('connect', handleConnect);\n sdkInstance.on('disconnect', handleDisconnect);\n sdkInstance.on('error', handleError);\n sdkInstance.on('lock', handleLock);\n sdkInstance.on('accountChanged', handleAccountChanged);\n\n // Cleanup on unmount\n return () => {\n sdkInstance.off('connect', handleConnect);\n sdkInstance.off('disconnect', handleDisconnect);\n sdkInstance.off('error', handleError);\n sdkInstance.off('lock', handleLock);\n sdkInstance.off('accountChanged', handleAccountChanged);\n sdkInstance.destroy();\n };\n }, []); // Empty dependency array - only create SDK once\n\n const selectAccount = useCallback(async (account: WalletAccount) => {\n if (!sdk) {\n throw new Error('BrowserSDK not initialized');\n }\n\n try {\n const updated = await sdk.selectAccount(account.address);\n const active = normalizeActiveWalletAccounts(sdk.getAccounts(), updated);\n setSelectedAccount(active.selectedAccount);\n setAccounts(active.accounts);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to select account'));\n throw err;\n }\n }, [sdk]);\n\n const manageAccounts = useCallback(async (): Promise<ManageAccountsResult> => {\n if (!sdk) {\n throw new Error('BrowserSDK not initialized');\n }\n\n try {\n const result = await sdk.manageAccounts();\n const activeResult = normalizeWalletAccountResult(result);\n setSelectedAccount(activeResult.selectedAccount);\n setAccounts(activeResult.accounts);\n setIsConnected(Boolean(activeResult.selectedAccount));\n return activeResult;\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to manage accounts'));\n throw err;\n }\n }, [sdk]);\n\n return (\n <ThruContext.Provider\n value={{\n thru,\n wallet: sdk,\n isConnected,\n accounts,\n isConnecting,\n error,\n selectedAccount,\n selectAccount,\n manageAccounts,\n }}\n >\n {children}\n </ThruContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport { ThruContext } from \"../ThruContext\";\n\n/**\n * useThru - Access the Thru SDK context\n * Must be used within a ThruProvider\n */\nexport function useThru() {\n const context = useContext(ThruContext);\n return context;\n}","import type { WalletAccount } from '../../interfaces';\nimport { useEffect, useMemo } from 'react';\nimport { useThru } from './useThru';\n\nexport interface UseAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n isConnected: boolean;\n isConnecting: boolean;\n}\n\nexport interface UseAccountsOptions {\n onAccountSelect?: (account: WalletAccount) => void;\n}\n\n/**\n * useAccounts - Exposes connected wallet accounts and selection helpers.\n */\nexport function useAccounts(options?: UseAccountsOptions): UseAccountsResult {\n const { accounts, selectedAccount, isConnected, isConnecting } = useThru();\n const externalOnSelect = options?.onAccountSelect;\n\n useEffect(() => {\n if (selectedAccount) {\n externalOnSelect?.(selectedAccount);\n }\n }, [externalOnSelect, selectedAccount]);\n\n return useMemo(\n () => ({\n accounts,\n selectedAccount,\n isConnected,\n isConnecting,\n }),\n [accounts, selectedAccount, isConnected, isConnecting]\n );\n}\n","import { BrowserSDK, ConnectOptions } from '../../BrowserSDK';\nimport type { ConnectResult, IThruChain } from '../../interfaces';\nimport type { ManageAccountsResult } from '../../protocol';\nimport { useEffect, useRef } from 'react';\nimport { useThru } from './useThru';\n\nfunction waitForWallet(getWallet: () => BrowserSDK | null, timeout = 5000, interval = 100): Promise<BrowserSDK> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const check = () => {\n const sdk = getWallet();\n if (sdk) return resolve(sdk);\n if (Date.now() - start > timeout) return reject(new Error('SDK not initialized in time'));\n setTimeout(check, interval);\n };\n check();\n });\n}\n\n/**\n * useThruChain - Hook for accessing the Thru chain API exposed by the Browser SDK.\n * Returns the chain instance (if available) and a boolean indicating readiness.\n */\nexport function useWallet() {\n const {\n wallet,\n isConnected,\n accounts,\n selectedAccount,\n selectAccount,\n manageAccounts,\n isConnecting,\n } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const disconnect = async (): Promise<void> => {\n if (!wallet) {\n throw new Error('SDK not initialized');\n }\n await wallet.disconnect();\n };\n\n const connect = async (options?: ConnectOptions): Promise<ConnectResult> => {\n try {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n const result = await readySdk.connect(options);\n return result;\n } catch (err) {\n const error = err as Error;\n throw error;\n }\n };\n\n const mountInline = async (container: HTMLElement): Promise<void> => {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n await readySdk.mountInline(container);\n };\n\n const openAccountSettings = async (): Promise<ManageAccountsResult> => {\n return manageAccounts();\n };\n\n return {\n wallet: wallet?.thru as IThruChain | undefined,\n accounts,\n connect,\n disconnect,\n mountInline,\n manageAccounts: openAccountSettings,\n isConnected: isConnected && !!wallet,\n isConnecting,\n selectedAccount,\n selectAccount,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/interfaces/accounts.ts","../src/interfaces/types.ts","../src/protocol/postMessage.ts","../src/provider/IframeManager.ts","../src/provider/chains/ThruChain.ts","../src/provider/EmbeddedProvider.ts","../src/BrowserSDK.ts","../src/react/ThruContext.ts","../src/react/ThruProvider.tsx","../src/react/hooks/useThru.ts","../src/react/hooks/useAccounts.ts","../src/react/hooks/useWallet.ts"],"names":["useEffect"],"mappings":"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","file":"react.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import type {\n InferSuccessfulPostMessageResponse,\n PostMessageEvent,\n PostMessageRequest,\n PostMessageResponse,\n} from './types/messages';\nimport {\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n} from './types/messages';\n\n/**\n * Allowed production origins for wallet iframe URLs.\n * Development builds additionally allow localhost, LAN, and Tailscale\n * origins so local HTTPS RP-ID testing can use the hosted wallet path.\n */\nconst PRODUCTION_IFRAME_ORIGINS = ['https://wallet.thru.org'];\n\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\nconst PARENT_ORIGIN_SEARCH_PARAM = 'tn_parent_origin';\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n if (typeof window === 'undefined') return false;\n\n const appHostname = window.location.hostname.toLowerCase();\n if (!isDevelopmentHostname(appHostname)) return false;\n\n return isDevelopmentHostname(url.hostname.toLowerCase());\n}\n\n/**\n * Validates that the iframe URL is from a trusted origin\n * @throws Error if the origin is not allowed\n */\nfunction validateIframeOrigin(iframeUrl: string): void {\n let url: URL;\n try {\n url = new URL(iframeUrl);\n } catch (error) {\n throw new Error(\n `Invalid iframe URL: ${iframeUrl}. URL must be a valid absolute URL.`\n );\n }\n\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_IFRAME_ORIGINS.includes(origin) || isAllowedDevelopmentOrigin(url);\n\n if (!isAllowed) {\n throw new Error(\n `Untrusted iframe origin: ${origin}. ` +\n `Only trusted wallet origins are allowed: ${PRODUCTION_IFRAME_ORIGINS.join(', ')}. ` +\n `Development builds also allow localhost, LAN, and Tailscale wallet origins. ` +\n `This security check prevents malicious websites from loading unauthorized wallet iframes.`\n );\n }\n}\n\nfunction getCurrentWindowOrigin(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const origin = window.location.origin;\n if (!origin || origin === 'null') {\n return null;\n }\n\n return origin;\n}\n\n/**\n * Manages iframe lifecycle and postMessage communication\n * Handles creating, showing/hiding iframe, and message passing\n */\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private iframeOrigin: string;\n private frameId: string;\n private messageHandlers = new Map<string, (response: PostMessageResponse) => void>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readyPromise: Promise<void> | null = null;\n private displayMode: 'modal' | 'inline' = 'modal';\n private inlineContainer: HTMLElement | null = null;\n private visible = false;\n\n /**\n * Callback for event broadcasts from iframe (no request id)\n */\n public onEvent?: (eventType: string, payload: any) => void;\n\n constructor(iframeUrl: string) {\n // Validate origin before accepting the URL\n validateIframeOrigin(iframeUrl);\n\n this.iframeUrl = iframeUrl;\n this.iframeOrigin = new URL(iframeUrl).origin;\n /* Used to correlate postMessage traffic with the correct iframe instance.\n Important in dev (React Strict Mode) where iframes can be created twice. */\n this.frameId = createRequestId('frame');\n }\n\n private getIframeSrc(): string {\n const url = new URL(this.iframeUrl);\n url.searchParams.set('tn_frame_id', this.frameId);\n const parentOrigin = getCurrentWindowOrigin();\n if (parentOrigin) {\n url.searchParams.set(PARENT_ORIGIN_SEARCH_PARAM, parentOrigin);\n }\n return url.toString();\n }\n\n /**\n * Create and inject iframe into DOM\n * Returns a promise that resolves when iframe is ready\n */\n async createIframe(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n\n this.readyPromise = (async () => {\n if (!this.iframe) {\n this.iframe = document.createElement('iframe');\n this.iframe.src = this.getIframeSrc();\n /* Allow WebAuthn in cross-origin iframe for passkey auth. */\n this.iframe.allow = 'publickey-credentials-get; publickey-credentials-create';\n this.applyIframeStyles();\n /* Keep hidden (but still load) until the wallet asks to show UI. */\n this.setVisibility(false);\n\n if (this.displayMode === 'inline' && this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n } else {\n document.body.appendChild(this.iframe);\n }\n\n // Set up message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n }\n\n await this.waitForReady();\n })().catch((error) => {\n this.readyPromise = null;\n throw error;\n });\n\n return this.readyPromise;\n }\n\n /**\n * Wait for iframe to send 'ready' signal\n */\n private waitForReady(): Promise<void> {\n return new Promise((resolve, reject) => {\n let resolved = false;\n let readyHandler: (event: MessageEvent) => void;\n const cleanup = () => {\n if (resolved) {\n return;\n }\n resolved = true;\n window.removeEventListener('message', readyHandler);\n clearTimeout(timeout);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe ready timeout - wallet failed to load'));\n }, 10000);\n\n readyHandler = (event: MessageEvent) => {\n if (!this.isMessageFromIframe(event)) {\n return;\n }\n\n if (event.data?.type === IFRAME_READY_EVENT) {\n cleanup();\n resolve();\n }\n };\n\n window.addEventListener('message', readyHandler);\n });\n }\n\n /**\n * Mount iframe inline inside the provided container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineContainer = container;\n this.displayMode = 'inline';\n await this.createIframe();\n this.showInline();\n }\n\n /**\n * Show iframe inline (embedded in container).\n */\n showInline(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'inline';\n if (this.inlineContainer && this.iframe.parentElement !== this.inlineContainer) {\n this.inlineContainer.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe as a full-screen modal.\n */\n showModal(): void {\n if (!this.iframe) {\n return;\n }\n this.displayMode = 'modal';\n if (this.iframe.parentElement !== document.body) {\n document.body.appendChild(this.iframe);\n }\n this.applyIframeStyles();\n this.setVisibility(true);\n }\n\n /**\n * Show iframe modal\n */\n show(): void {\n this.showModal();\n }\n\n /**\n * Hide iframe modal\n */\n hide(): void {\n this.setVisibility(false);\n }\n\n isInline(): boolean {\n return this.displayMode === 'inline';\n }\n\n private applyIframeStyles(): void {\n if (!this.iframe) {\n return;\n }\n\n if (this.displayMode === 'inline') {\n this.iframe.style.cssText = `\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 1;\n display: block;\n background: transparent;\n `;\n return;\n }\n\n this.iframe.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n z-index: 999999;\n display: block;\n background: rgba(0, 0, 0, 0.5);\n `;\n }\n\n private setVisibility(visible: boolean): void {\n if (!this.iframe) {\n return;\n }\n this.visible = visible;\n this.iframe.style.opacity = visible ? '1' : '0';\n this.iframe.style.pointerEvents = visible ? 'auto' : 'none';\n this.iframe.style.visibility = visible ? 'visible' : 'hidden';\n }\n\n /**\n * Send message to iframe and wait for response\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n /* Ensure the iframe has navigated to the wallet origin before we try to\n postMessage to a strict targetOrigin. Otherwise the iframe can still be\n about:blank (same-origin with the dapp) and postMessage will throw. */\n if (this.readyPromise) {\n await this.readyPromise;\n } else {\n await this.createIframe();\n }\n\n if (!this.iframe?.contentWindow) {\n throw new Error('Iframe not initialized - call createIframe() first');\n }\n\n return new Promise<InferSuccessfulPostMessageResponse<TRequest>>((resolve, reject) => {\n /* CONNECT, signing, and account-management requests require a human click and can take minutes.\n Keep a longer timeout to avoid breaking \"inline connect button\" flows. */\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n const timeout = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n // Store handler for this request\n this.messageHandlers.set(request.id, (response: PostMessageResponse) => {\n clearTimeout(timeout);\n this.messageHandlers.delete(request.id);\n\n if (response.success) {\n resolve(response as InferSuccessfulPostMessageResponse<TRequest>);\n } else {\n const error = new Error(response.error?.message || 'Unknown error');\n (error as any).code = response.error?.code;\n (error as any).data = response.error?.data;\n reject(error);\n }\n });\n\n // Send message to iframe\n this.iframe!.contentWindow!.postMessage(request, this.iframeOrigin);\n });\n }\n\n /**\n * Handle incoming messages from iframe\n */\n private handleMessage(event: MessageEvent): void {\n if (!this.isMessageFromIframe(event)) {\n return; // Ignore messages from other origins\n }\n\n const data = event.data;\n\n // Handle response to a specific request (has id)\n if (data.id && this.messageHandlers.has(data.id)) {\n const handler = this.messageHandlers.get(data.id);\n if (handler) {\n handler(data as PostMessageResponse);\n }\n return;\n }\n\n // Handle event broadcasts (type === 'event')\n if (data.type === POST_MESSAGE_EVENT_TYPE) {\n this.handleEvent(data as PostMessageEvent);\n }\n }\n\n /**\n * Handle event broadcasts from iframe\n */\n private handleEvent(data: PostMessageEvent): void {\n // Forward to EmbeddedProvider via callback\n if (this.onEvent) {\n this.onEvent(data.event, data.data);\n }\n }\n\n private isMessageFromIframe(event: MessageEvent): boolean {\n if (event.origin !== this.iframeOrigin) {\n return false;\n }\n\n const data = event.data as any;\n if (!data || data.frameId !== this.frameId) {\n return false;\n }\n\n /* Some browsers (notably Safari) can provide a null `event.source` for\n cross-origin postMessage events. Frame id + origin is sufficient. */\n if (!event.source) {\n return true;\n }\n\n if (this.iframe?.contentWindow && event.source !== this.iframe.contentWindow) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Destroy iframe and cleanup\n */\n destroy(): void {\n if (this.iframe) {\n this.iframe.remove();\n this.iframe = null;\n }\n\n this.readyPromise = null;\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.messageHandlers.clear();\n }\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../protocol\";\nimport type { EmbeddedProvider } from \"../EmbeddedProvider\";\nimport type { IframeManager } from \"../IframeManager\";\n\n/**\n * EmbeddedThruChain - postMessage-backed Thru chain adapter.\n */\nexport class EmbeddedThruChain implements IThruChain {\n private readonly iframeManager: IframeManager;\n private readonly provider: EmbeddedProvider;\n\n constructor(iframeManager: IframeManager, provider: EmbeddedProvider) {\n this.iframeManager = iframeManager;\n this.provider = provider;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: window.location.origin,\n });\n\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.iframeManager.show();\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: window.location.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.iframeManager.hide();\n }\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n} from '../interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from '../interfaces';\nimport {\n DEFAULT_IFRAME_URL,\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type ManageAccountsResult,\n type SelectAccountPayload,\n} from '../protocol';\nimport { IframeManager } from './IframeManager';\nimport { EmbeddedThruChain } from './chains/ThruChain';\n\nexport interface EmbeddedProviderConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\n/**\n * Main embedded provider class\n * Manages iframe lifecycle, connection state, and chain-specific interfaces\n */\nexport class EmbeddedProvider {\n private iframeManager: IframeManager;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private eventListeners = new Map<string, Set<Function>>();\n private inlineMode = false;\n constructor(config: EmbeddedProviderConfig) {\n const iframeUrl = config.iframeUrl || DEFAULT_IFRAME_URL;\n this.iframeManager = new IframeManager(iframeUrl);\n\n // Set up event forwarding from iframe\n this.iframeManager.onEvent = (eventType: string, payload: any) => {\n this.emit(eventType, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload && (payload.account as WalletAccount | undefined)) || null;\n this.refreshAccountCache(account ?? null);\n }\n };\n\n // Create chain instances\n const addressTypes = config.addressTypes || [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new EmbeddedThruChain(this.iframeManager, this);\n }\n }\n\n /**\n * Initialize the provider (must be called before use)\n * Creates iframe and waits for it to be ready\n */\n async initialize(): Promise<void> {\n await this.iframeManager.createIframe();\n }\n\n /**\n * Mount the wallet iframe inline in a container (for inline connect button).\n */\n async mountInline(container: HTMLElement): Promise<void> {\n this.inlineMode = true;\n await this.iframeManager.mountInline(container);\n }\n\n /**\n * Connect to wallet\n * Shows iframe modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Emit connecting event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n\n try {\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n const payload: ConnectRequestPayload = {};\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n // Emit success event\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n\n // Hide iframe after successful connection\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n\n return result;\n } catch (error) {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: window.location.origin,\n });\n\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get accounts\n */\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n const knownAccount =\n this.accounts.find((acc) => acc.address === publicKey) ?? null;\n if (!knownAccount) {\n console.warn(\n \"[EmbeddedProvider] Selecting account not present in local cache\",\n );\n }\n const payload: SelectAccountPayload = { publicKey };\n\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: window.location.origin,\n });\n\n const account = response.result.account;\n\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) {\n throw new Error(\"Wallet not connected\");\n }\n\n if (this.inlineMode) {\n this.iframeManager.showInline();\n } else {\n this.iframeManager.showModal();\n }\n\n try {\n const response = await this.iframeManager.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: window.location.origin,\n });\n\n const result = normalizeWalletAccountResult({\n accounts: response.result.accounts,\n selectedAccount: response.result.selectedAccount,\n });\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n if (this.selectedAccount) {\n this.emit(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, {\n account: this.selectedAccount,\n });\n }\n return result;\n } finally {\n if (!this.inlineMode) {\n this.iframeManager.hide();\n }\n }\n }\n\n /**\n * Get Thru chain API\n */\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n /**\n * Event emitter: on\n */\n on(event: string, callback: Function): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: string, callback: Function): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: string, data?: any): void {\n this.eventListeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Get iframe manager (for chain implementations)\n * @internal\n */\n getIframeManager(): IframeManager {\n return this.iframeManager;\n }\n\n /**\n * Destroy provider and cleanup\n */\n destroy(): void {\n this.iframeManager.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n\n this.accounts = [account];\n this.selectedAccount = account;\n }\n\n private clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n}\n","import {\n AddressType,\n normalizeActiveWalletAccounts,\n} from './interfaces';\nimport type {\n AddressType as AddressTypeValue,\n ConnectResult,\n IThruChain,\n WalletAccount,\n} from './interfaces';\nimport { EmbeddedProvider } from './provider/EmbeddedProvider';\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n type ConnectMetadataInput,\n type ManageAccountsResult,\n} from './protocol';\nimport { createThruClient, Thru } from '@thru/sdk/client';\n\nexport interface BrowserSDKConfig {\n iframeUrl?: string;\n addressTypes?: AddressTypeValue[];\n rpcUrl?: string;\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n}\n\nexport type SDKEvent = 'connect' | 'disconnect' | 'lock' | 'error' | 'accountChanged';\n\nexport type EventCallback = (...args: any[]) => void;\n\n/**\n * Browser SDK - Main entry point for dApp developers\n * Wraps EmbeddedProvider with a clean, simple API\n */\nexport class BrowserSDK {\n private provider: EmbeddedProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n\n constructor(config: BrowserSDKConfig = {}) {\n this.provider = new EmbeddedProvider({\n iframeUrl: config.iframeUrl,\n addressTypes: config.addressTypes || [AddressType.THRU],\n });\n\n this.thruClient = createThruClient({\n baseUrl: config.rpcUrl,\n });\n\n // Forward provider events to SDK events\n this.setupEventForwarding();\n }\n\n /**\n * Initialize the SDK (creates iframe)\n * Must be called before using the SDK\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n await this.provider.initialize();\n this.initialized = true;\n }\n\n /**\n * Connect to wallet\n * Shows wallet modal and requests connection\n */\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n // Auto-initialize if not done yet\n if (!this.initialized) {\n await this.initialize();\n }\n\n if (this.connectInFlight) {\n return this.connectInFlight;\n }\n\n if (this.lastConnectResult && this.provider.isConnected()) {\n return this.lastConnectResult;\n }\n\n this.emit('connect', { status: 'connecting' });\n\n const inFlight = (async () => {\n try {\n const metadata = this.resolveMetadata(options?.metadata);\n const providerOptions = metadata ? { metadata } : undefined;\n const result = await this.provider.connect(providerOptions);\n this.lastConnectResult = result;\n this.emit('connect', result);\n return result;\n } catch (error) {\n this.emit('error', error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n /**\n * Mount the wallet iframe inline in a container.\n */\n async mountInline(container: HTMLElement): Promise<void> {\n await this.provider.mountInline(container);\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit('disconnect', {});\n this.lastConnectResult = null;\n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n /**\n * Get all accounts\n */\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n this.refreshCachedAccounts(accounts);\n return accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n const result = await this.provider.manageAccounts();\n this.refreshCachedAccounts(result.accounts, result.selectedAccount);\n this.emit('accountChanged', result.selectedAccount);\n return result;\n }\n\n /**\n * Get Thru chain API (iframe-backed signer)\n */\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n /**\n * Event emitter: on\n */\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n /**\n * Event emitter: off\n */\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n /**\n * Event emitter: once (listen once and auto-remove)\n */\n once(event: SDKEvent, callback: EventCallback): void {\n const wrappedCallback = (...args: any[]) => {\n callback(...args);\n this.off(event, wrappedCallback);\n };\n this.on(event, wrappedCallback);\n }\n\n /**\n * Emit event to all listeners\n */\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach(callback => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in SDK event listener for ${event}:`, error);\n }\n });\n }\n\n /**\n * Set up event forwarding from provider to SDK\n */\n private setupEventForwarding(): void {\n // Forward all relevant provider events to SDK events\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.CONNECT, (data: any) => {\n // Already handled in connect() method\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data: any) => {\n this.emit('disconnect', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data: any) => {\n this.emit('error', data);\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data: any) => {\n this.emit('lock', data);\n this.emit('disconnect', { reason: 'locked' });\n });\n\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data: any) => {\n const account = data?.account ?? data;\n this.refreshCachedAccounts(this.provider.getAccounts(), account ?? null);\n this.emit('accountChanged', account);\n });\n }\n\n /**\n * Destroy SDK and cleanup\n */\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n }\n\n private resolveMetadata(input?: ConnectMetadataInput): ConnectMetadataInput | undefined {\n const defaultOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;\n if (!defaultOrigin && !input) {\n return undefined;\n }\n\n const appId = input?.appId || defaultOrigin;\n const appUrl = this.resolveAppUrl(defaultOrigin, input?.appUrl);\n const appName = input?.appName || this.deriveAppName(appUrl ?? appId);\n\n const metadata: ConnectMetadataInput = {};\n if (appId) metadata.appId = appId;\n if (appUrl) metadata.appUrl = appUrl;\n if (appName) metadata.appName = appName;\n if (input?.imageUrl) metadata.imageUrl = input.imageUrl;\n\n return metadata;\n }\n\n private resolveAppUrl(defaultOrigin?: string, providedUrl?: string): string | undefined {\n const candidate = providedUrl || defaultOrigin;\n if (!candidate) {\n return undefined;\n }\n\n try {\n const url = new URL(candidate, defaultOrigin);\n return url.toString();\n } catch {\n return defaultOrigin;\n }\n }\n\n private deriveAppName(source?: string): string | undefined {\n if (!source) {\n return undefined;\n }\n\n try {\n const hostname = new URL(source).hostname;\n return hostname || source;\n } catch {\n return source;\n }\n }\n\n public getThru(): Thru {\n return this.thruClient;\n }\n\n private refreshCachedAccounts(accounts: WalletAccount[], selectedAccount?: WalletAccount | null): void {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n\n if (this.lastConnectResult) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n }\n }\n}\n","import { BrowserSDK } from \"../BrowserSDK\";\nimport type { WalletAccount } from \"../interfaces\";\nimport type { ManageAccountsResult } from \"../protocol\";\nimport { Thru } from \"@thru/sdk/client\";\nimport { createContext } from \"react\";\n\nexport interface ThruContextValue {\n wallet: BrowserSDK | null;\n isConnected: boolean;\n accounts: WalletAccount[];\n isConnecting: boolean;\n error: Error | null;\n thru: Thru | null;\n selectedAccount: WalletAccount | null;\n selectAccount: (account: WalletAccount) => Promise<void>;\n manageAccounts: () => Promise<ManageAccountsResult>;\n}\n\nconst defaultContextValue: ThruContextValue = {\n wallet: null,\n isConnected: false,\n accounts: [],\n isConnecting: false,\n error: null,\n thru: null,\n selectedAccount: null,\n selectAccount: async () => undefined,\n manageAccounts: async () => ({ accounts: [], selectedAccount: null }),\n};\n\nexport const ThruContext = createContext<ThruContextValue>(defaultContextValue);\n","'use client';\n\nimport {\n normalizeActiveWalletAccounts,\n normalizeWalletAccountResult,\n type WalletAccount,\n} from '../interfaces';\nimport { BrowserSDK, type BrowserSDKConfig } from '../BrowserSDK';\nimport type { ManageAccountsResult } from '../protocol';\nimport type { Thru } from '@thru/sdk/client';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { ThruContext } from './ThruContext';\n\nexport interface ThruProviderProps {\n children: ReactNode;\n config: BrowserSDKConfig;\n}\n\n/**\n * ThruProvider - React context provider for Thru Wallet SDK\n * Wraps the BrowserSDK and exposes state via context\n */\nexport function ThruProvider({ children, config }: ThruProviderProps) {\n const [sdk, setSdk] = useState<BrowserSDK | null>(null);\n const [thru, setThru] = useState<Thru | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [accounts, setAccounts] = useState<WalletAccount[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [selectedAccount, setSelectedAccount] = useState<WalletAccount | null>(null);\n\n useEffect(() => {\n // Create SDK instance\n const sdkInstance = new BrowserSDK(config);\n setSdk(sdkInstance);\n setThru(sdkInstance.getThru());\n\n const updateAccountsFromSdk = () => {\n const active = normalizeActiveWalletAccounts(\n sdkInstance.getAccounts(),\n sdkInstance.getSelectedAccount()\n );\n setAccounts(active.accounts);\n setSelectedAccount(active.selectedAccount);\n };\n\n const updateSelectedAccount = (account?: WalletAccount | null) => {\n const active = normalizeActiveWalletAccounts(\n sdkInstance.getAccounts(),\n account ?? sdkInstance.getSelectedAccount()\n );\n setAccounts(active.accounts);\n setSelectedAccount(active.selectedAccount);\n };\n\n sdkInstance.initialize().catch((err) => {\n console.error('Failed to initialize SDK:', err);\n setError(err);\n });\n\n // Listen to SDK events\n const handleConnect = (result: any) => {\n // Check if this is the initial \"connecting\" status or actual connection\n if (result.status === 'connecting') {\n setIsConnecting(true);\n setError(null);\n } else {\n setIsConnected(true);\n updateAccountsFromSdk();\n setIsConnecting(false);\n setError(null);\n updateSelectedAccount(result?.selectedAccount ?? null);\n }\n };\n\n const resetData = () => {\n setIsConnected(false);\n setAccounts([]);\n setIsConnecting(false);\n setSelectedAccount(null);\n };\n\n const handleDisconnect = () => {\n resetData();\n };\n\n const handleError = (err: any) => {\n setError(err.error || new Error('Unknown error'));\n setIsConnecting(false);\n };\n\n const handleLock = () => {\n resetData();\n };\n\n const handleAccountChanged = (account: WalletAccount | null | undefined) => {\n updateAccountsFromSdk();\n updateSelectedAccount(account ?? undefined);\n };\n\n sdkInstance.on('connect', handleConnect);\n sdkInstance.on('disconnect', handleDisconnect);\n sdkInstance.on('error', handleError);\n sdkInstance.on('lock', handleLock);\n sdkInstance.on('accountChanged', handleAccountChanged);\n\n // Cleanup on unmount\n return () => {\n sdkInstance.off('connect', handleConnect);\n sdkInstance.off('disconnect', handleDisconnect);\n sdkInstance.off('error', handleError);\n sdkInstance.off('lock', handleLock);\n sdkInstance.off('accountChanged', handleAccountChanged);\n sdkInstance.destroy();\n };\n }, []); // Empty dependency array - only create SDK once\n\n const selectAccount = useCallback(async (account: WalletAccount) => {\n if (!sdk) {\n throw new Error('BrowserSDK not initialized');\n }\n\n try {\n const updated = await sdk.selectAccount(account.address);\n const active = normalizeActiveWalletAccounts(sdk.getAccounts(), updated);\n setSelectedAccount(active.selectedAccount);\n setAccounts(active.accounts);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to select account'));\n throw err;\n }\n }, [sdk]);\n\n const manageAccounts = useCallback(async (): Promise<ManageAccountsResult> => {\n if (!sdk) {\n throw new Error('BrowserSDK not initialized');\n }\n\n try {\n const result = await sdk.manageAccounts();\n const activeResult = normalizeWalletAccountResult(result);\n setSelectedAccount(activeResult.selectedAccount);\n setAccounts(activeResult.accounts);\n setIsConnected(Boolean(activeResult.selectedAccount));\n return activeResult;\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to manage accounts'));\n throw err;\n }\n }, [sdk]);\n\n return (\n <ThruContext.Provider\n value={{\n thru,\n wallet: sdk,\n isConnected,\n accounts,\n isConnecting,\n error,\n selectedAccount,\n selectAccount,\n manageAccounts,\n }}\n >\n {children}\n </ThruContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport { ThruContext } from \"../ThruContext\";\n\n/**\n * useThru - Access the Thru SDK context\n * Must be used within a ThruProvider\n */\nexport function useThru() {\n const context = useContext(ThruContext);\n return context;\n}","import type { WalletAccount } from '../../interfaces';\nimport { useEffect, useMemo } from 'react';\nimport { useThru } from './useThru';\n\nexport interface UseAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n isConnected: boolean;\n isConnecting: boolean;\n}\n\nexport interface UseAccountsOptions {\n onAccountSelect?: (account: WalletAccount) => void;\n}\n\n/**\n * useAccounts - Exposes connected wallet accounts and selection helpers.\n */\nexport function useAccounts(options?: UseAccountsOptions): UseAccountsResult {\n const { accounts, selectedAccount, isConnected, isConnecting } = useThru();\n const externalOnSelect = options?.onAccountSelect;\n\n useEffect(() => {\n if (selectedAccount) {\n externalOnSelect?.(selectedAccount);\n }\n }, [externalOnSelect, selectedAccount]);\n\n return useMemo(\n () => ({\n accounts,\n selectedAccount,\n isConnected,\n isConnecting,\n }),\n [accounts, selectedAccount, isConnected, isConnecting]\n );\n}\n","import { BrowserSDK, ConnectOptions } from '../../BrowserSDK';\nimport type { ConnectResult, IThruChain } from '../../interfaces';\nimport type { ManageAccountsResult } from '../../protocol';\nimport { useEffect, useRef } from 'react';\nimport { useThru } from './useThru';\n\nfunction waitForWallet(getWallet: () => BrowserSDK | null, timeout = 5000, interval = 100): Promise<BrowserSDK> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const check = () => {\n const sdk = getWallet();\n if (sdk) return resolve(sdk);\n if (Date.now() - start > timeout) return reject(new Error('SDK not initialized in time'));\n setTimeout(check, interval);\n };\n check();\n });\n}\n\n/**\n * useThruChain - Hook for accessing the Thru chain API exposed by the Browser SDK.\n * Returns the chain instance (if available) and a boolean indicating readiness.\n */\nexport function useWallet() {\n const {\n wallet,\n isConnected,\n accounts,\n selectedAccount,\n selectAccount,\n manageAccounts,\n isConnecting,\n } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const disconnect = async (): Promise<void> => {\n if (!wallet) {\n throw new Error('SDK not initialized');\n }\n await wallet.disconnect();\n };\n\n const connect = async (options?: ConnectOptions): Promise<ConnectResult> => {\n try {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n const result = await readySdk.connect(options);\n return result;\n } catch (err) {\n const error = err as Error;\n throw error;\n }\n };\n\n const mountInline = async (container: HTMLElement): Promise<void> => {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n await readySdk.mountInline(container);\n };\n\n const openAccountSettings = async (): Promise<ManageAccountsResult> => {\n return manageAccounts();\n };\n\n return {\n wallet: wallet?.thru as IThruChain | undefined,\n accounts,\n connect,\n disconnect,\n mountInline,\n manageAccounts: openAccountSettings,\n isConnected: isConnected && !!wallet,\n isConnecting,\n selectedAccount,\n selectAccount,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thru/wallet",
3
- "version": "0.2.22",
3
+ "version": "0.2.24",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -40,7 +40,7 @@
40
40
  "README.md"
41
41
  ],
42
42
  "dependencies": {
43
- "@thru/sdk": "0.2.22"
43
+ "@thru/sdk": "0.2.24"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@svgr/core": "^8.1.0",
@@ -20,6 +20,7 @@ const PRODUCTION_IFRAME_ORIGINS = ['https://wallet.thru.org'];
20
20
 
21
21
  const SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;
22
22
  const FAST_REQUEST_TIMEOUT_MS = 30 * 1000;
23
+ const PARENT_ORIGIN_SEARCH_PARAM = 'tn_parent_origin';
23
24
 
24
25
  const SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([
25
26
  POST_MESSAGE_REQUEST_TYPES.CONNECT,
@@ -96,6 +97,19 @@ function validateIframeOrigin(iframeUrl: string): void {
96
97
  }
97
98
  }
98
99
 
100
+ function getCurrentWindowOrigin(): string | null {
101
+ if (typeof window === 'undefined') {
102
+ return null;
103
+ }
104
+
105
+ const origin = window.location.origin;
106
+ if (!origin || origin === 'null') {
107
+ return null;
108
+ }
109
+
110
+ return origin;
111
+ }
112
+
99
113
  /**
100
114
  * Manages iframe lifecycle and postMessage communication
101
115
  * Handles creating, showing/hiding iframe, and message passing
@@ -131,6 +145,10 @@ export class IframeManager {
131
145
  private getIframeSrc(): string {
132
146
  const url = new URL(this.iframeUrl);
133
147
  url.searchParams.set('tn_frame_id', this.frameId);
148
+ const parentOrigin = getCurrentWindowOrigin();
149
+ if (parentOrigin) {
150
+ url.searchParams.set(PARENT_ORIGIN_SEARCH_PARAM, parentOrigin);
151
+ }
134
152
  return url.toString();
135
153
  }
136
154