hm-tracking-sdk 0.1.6 → 0.1.8

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/README.md CHANGED
@@ -26,6 +26,8 @@
26
26
  const options: SDKInitOptions = {
27
27
  // 可选:不传则使用内置默认地址
28
28
  baseURL: "https://your-api.example.com",
29
+ // 可选:回调校验用,SDK方会提供
30
+ appId: "app-xxxxxxx",
29
31
 
30
32
  // 可选:本地存储 Key 前缀,避免项目间冲突
31
33
  storageKeyPrefix: "your_app_prefix",
@@ -55,12 +57,14 @@
55
57
  export interface SDKInitOptions {
56
58
  /** 自定义接口地址(可选)。不传则使用默认正式环境 */
57
59
  baseURL?: string;
58
- appId?: string; // 可选:回调校验用
60
+ appId?: string; // 可选:回调校验用,SDK方提供
59
61
  notifyUrl?: string; // 可选:SDK 初始化鉴权成功后的服务端回调地址
60
62
  /** 本地存储 Key 前缀,避免冲突 */
61
63
  storageKeyPrefix?: string;
62
64
  /** 自定义用户信息(可选) */
63
65
  customUser?: TelegramUserInfo;
66
+ /** 可选:TON Connect manifest 文件地址,规则请看5.1.0;未传则使用默认测试清单 */
67
+ tonConnectManifestUrl?: string;
64
68
  }
65
69
  ```
66
70
 
@@ -68,7 +72,7 @@
68
72
  - 说明:后端服务地址;不传则使用 SDK 内置默认地址。
69
73
  - 类型:`string`
70
74
  - appId (可选)
71
- - 说明:服务器之间用来鉴权
75
+ - 说明:服务器之间用来鉴权,SDK方提供
72
76
  - 类型:`string`
73
77
  - notifyUrl (可选)
74
78
  - 说明:SDK方服务器回调参数
@@ -79,6 +83,9 @@
79
83
  - customUser(可选)
80
84
  - 说明:自定义用户数据,仅在非 Telegram 环境可用;若不传,SDK 会自动使用“匿名浏览器用户”(基于 Cookie 生成并持久化随机 userId),从而可以直接完成鉴权与后续请求。
81
85
  - 类型:`TelegramUserInfo`
86
+ - tonConnectManifestUrl(可选)
87
+ - 说明:TON Connect manifest 文件地址。若不传,SDK 使用默认测试清单:`https://miniapp.spinfi.me/tonconnect-manifest.json`。当小程序部署后需要改为对应链接,具体见`5.1.0`说明
88
+ - 类型:`string`
82
89
  - 返回值:`Promise<void>`。
83
90
 
84
91
  ### 2.1 初始化成功通知调用说明(服务端回调)
@@ -88,7 +95,7 @@
88
95
  - JSON 示例:
89
96
 
90
97
  ```json
91
- {"id":"7506466780","first_name":"hong","last_name":"tang","nickname":"hongtang","username":"tanghong1992","language_code":"zh","allows_write_to_pm":1,"auth_date":"2025-04-08T02:08:53.000Z","hash":"a9d2d7c1b066bebb73c170006dc474061d7601183b388b037936aa7cb6620acf","chat_instance":"-2254244616056093259","is_premium_user":0,"photo_url":"https://t.me/i/userpic/320/uLzA4KyVzKwd0vi6Uvupe6U2mdnVEQOIbUZbFTQff6B3UhjRpQObL9I8Nq81G0ln.svg"}
98
+ {"id":"7506466780","first_name":"first","last_name":"name","nickname":"nickname","username":"nickname1992","language_code":"zh","allows_write_to_pm":1,"auth_date":"2025-04-08T02:08:53.000Z","hash":"a9d2d7c1b066bebb73c170006dc474061d7601183b388b037936aa7cb6620acf","chat_instance":"-2254244616056098321","is_premium_user":0,"photo_url":"https://t.me/i/userpic/320/uLzA4KyVzKwd0vi6Uvupe6U2mdnVEQOIbUZbFTQff6B3UhjRpQObL9I8Nq81G0ln.svg"}
92
99
  ```
93
100
 
94
101
  - 若为加密字符串:请与服务端约定解密方式及签名校验流程。
@@ -201,6 +208,46 @@
201
208
 
202
209
  ### 5.1 TON钱包相关API
203
210
 
211
+ #### 5.1.0 配置 tonconnect-manifest
212
+
213
+ - 作用
214
+ - TON Connect 要求每个 dApp(小程序) 提供 `tonconnect-manifest.json`。钱包在连接前会读取该文件以展示 dApp 名称、图标,并校验来源。
215
+ - 托管与访问要求
216
+ - 将该 JSON 文件托管在公网可访问的 HTTPS 地址(建议:`https://your-domain.com/tonconnect-manifest.json`,放在站点根路径)。
217
+ - 文件及其中引用的资源(如图标)须可在任意来源公开访问,避免 CORS 限制。
218
+ - 必须能通过 GET 直接获取,无需鉴权或特殊请求头。
219
+ - `url` 字段请避免末尾斜杠,例如使用 `https://mydapp.com` 而非 `https://mydapp.com/`。
220
+ - 最小示例
221
+
222
+ ```json
223
+ {
224
+ "url": "https://your-domain.com",
225
+ "name": "Your DApp Name",
226
+ "iconUrl": "https://your-domain.com/icons/tonconnect-icon.png"
227
+ }
228
+ ```
229
+
230
+ - 字段要求
231
+ - `url`(必填):应用基础 URL,点击钱包内图标时用于打开应用;避免末尾斜杠。
232
+ - `name`(必填):应用名称。
233
+ - `iconUrl`(必填):应用图标 URL,仅支持 PNG 或 ICO,不支持 SVG;建议 180x180 PNG。
234
+ - `termsOfUseUrl`(可选):条款页 URL。
235
+ - `privacyPolicyUrl`(可选):隐私政策 URL。
236
+ - SDK 行为与配置
237
+ - 默认使用测试清单:`https://miniapp.spinfi.me/tonconnect-manifest.json`。
238
+ - 生产环境建议通过初始化参数传入:
239
+
240
+ ```ts
241
+ const sdk = new HmTrackingSDK({
242
+ tonConnectManifestUrl: "https://your-domain.com/tonconnect-manifest.json",
243
+ // 其他可选项...
244
+ });
245
+ ```
246
+
247
+ - 自检
248
+ - 在浏览器访问你的 manifest URL,确认返回 200 且 JSON 内容正确。
249
+ - 打开连接钱包弹窗,应显示你在 manifest 中配置的名称与图标。
250
+
204
251
  #### 5.1.1 钱包是否链接
205
252
 
206
253
  - 接口: isWalletConnected()
@@ -35925,14 +35925,16 @@ class TonConnectUI {
35925
35925
  }
35926
35926
  }
35927
35927
  const DEFAULT_MANIFEST_URL = "https://miniapp.spinfi.me/tonconnect-manifest.json";
35928
- let tonConnectUIInstance = null;
35928
+ let tonConnectUIInstance = null, currentManifestUrl = null;
35929
35929
  class DefaultTonWalletProvider {
35930
- constructor(f) {
35931
- if (this.bindWalletCallback = f, !tonConnectUIInstance)
35930
+ constructor(f, d) {
35931
+ this.bindWalletCallback = d;
35932
+ const m = f || DEFAULT_MANIFEST_URL;
35933
+ if (!tonConnectUIInstance || currentManifestUrl !== m)
35932
35934
  try {
35933
35935
  tonConnectUIInstance = new TonConnectUI({
35934
- manifestUrl: DEFAULT_MANIFEST_URL
35935
- });
35936
+ manifestUrl: m
35937
+ }), currentManifestUrl = m;
35936
35938
  } catch {
35937
35939
  throw new Error("创建TonConnectUI实例失败");
35938
35940
  }
@@ -36029,7 +36031,10 @@ class HmTrackingSDK {
36029
36031
  onAuthError: () => this.clearAuth(),
36030
36032
  baseURL: m,
36031
36033
  getAppId: () => this.options && this.options.appId || null
36032
- }), this.api = new APIService(this.http), this.hmAdManager = new HmAdManager({ autoInjectScript: !0 }), this.adMonitor = new AdMonitor((v) => this.api.adMonitor(v)), this.tonWallet = new DefaultTonWalletProvider(this.bindWallet.bind(this));
36034
+ }), this.api = new APIService(this.http), this.hmAdManager = new HmAdManager({ autoInjectScript: !0 }), this.adMonitor = new AdMonitor((v) => this.api.adMonitor(v)), this.tonWallet = new DefaultTonWalletProvider(
36035
+ d.tonConnectManifestUrl,
36036
+ this.bindWallet.bind(this)
36037
+ );
36033
36038
  }
36034
36039
  async init() {
36035
36040
  const f = isTelegramEnv();
@@ -1242,4 +1242,4 @@ https://github.com/browserify/crypto-browserify`)},cryptoBrowserify.constants={D
1242
1242
  width: 16px;
1243
1243
  `,ButtonStyled=styled(Button)`
1244
1244
  margin-top: 32px;
1245
- `,ActionModal=r=>{const f=useDataAttributes(r),d=useContext(TonConnectUiContext),[m,v]=createSignal(!0),[g,w]=createSignal(!1),[_,S]=createSignal(!1),[x,b]=createSignal(!1);createEffect(()=>{const A=action();w(!!A&&("sent"in A&&A.sent||A.name==="transaction-sent")),S(!!A&&("signed"in A&&A.signed||A.name==="data-signed")),b(!!A&&(A.name==="transaction-canceled"||A.name==="sign-data-canceled"))});let C;d!=null&&d.wallet&&"universalLink"in d.wallet&&(d.wallet.openMethod==="universal-link"||isTelegramUrl(d.wallet.universalLink)&&isInTMA())&&(C=d.wallet.universalLink);let E;d!=null&&d.wallet&&"deepLink"in d.wallet&&(d.wallet.openMethod==="custom-deeplink"||isTelegramUrl(d.wallet.deepLink)&&isInTMA())&&(E=d.wallet.deepLink);const M=()=>{const A=action(),T="returnStrategy"in A?A.returnStrategy:appState.returnStrategy,L=!m();v(!1),isTelegramUrl(C)?redirectToTelegram(C,{returnStrategy:T,twaReturnUrl:"twaReturnUrl"in A?A.twaReturnUrl:appState.twaReturnUrl,forceRedirect:L}):redirectToWallet(C,E,{returnStrategy:T,forceRedirect:L},()=>{})};return createComponent(ActionModalStyled,mergeProps(f,{get children(){return[createMemo(()=>r.icon),createComponent(H1Styled,{get translationKey(){return r.headerTranslationKey},get translationValues(){return r.headerTranslationValues}}),createComponent(TextStyled,{get translationKey(){return r.textTranslationKey},get translationValues(){return r.textTranslationValues}}),createComponent(Show,{get when(){return!g()&&!_()&&!x()&&(r.showButton==="open-wallet"&&C||r.showButton!=="open-wallet")},get children(){return createComponent(LoaderButtonStyled,{disabled:!0,"data-tc-connect-button-loading":"true",get children(){return createComponent(LoaderIconStyled,{})}})}}),createComponent(Show,{get when(){return g()||_()},get children(){return[createComponent(Show,{get when(){return r.showButton!=="open-wallet"},get children(){return createComponent(ButtonStyled,{onClick:()=>r.onClose(),get children(){return createComponent(Translation,{translationKey:"common.close",children:"Close"})}})}}),createComponent(Show,{get when(){return r.showButton==="open-wallet"&&C},get children(){return createComponent(ButtonStyled,{onClick:M,get children(){return createComponent(Translation,{translationKey:"common.openWallet",children:"Open wallet"})}})}})]}})]}}))},ConfirmTransactionModal=r=>{const f=useContext(TonConnectUiContext),[d]=useI18n(),m=()=>f.wallet&&"name"in f.wallet?f.wallet.name:d("common.yourWallet",{},"Your wallet");return createComponent(ActionModal,{headerTranslationKey:"actionModal.confirmTransaction.header",get headerTranslationValues(){return{name:m()}},textTranslationKey:"actionModal.confirmTransaction.text",get icon(){return createComponent(LoaderIcon,{size:"m"})},onClose:()=>r.onClose(),showButton:"open-wallet","data-tc-confirm-modal":"true"})},TransactionCanceledModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.transactionCanceled.header",textTranslationKey:"actionModal.transactionCanceled.text",get icon(){return createComponent(ErrorIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-transaction-canceled-modal":"true"}),TransactionSentModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.transactionSent.header",textTranslationKey:"actionModal.transactionSent.text",get icon(){return createComponent(SuccessIcon,{size:"m"})},showButton:"open-wallet",onClose:()=>r.onClose(),"data-tc-transaction-sent-modal":"true"}),ConfirmSignDataModal=r=>{const f=useContext(TonConnectUiContext),[d]=useI18n(),m=()=>f.wallet&&"name"in f.wallet?f.wallet.name:d("common.yourWallet",{},"Your wallet");return createComponent(ActionModal,{headerTranslationKey:"actionModal.signData.header",get headerTranslationValues(){return{name:m()}},textTranslationKey:"actionModal.signData.text",get icon(){return createComponent(LoaderIcon,{size:"m"})},onClose:()=>r.onClose(),showButton:"open-wallet","data-tc-sign-data-confirm-modal":"true"})},SignDataCanceledModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.signDataCanceled.header",get icon(){return createComponent(ErrorIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-sign-data-canceled-modal":"true"}),DataSignedModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.dataSigned.header",get icon(){return createComponent(SuccessIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-data-signed-modal":"true"}),ActionsModal=()=>createComponent(Modal,{get opened(){var r;return createMemo(()=>action()!==null)()&&((r=action())==null?void 0:r.openModal)===!0},get enableAndroidBackHandler(){return appState.enableAndroidBackHandler},onClose:()=>setAction(null),showFooter:!1,"data-tc-actions-modal-container":"true",get children(){return createComponent(Switch,{get children(){return[createComponent(Match,{get when(){return action().name==="transaction-sent"},get children(){return createComponent(TransactionSentModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="transaction-canceled"},get children(){return createComponent(TransactionCanceledModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="confirm-transaction"},get children(){return createComponent(ConfirmTransactionModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="data-signed"},get children(){return createComponent(DataSignedModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="sign-data-canceled"},get children(){return createComponent(SignDataCanceledModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="confirm-sign-data"},get children(){return createComponent(ConfirmSignDataModal,{onClose:()=>setAction(null)})}})]}})}}),SingleWalletModal=()=>{const{locale:r}=useI18n()[1];createEffect(()=>r(appState.language)),createEffect(()=>{getSingleWalletModalIsOpened()&&updateIsMobile()});const f=useContext(ConnectorContext),d=useContext(TonConnectUiContext),[m,v]=createSignal(!1),g=()=>{var x;return((x=appState.connectRequestParameters)==null?void 0:x.state)==="loading"},w=createMemo(()=>{var x;if(!g())return(x=appState.connectRequestParameters)==null?void 0:x.value}),_=x=>{d.closeSingleWalletModal(x)},S=f.onStatusChange(x=>{x&&_("wallet-selected")});return onCleanup(S),onCleanup(()=>{v(!1)}),createComponent(StyledModal,{get opened(){return getSingleWalletModalIsOpened()},get enableAndroidBackHandler(){return appState.enableAndroidBackHandler},onClose:()=>_("action-cancelled"),onClickQuestion:()=>v(x=>!x),showFooter:!0,"data-tc-wallets-modal-container":"true",get children(){return[createComponent(Show,{get when(){return m()},get children(){return createComponent(InfoModal,{onBackClick:()=>v(!1)})}}),createComponent(Show,{get when(){return!m()},get children(){return[createComponent(Show,{get when(){return g()},get children(){return[createComponent(H1Styled$a,{translationKey:"walletModal.loading",children:"Wallets list is loading"}),createComponent(LoaderContainerStyled,{get children(){return createComponent(LoaderIcon,{size:"m"})}})]}}),createComponent(Show,{get when(){return!g()},get children(){return createComponent(Dynamic,{get component(){return isMobile()?MobileConnectionModal:DesktopConnectionModal},get wallet(){return getSingleWalletModalWalletInfo()},get additionalRequest(){return w()},onBackClick:()=>{},backDisabled:!0})}})]}})]}})},App=r=>{const f=createI18nContext(i18nDictionary,appState.language);return defineStylesRoot(),fixMobileSafariActiveTransition(),createComponent(I18nContext.Provider,{value:f,get children(){return createComponent(TonConnectUiContext.Provider,{get value(){return r.tonConnectUI},get children(){return createComponent(ConnectorContext.Provider,{get value(){return appState.connector},get children(){return[createComponent(GlobalStyles,{}),createComponent(ThemeProvider,{theme:themeState,get children(){return[createComponent(Show,{get when(){return appState.buttonRootId},get children(){return createComponent(Portal,{get mount(){return document.getElementById(appState.buttonRootId)},get children(){return createComponent(AccountButton,{})}})}}),createComponent(Dynamic,{component:globalStylesTag,get children(){return[createComponent(WalletsModal,{}),createComponent(SingleWalletModal,{}),createComponent(ActionsModal,{})]}})]}})]}})}})}})},widgetController={openWalletsModal:()=>void setTimeout(()=>setWalletsModalState({status:"opened",closeReason:null})),closeWalletsModal:r=>void setTimeout(()=>setWalletsModalState({status:"closed",closeReason:r})),openSingleWalletModal:r=>{setTimeout(()=>setSingleWalletModalState({status:"opened",closeReason:null,walletInfo:r}))},closeSingleWalletModal:r=>void setTimeout(()=>setSingleWalletModalState({status:"closed",closeReason:r})),openWalletNotSupportFeatureModal:r=>void setTimeout(()=>setWalletsModalState({status:"opened",closeReason:null,type:"wallet-not-support-feature",requiredFeature:r.requiredFeature})),setAction:r=>void setTimeout(()=>setAction(r)),clearAction:()=>void setTimeout(()=>setAction(null)),getSelectedWalletInfo:()=>lastSelectedWalletInfo(),removeSelectedWalletInfo:()=>setLastSelectedWalletInfo(null),renderApp:(r,f)=>render(()=>createComponent(App,{tonConnectUI:f}),document.getElementById(r))};class WalletsModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"setConnectRequestParametersCallback"),__publicField(this,"consumers",[]),__publicField(this,"tracker"),__publicField(this,"state",walletsModalState()),this.connector=f.connector,this.tracker=f.tracker,this.setConnectRequestParametersCallback=f.setConnectRequestParametersCallback,createEffect(()=>{const d=walletsModalState();this.state=d,this.consumers.forEach(m=>m(d))})}open(){return __async(this,null,function*(){this.tracker.trackConnectionStarted();const d=(yield this.connector.getWallets()).find(isWalletInfoCurrentlyEmbedded);return d?this.connectEmbeddedWallet(d):this.openWalletsModal()})}close(f="action-cancelled"){f==="action-cancelled"&&this.tracker.trackConnectionError("Connection was cancelled"),widgetController.closeWalletsModal(f)}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}connectEmbeddedWallet(f){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;(m==null?void 0:m.state)==="loading"?this.setConnectRequestParametersCallback(d):d(m==null?void 0:m.value)}openWalletsModal(){return __async(this,null,function*(){return isInTMA()&&sendExpand(),widgetController.openWalletsModal(),new Promise(f=>{const d=this.onStateChange(m=>{const{status:v}=m;v==="opened"&&(d(),f())})})})}}class TransactionModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"consumers",[]),this.connector=f.connector,createEffect(()=>{const d=action();this.consumers.forEach(m=>m(d))})}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}}class SingleWalletModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"setConnectRequestParametersCallback"),__publicField(this,"consumers",[]),__publicField(this,"tracker"),__publicField(this,"state",singleWalletModalState()),this.connector=f.connector,this.tracker=f.tracker,this.setConnectRequestParametersCallback=f.setConnectRequestParametersCallback,createEffect(()=>{const d=singleWalletModalState();this.state=d,this.consumers.forEach(m=>m(d))})}open(f){return __async(this,null,function*(){this.tracker.trackConnectionStarted();const d=yield this.connector.getWallets(),m=applyWalletsListConfiguration(d,appState.walletsListConfiguration),v=m.find(isWalletInfoCurrentlyEmbedded);if(!!v)return this.connectEmbeddedWallet(v);const _=m.filter(isWalletInfoRemote).find(b=>eqWalletName(b,f));if(!!_)return this.openSingleWalletModal(_);const x=`Trying to open modal window with unknown wallet "${f}".`;throw this.tracker.trackConnectionError(x),new TonConnectUIError(x)})}close(f="action-cancelled"){f==="action-cancelled"&&this.tracker.trackConnectionError("Connection was cancelled"),widgetController.closeSingleWalletModal("action-cancelled")}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}connectEmbeddedWallet(f){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;(m==null?void 0:m.state)==="loading"?this.setConnectRequestParametersCallback(d):d(m==null?void 0:m.value)}openSingleWalletModal(f){return __async(this,null,function*(){return isInTMA()&&sendExpand(),widgetController.openSingleWalletModal(f),new Promise(d=>{const m=this.onStateChange(v=>{const{status:g}=v;g==="opened"&&(m(),d())})})})}}class TonConnectUITracker{constructor(f){__publicField(this,"eventPrefix","ton-connect-ui-"),__publicField(this,"tonConnectUiVersion"),__publicField(this,"tonConnectSdkVersion",null),__publicField(this,"eventDispatcher");var d;this.eventDispatcher=(d=f==null?void 0:f.eventDispatcher)!=null?d:new BrowserEventDispatcher,this.tonConnectUiVersion=f.tonConnectUiVersion,this.init().catch()}get version(){return createVersionInfo({ton_connect_sdk_lib:this.tonConnectSdkVersion,ton_connect_ui_lib:this.tonConnectUiVersion})}init(){return __async(this,null,function*(){try{yield this.setRequestVersionHandler(),this.tonConnectSdkVersion=yield this.requestTonConnectSdkVersion()}catch{}})}setRequestVersionHandler(){return __async(this,null,function*(){yield this.eventDispatcher.addEventListener("ton-connect-ui-request-version",()=>__async(this,null,function*(){yield this.eventDispatcher.dispatchEvent("ton-connect-ui-response-version",createResponseVersionEvent(this.tonConnectUiVersion))}))})}requestTonConnectSdkVersion(){return __async(this,null,function*(){return new Promise((f,d)=>__async(this,null,function*(){try{yield this.eventDispatcher.addEventListener("ton-connect-response-version",m=>{f(m.detail.version)},{once:!0}),yield this.eventDispatcher.dispatchEvent("ton-connect-request-version",createRequestVersionEvent())}catch(m){d(m)}}))})}dispatchUserActionEvent(f){var d;try{(d=this.eventDispatcher)==null||d.dispatchEvent(`${this.eventPrefix}${f.type}`,f).catch()}catch{}}trackConnectionStarted(...f){try{const d=createConnectionStartedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionCompleted(...f){try{const d=createConnectionCompletedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionError(...f){try{const d=createConnectionErrorEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringStarted(...f){try{const d=createConnectionRestoringStartedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringCompleted(...f){try{const d=createConnectionRestoringCompletedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringError(...f){try{const d=createConnectionRestoringErrorEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDisconnection(...f){try{const d=createDisconnectionEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSentForSignature(...f){try{const d=createTransactionSentForSignatureEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSigned(...f){try{const d=createTransactionSignedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSigningFailed(...f){try{const d=createTransactionSigningFailedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSentForSignature(...f){try{const d=createDataSentForSignatureEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSigned(...f){try{const d=createDataSignedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSigningFailed(...f){try{const d=createDataSigningFailedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}}const tonConnectUiVersion="2.2.0";class TonConnectUI{constructor(f){if(__publicField(this,"walletInfoStorage",new WalletInfoStorage),__publicField(this,"preferredWalletStorage",new PreferredWalletStorage),__publicField(this,"tracker"),__publicField(this,"walletInfo",null),__publicField(this,"systemThemeChangeUnsubscribe",null),__publicField(this,"actionsConfiguration"),__publicField(this,"walletsList"),__publicField(this,"_walletsRequiredFeatures"),__publicField(this,"_walletsPreferredFeatures"),__publicField(this,"connectRequestParametersCallback"),__publicField(this,"connector"),__publicField(this,"modal"),__publicField(this,"singleWalletModal"),__publicField(this,"transactionModal"),__publicField(this,"connectionRestored",Promise.resolve(!1)),f&&"connector"in f&&f.connector)this.connector=f.connector;else if(f&&"manifestUrl"in f&&f.manifestUrl)this.connector=new TonConnect({manifestUrl:f.manifestUrl,eventDispatcher:f.eventDispatcher,walletsRequiredFeatures:f.walletsRequiredFeatures});else throw new TonConnectUIError("You have to specify a `manifestUrl` or a `connector` in the options.");this.tracker=new TonConnectUITracker({eventDispatcher:f==null?void 0:f.eventDispatcher,tonConnectUiVersion}),this.modal=new WalletsModalManager({connector:this.connector,tracker:this.tracker,setConnectRequestParametersCallback:v=>{this.connectRequestParametersCallback=v}}),this.singleWalletModal=new SingleWalletModalManager({connector:this.connector,tracker:this.tracker,setConnectRequestParametersCallback:v=>{this.connectRequestParametersCallback=v}}),this.transactionModal=new TransactionModalManager({connector:this.connector}),this._walletsRequiredFeatures=f.walletsRequiredFeatures,this._walletsPreferredFeatures=f.walletsPreferredFeatures,this.walletsList=this.getWallets(),this.walletsList.then(v=>preloadImages(uniq(v.map(g=>g.imageUrl))));const d=this.normalizeWidgetRoot(f==null?void 0:f.widgetRootId);this.subscribeToWalletChange(),(f==null?void 0:f.restoreConnection)!==!1&&(this.connectionRestored=createMacrotaskAsync(()=>__async(this,null,function*(){return this.tracker.trackConnectionRestoringStarted(),yield this.connector.restoreConnection(),this.connector.connected?this.tracker.trackConnectionRestoringCompleted(this.wallet):(this.tracker.trackConnectionRestoringError("Connection was not restored"),this.walletInfoStorage.removeWalletInfo()),this.connector.connected}))),this.uiOptions=mergeOptions(f,{uiPreferences:{theme:"SYSTEM"}});const m=this.preferredWalletStorage.getPreferredWalletAppName();setAppState({connector:this.connector,preferredWalletAppName:m}),widgetController.renderApp(d,this)}static getWallets(){return TonConnect.getWallets()}get walletsRequiredFeatures(){return this._walletsRequiredFeatures}get walletsPreferredFeatures(){return this._walletsPreferredFeatures}get connected(){return this.connector.connected}get account(){return this.connector.account}get wallet(){return this.connector.wallet?__spreadValues(__spreadValues({},this.connector.wallet),this.walletInfo):null}set uiOptions(f){var d,m,v,g,w;this.checkButtonRootExist(f.buttonRootId),this.actionsConfiguration=f.actionsConfiguration,"walletsRequiredFeatures"in f&&(this._walletsRequiredFeatures=f.walletsRequiredFeatures),"walletsPreferredFeatures"in f&&(this._walletsPreferredFeatures=f.walletsPreferredFeatures),(d=f.uiPreferences)!=null&&d.theme?((m=f.uiPreferences)==null?void 0:m.theme)!=="SYSTEM"?((v=this.systemThemeChangeUnsubscribe)==null||v.call(this),setTheme(f.uiPreferences.theme,f.uiPreferences.colorsSet)):(setTheme(getSystemTheme(),f.uiPreferences.colorsSet),this.systemThemeChangeUnsubscribe||(this.systemThemeChangeUnsubscribe=subscribeToThemeChange(setTheme))):(g=f.uiPreferences)!=null&&g.colorsSet&&setColors(f.uiPreferences.colorsSet),(w=f.uiPreferences)!=null&&w.borderRadius&&setBorderRadius(f.uiPreferences.borderRadius),setAppState(_=>{var S,x;const b=mergeOptions(__spreadValues(__spreadValues(__spreadValues(__spreadValues({},f.language&&{language:f.language}),!!((S=f.actionsConfiguration)!=null&&S.returnStrategy)&&{returnStrategy:f.actionsConfiguration.returnStrategy}),!!((x=f.actionsConfiguration)!=null&&x.twaReturnUrl)&&{twaReturnUrl:f.actionsConfiguration.twaReturnUrl}),!!f.walletsListConfiguration&&{walletsListConfiguration:f.walletsListConfiguration}),unwrap(_));return f.buttonRootId!==void 0&&(b.buttonRootId=f.buttonRootId),f.enableAndroidBackHandler!==void 0&&(b.enableAndroidBackHandler=f.enableAndroidBackHandler),b})}setConnectRequestParameters(f){var d;setAppState({connectRequestParameters:f}),((f==null?void 0:f.state)==="ready"||!f)&&((d=this.connectRequestParametersCallback)==null||d.call(this,f==null?void 0:f.value))}getWallets(){return __async(this,null,function*(){return this.connector.getWallets()})}onStatusChange(f,d){return this.connector.onStatusChange(m=>__async(this,null,function*(){if(m){const v=yield this.getSelectedWalletInfo(m);f(__spreadValues(__spreadValues({},m),v||this.walletInfoStorage.getWalletInfo()))}else f(m)}),d)}openModal(){return __async(this,null,function*(){return this.modal.open()})}closeModal(f){this.modal.close(f)}onModalStateChange(f){return this.modal.onStateChange(f)}get modalState(){return this.modal.state}openSingleWalletModal(f){return __async(this,null,function*(){return this.singleWalletModal.open(f)})}closeSingleWalletModal(f){this.singleWalletModal.close(f)}onSingleWalletModalStateChange(f){return this.singleWalletModal.onStateChange(f)}get singleWalletModalState(){return this.singleWalletModal.state}connectWallet(){return __async(this,null,function*(){const d=(yield this.getWallets()).find(isWalletInfoCurrentlyEmbedded);return d?yield this.connectEmbeddedWallet(d):yield this.connectExternalWallet()})}disconnect(){return this.tracker.trackDisconnection(this.wallet,"dapp"),widgetController.clearAction(),widgetController.removeSelectedWalletInfo(),this.walletInfoStorage.removeWalletInfo(),this.connector.disconnect()}sendTransaction(f,d){return __async(this,null,function*(){if(this.tracker.trackTransactionSentForSignature(this.wallet,f),!this.connected)throw this.tracker.trackTransactionSigningFailed(this.wallet,f,"Wallet was not connected"),new TonConnectUIError("Connect wallet to send a transaction.");isInTMA()&&sendExpand();const{notifications:m,modals:v,returnStrategy:g,twaReturnUrl:w}=this.getModalsAndNotificationsConfiguration(d);widgetController.setAction({name:"confirm-transaction",showNotification:m.includes("before"),openModal:v.includes("before"),sent:!1});const _=new AbortController,S=()=>{_.signal.aborted||(widgetController.setAction({name:"confirm-transaction",showNotification:m.includes("before"),openModal:v.includes("before"),sent:!0}),this.redirectAfterRequestSent({returnStrategy:g,twaReturnUrl:w}))},x=this.onTransactionModalStateChange(b=>{b!=null&&b.openModal||(x(),b||_.abort())});try{const b=yield this.waitForSendTransaction({transaction:f,signal:_.signal},S);return this.tracker.trackTransactionSigned(this.wallet,f,b),widgetController.setAction({name:"transaction-sent",showNotification:m.includes("success"),openModal:v.includes("success")}),b}catch(b){throw b instanceof WalletNotSupportFeatureError?(widgetController.clearAction(),widgetController.openWalletNotSupportFeatureModal(b.cause),b):(widgetController.setAction({name:"transaction-canceled",showNotification:m.includes("error"),openModal:v.includes("error")}),b instanceof TonConnectError?b:new TonConnectUIError("Unhandled error:"+b))}finally{x()}})}signData(f){return __async(this,null,function*(){if(this.tracker.trackDataSentForSignature(this.wallet,f),!this.connected)throw this.tracker.trackDataSigningFailed(this.wallet,f,"Wallet was not connected"),new TonConnectUIError("Connect wallet to send a transaction.");isInTMA()&&sendExpand();const{notifications:d,modals:m,returnStrategy:v,twaReturnUrl:g}=this.getModalsAndNotificationsConfiguration();widgetController.setAction({name:"confirm-sign-data",showNotification:d.includes("before"),openModal:m.includes("before"),signed:!1});const w=new AbortController,_=()=>{w.signal.aborted||(widgetController.setAction({name:"confirm-sign-data",showNotification:d.includes("before"),openModal:m.includes("before"),signed:!0}),this.redirectAfterRequestSent({returnStrategy:v,twaReturnUrl:g}))},S=this.onTransactionModalStateChange(x=>{x!=null&&x.openModal||(S(),x||w.abort())});try{const x=yield this.waitForSignData({data:f,signal:new AbortController().signal},_);return this.tracker.trackDataSigned(this.wallet,f,x),widgetController.setAction({name:"data-signed",showNotification:d.includes("success"),openModal:m.includes("success")}),x}catch(x){throw x instanceof WalletNotSupportFeatureError?(widgetController.clearAction(),widgetController.openWalletNotSupportFeatureModal(x.cause),x):(widgetController.setAction({name:"sign-data-canceled",showNotification:d.includes("error"),openModal:m.includes("error")}),x instanceof TonConnectError?x:new TonConnectUIError("Unhandled error:"+x))}finally{S()}})}redirectAfterRequestSent({returnStrategy:f,twaReturnUrl:d}){this.walletInfo&&"universalLink"in this.walletInfo&&(this.walletInfo.openMethod==="universal-link"||this.walletInfo.openMethod==="custom-deeplink")&&(isTelegramUrl(this.walletInfo.universalLink)?redirectToTelegram(this.walletInfo.universalLink,{returnStrategy:f,twaReturnUrl:d||appState.twaReturnUrl,forceRedirect:!1}):redirectToWallet(this.walletInfo.universalLink,this.walletInfo.deepLink,{returnStrategy:f,forceRedirect:!1},()=>{}))}connectEmbeddedWallet(f){return __async(this,null,function*(){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;return(m==null?void 0:m.state)==="loading"?this.connectRequestParametersCallback=d:d(m==null?void 0:m.value),yield this.waitForWalletConnection({ignoreErrors:!1})})}connectExternalWallet(){return __async(this,null,function*(){const f=new AbortController;widgetController.openWalletsModal();const d=this.onModalStateChange(m=>{const{status:v,closeReason:g}=m;v!=="opened"&&(d(),g==="action-cancelled"&&f.abort())});return yield this.waitForWalletConnection({ignoreErrors:!0,signal:f.signal})})}waitForWalletConnection(f){return __async(this,null,function*(){return new Promise((d,m)=>{this.tracker.trackConnectionStarted();const{ignoreErrors:v=!1,signal:g=null}=f;if(g&&g.aborted)return this.tracker.trackConnectionError("Connection was cancelled"),m(new TonConnectUIError("Wallet was not connected"));const w=x=>__async(this,null,function*(){if(x)this.tracker.trackConnectionCompleted(x),S(),d(x);else{if(this.tracker.trackConnectionError("Connection was cancelled"),v)return;S(),m(new TonConnectUIError("Wallet was not connected"))}}),_=x=>{this.tracker.trackConnectionError(x.message),!v&&(S(),m(x))},S=this.onStatusChange(x=>w(x),x=>_(x));g&&g.addEventListener("abort",()=>{S(),m(new TonConnectUIError("Wallet was not connected"))},{once:!0})})})}waitForSendTransaction(f,d){return __async(this,null,function*(){return new Promise((m,v)=>{const{transaction:g,signal:w}=f;if(w.aborted)return this.tracker.trackTransactionSigningFailed(this.wallet,g,"Transaction was cancelled"),v(new TonConnectUIError("Transaction was not sent"));const _=b=>__async(this,null,function*(){m(b)}),S=b=>{v(b)},x=()=>{this.tracker.trackTransactionSigningFailed(this.wallet,g,"Transaction was cancelled"),v(new TonConnectUIError("Transaction was not sent"))};w.addEventListener("abort",x,{once:!0}),this.connector.sendTransaction(g,{onRequestSent:d,signal:w}).then(b=>(w.removeEventListener("abort",x),_(b))).catch(b=>(w.removeEventListener("abort",x),S(b)))})})}waitForSignData(f,d){return __async(this,null,function*(){return new Promise((m,v)=>{const{data:g,signal:w}=f;if(w.aborted)return this.tracker.trackDataSigningFailed(this.wallet,g,"SignData was cancelled"),v(new TonConnectUIError("SignData was not sent"));const _=b=>__async(this,null,function*(){m(b)}),S=b=>{v(b)},x=()=>{this.tracker.trackDataSigningFailed(this.wallet,g,"SignData was cancelled"),v(new TonConnectUIError("SignData was not sent"))};w.addEventListener("abort",x,{once:!0}),this.connector.signData(g,{onRequestSent:d,signal:w}).then(b=>_(b)).catch(b=>S(b))})})}onTransactionModalStateChange(f){return this.transactionModal.onStateChange(f)}subscribeToWalletChange(){this.connector.onStatusChange(f=>__async(this,null,function*(){var d;f?(yield this.updateWalletInfo(f),this.setPreferredWalletAppName(((d=this.walletInfo)==null?void 0:d.appName)||f.device.appName)):this.walletInfoStorage.removeWalletInfo()}))}setPreferredWalletAppName(f){this.preferredWalletStorage.setPreferredWalletAppName(f),setAppState({preferredWalletAppName:f})}getSelectedWalletInfo(f){return __async(this,null,function*(){let d=widgetController.getSelectedWalletInfo();if(!d)return null;let m;if("name"in d)m=d;else{const g=applyWalletsListConfiguration(yield this.walletsList,appState.walletsListConfiguration).find(w=>eqWalletName(w,f.device.appName));if(!g)throw new TonConnectUIError(`Cannot find WalletInfo for the '${f.device.appName}' wallet`);m=__spreadValues(__spreadValues({},g),d)}return m})}updateWalletInfo(f){return __async(this,null,function*(){const d=yield this.getSelectedWalletInfo(f);if(d){this.walletInfo=d,this.walletInfoStorage.setWalletInfo(d);return}const m=this.walletInfoStorage.getWalletInfo();if(m){this.walletInfo=m;return}this.walletInfo=(yield this.walletsList).find(v=>eqWalletName(v,f.device.appName))||null})}normalizeWidgetRoot(f){if(!f||!document.getElementById(f)){f="tc-widget-root";const d=document.createElement("div");d.id=f,document.body.appendChild(d)}return f}checkButtonRootExist(f){if(f!=null&&!document.getElementById(f))throw new TonConnectUIError(`${f} element not found in the document.`)}getModalsAndNotificationsConfiguration(f){var d,m,v,g,w,_;const S=["before","success","error"];let x=S;(d=this.actionsConfiguration)!=null&&d.notifications&&((m=this.actionsConfiguration)==null?void 0:m.notifications)!=="all"&&(x=this.actionsConfiguration.notifications),f!=null&&f.notifications&&(f.notifications==="all"?x=S:x=f.notifications);let b=["before"];(v=this.actionsConfiguration)!=null&&v.modals&&(this.actionsConfiguration.modals==="all"?b=S:b=this.actionsConfiguration.modals),f!=null&&f.modals&&(f.modals==="all"?b=S:b=f.modals);const C=(f==null?void 0:f.returnStrategy)||((g=this.actionsConfiguration)==null?void 0:g.returnStrategy)||"back",E=(f==null?void 0:f.twaReturnUrl)||((w=this.actionsConfiguration)==null?void 0:w.twaReturnUrl);let M=(f==null?void 0:f.skipRedirectToWallet)||((_=this.actionsConfiguration)==null?void 0:_.skipRedirectToWallet)||"ios";return isInTMA()&&(M="never"),{notifications:x,modals:b,returnStrategy:C,twaReturnUrl:E,skipRedirectToWallet:M}}}const DEFAULT_MANIFEST_URL="https://miniapp.spinfi.me/tonconnect-manifest.json";let tonConnectUIInstance=null;class DefaultTonWalletProvider{constructor(f){if(this.bindWalletCallback=f,!tonConnectUIInstance)try{tonConnectUIInstance=new TonConnectUI({manifestUrl:DEFAULT_MANIFEST_URL})}catch{throw new Error("创建TonConnectUI实例失败")}this.ui=tonConnectUIInstance}isConnected(){var f;try{return!!((f=this.ui)!=null&&f.connected)}catch{return!1}}async reportWalletAddress(){const f=this.getUserFriendlyAddress();if(f&&this.bindWalletCallback)try{await this.bindWalletCallback(f)}catch{}}async connect(){if(this.isConnected())return await this.reportWalletAddress(),!0;try{return await new Promise((f,d)=>{this.ui.openModal();const m=this.ui.onStatusChange(()=>{this.isConnected()&&(m(),f())});setTimeout(()=>{this.isConnected()||(m(),d(new Error("连接钱包超时")))},3e5)}),await this.reportWalletAddress(),this.isConnected()}catch{return!1}}getUserFriendlyAddress(){var m,v,g;const f=this.ui,d=((v=(m=f==null?void 0:f.wallet)==null?void 0:m.account)==null?void 0:v.address)||((g=f==null?void 0:f.account)==null?void 0:g.address)||null;return d?toUserFriendlyAddress(d):null}async sendTonTransaction(f){if(!this.isConnected()&&!await this.connect())throw new Error("钱包未连接");const d=await this.ui.sendTransaction(f),m=d==null?void 0:d.boc;let v;if(m)try{v=m.substring(0,16)}catch{}return{transferHash:v,boc:m,raw:d}}async sendUsdtTransaction(f){if(!this.isConnected()&&!await this.connect())throw new Error("钱包未连接");const d=await this.ui.sendTransaction(f),m=d==null?void 0:d.boc;let v;if(m)try{v=m.substring(0,16)}catch{}return{transferHash:v,boc:m,raw:d}}async disconnect(){try{const f=this.ui;if(f!=null&&f.disconnect)await f.disconnect();else if(f!=null&&f.onStatusChange){const d=f.onStatusChange(()=>{});d&&d()}return!this.isConnected()}catch{return!1}}}class HmTrackingSDK{constructor(f){this.options=f,this.token=null,this.user=null;const d=this.options||{};this.storage=new NamespacedStorage(d.storageKeyPrefix||"hm_tracking_sdk"),this.token=this.storage.get("token");const m=d.baseURL||TEST_BASE_URL;this.http=new HttpClient({getToken:()=>this.token,onAuthError:()=>this.clearAuth(),baseURL:m,getAppId:()=>this.options&&this.options.appId||null}),this.api=new APIService(this.http),this.hmAdManager=new HmAdManager({autoInjectScript:!0}),this.adMonitor=new AdMonitor(v=>this.api.adMonitor(v)),this.tonWallet=new DefaultTonWalletProvider(this.bindWallet.bind(this))}async init(){const f=isTelegramEnv();try{const d=this.options||{},m=f?getTelegramUserUnsafe():null;if(m?this.user=m:d.customUser?this.user=d.customUser:typeof window<"u"?this.user=getAnonymousBrowserUser():this.user=getDefaultMockUser(),!this.user)throw new Error("未获取到用户信息:请在非 Telegram 环境提供 customUser");this.clearAuth(),await this.auth();try{await this.hmAdManager.init()}catch{}}catch(d){throw d}}async auth(){var f,d;try{const m={...this.user},v=(f=this.options)==null?void 0:f.notifyUrl;v&&(m.notifyUrl=v);const g=await this.api.auth(m);if(g.code!==1)throw new Error(g.msg||"鉴权失败");const w=(d=g.data)==null?void 0:d.token;if(!w)throw new Error("鉴权未返回 token");this.token=w,this.storage.set("token",w)}catch(m){throw m}}clearAuth(){this.token=null,this.storage.remove("token")}ensureTelegramEnvOrThrow(){if(!isTelegramEnv())throw new Error("支付相关功能仅支持在 Telegram 环境内使用")}async getAdPositionConfig(f){const d=await this.api.getAdPositionConfig(String(f));if(d.code!==1)throw new Error(d.msg||"获取广告位配置失败");return d.data||[]}async createAd(f){const d=await this.api.createAd(f);if(d.code!==1)throw new Error(d.msg||"创建广告失败");const m=d.data;return m!=null&&m.spaceId&&await this.hmAdManager.setSpace(String(m.spaceId)),m}async showHmAdByPosition(f,d){const m=await this.getAdPositionConfig(f);if(!m||m.length===0)throw new Error("未找到广告位配置");const v=m[0],g=await this.createAd({adId:v.adId,adPositionId:v.adPositionId}),w={start:g.start,show:g.show,error:g.error,close:g.close,reward:g.reward};await this.showHmAdWithMonitor(w,g.adShowId,d)}async showHmAdWithMonitor(f,d,m){const v=d||"";await this.adMonitor.send(f.start,v),await this.adMonitor.send(f.show,v);try{await this.hmAdManager.show(),await this.adMonitor.send(f.close,v);const g=await this.adMonitor.send(f.reward,v);m!=null&&m.onSuccess&&await m.onSuccess(g)}catch(g){throw await this.adMonitor.send(f.error,v),m!=null&&m.onError&&await m.onError(g),g}}async showHmPopupAd(f,d,m){const v=d||"";await this.adMonitor.send(f.start,v),await this.adMonitor.send(f.show,v);try{await this.hmAdManager.showPopup(),await this.adMonitor.send(f.close,v);const g=await this.adMonitor.send(f.reward,v);m!=null&&m.onSuccess&&await m.onSuccess(g)}catch(g){throw await this.adMonitor.send(f.error,v),m!=null&&m.onError&&await m.onError(g),g}}async showHmInAppAd(f,d,m,v){const g=m||"";await this.adMonitor.send(f.start,g),await this.adMonitor.send(f.show,g);try{await this.hmAdManager.showInApp(d),await this.adMonitor.send(f.close,g);const w=await this.adMonitor.send(f.reward,g);v!=null&&v.onSuccess&&await v.onSuccess(w)}catch(w){throw await this.adMonitor.send(f.error,g),v!=null&&v.onError&&await v.onError(w),w}}async bindWallet(f){try{if((await this.api.bindWalletReq({wallet:f,forceBind:!0})).code!==1)return}catch(d){throw d}}async disconnectWallet(){try{return this.tonWallet?(await this.tonWallet.disconnect(),!this.tonWallet.isConnected()):!0}catch{return!1}}async connectWallet(){return this.tonWallet?await this.tonWallet.connect():!1}isWalletConnected(){var f;return!!((f=this.tonWallet)!=null&&f.isConnected())}async ensureWalletConnected(){return this.ensureTelegramEnvOrThrow(),this.tonWallet?await this.tonWallet.connect():!1}async getSupportedPayModes(){const f=await this.api.merchantPayModeList();if(f.code!==1)throw new Error(f.msg||"获取支付方式失败");const d=f.data;return Array.isArray(d)?{payModeList:d}:{payModeList:Array.isArray(d==null?void 0:d.payModeList)?d.payModeList:[]}}async merchantPayQueryResult(f){const d=await this.api.merchantPayQueryResult(f);if(d.code!==1)throw new Error(d.msg||"查询支付结果失败");return d.data}async finishPayment(f,d,m=""){const v={orderSn:f,status:d,transferHash:m},g=await this.api.merchantPayFinish(v);if(g.code!==1)throw new Error(g.msg||"支付完成回调失败");return g.data}async payByMerchant(f){var _,S,x;this.ensureTelegramEnvOrThrow();const d=(_=f.currencyName)==null?void 0:_.toUpperCase(),m=await this.api.merchantPayCreate(f);if(m.code!==1)throw new Error(m.msg||"创建支付订单失败");const v=m.data;if(d==="STARS"&&v.payUrl)try{return await new Promise((C,E)=>{WebApp.openInvoice(v.payUrl,M=>{M==="paid"?C():E(new Error(`星币支付未完成: ${M||"未知状态"}`))})}),await this.finishPayment(v.orderSn,"success")}catch{return await this.finishPayment(v.orderSn,"failed")}if(!this.tonWallet||!this.tonWallet.isConnected())throw new Error("请先连接钱包");if(!((x=(S=v.transferData)==null?void 0:S.messages)==null?void 0:x[0]))throw new Error("订单未返回链上消息");let w;try{if(d==="TON")w=await this.tonWallet.sendTonTransaction(v.transferData);else if(d==="USDT")w=await this.tonWallet.sendUsdtTransaction(v.transferData);else throw new Error("暂不支持的币种");const b=w==null?void 0:w.transferHash;return await this.finishPayment(v.orderSn,"success",b||"")}catch{return await this.finishPayment(v.orderSn,"failed")}}}var AdPositionName=(r=>(r.GameRewardedAdPosition="game_rewarded_ad_position",r.TaskRewardedAdPosition="task_rewarded_ad_position",r.TaskListAdPosition="task_list_ad_position",r))(AdPositionName||{});globalThis.Buffer=Buffer$1,globalThis.process=process$1,globalThis.global=globalThis,exports.AdPositionName=AdPositionName,exports.HmTrackingSDK=HmTrackingSDK,exports.getAnonymousBrowserUser=getAnonymousBrowserUser,exports.getDefaultMockUser=getDefaultMockUser,exports.getTelegramUserUnsafe=getTelegramUserUnsafe,exports.isTelegramEnv=isTelegramEnv,Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"})}));
1245
+ `,ActionModal=r=>{const f=useDataAttributes(r),d=useContext(TonConnectUiContext),[m,v]=createSignal(!0),[g,w]=createSignal(!1),[_,S]=createSignal(!1),[x,b]=createSignal(!1);createEffect(()=>{const A=action();w(!!A&&("sent"in A&&A.sent||A.name==="transaction-sent")),S(!!A&&("signed"in A&&A.signed||A.name==="data-signed")),b(!!A&&(A.name==="transaction-canceled"||A.name==="sign-data-canceled"))});let C;d!=null&&d.wallet&&"universalLink"in d.wallet&&(d.wallet.openMethod==="universal-link"||isTelegramUrl(d.wallet.universalLink)&&isInTMA())&&(C=d.wallet.universalLink);let E;d!=null&&d.wallet&&"deepLink"in d.wallet&&(d.wallet.openMethod==="custom-deeplink"||isTelegramUrl(d.wallet.deepLink)&&isInTMA())&&(E=d.wallet.deepLink);const M=()=>{const A=action(),T="returnStrategy"in A?A.returnStrategy:appState.returnStrategy,L=!m();v(!1),isTelegramUrl(C)?redirectToTelegram(C,{returnStrategy:T,twaReturnUrl:"twaReturnUrl"in A?A.twaReturnUrl:appState.twaReturnUrl,forceRedirect:L}):redirectToWallet(C,E,{returnStrategy:T,forceRedirect:L},()=>{})};return createComponent(ActionModalStyled,mergeProps(f,{get children(){return[createMemo(()=>r.icon),createComponent(H1Styled,{get translationKey(){return r.headerTranslationKey},get translationValues(){return r.headerTranslationValues}}),createComponent(TextStyled,{get translationKey(){return r.textTranslationKey},get translationValues(){return r.textTranslationValues}}),createComponent(Show,{get when(){return!g()&&!_()&&!x()&&(r.showButton==="open-wallet"&&C||r.showButton!=="open-wallet")},get children(){return createComponent(LoaderButtonStyled,{disabled:!0,"data-tc-connect-button-loading":"true",get children(){return createComponent(LoaderIconStyled,{})}})}}),createComponent(Show,{get when(){return g()||_()},get children(){return[createComponent(Show,{get when(){return r.showButton!=="open-wallet"},get children(){return createComponent(ButtonStyled,{onClick:()=>r.onClose(),get children(){return createComponent(Translation,{translationKey:"common.close",children:"Close"})}})}}),createComponent(Show,{get when(){return r.showButton==="open-wallet"&&C},get children(){return createComponent(ButtonStyled,{onClick:M,get children(){return createComponent(Translation,{translationKey:"common.openWallet",children:"Open wallet"})}})}})]}})]}}))},ConfirmTransactionModal=r=>{const f=useContext(TonConnectUiContext),[d]=useI18n(),m=()=>f.wallet&&"name"in f.wallet?f.wallet.name:d("common.yourWallet",{},"Your wallet");return createComponent(ActionModal,{headerTranslationKey:"actionModal.confirmTransaction.header",get headerTranslationValues(){return{name:m()}},textTranslationKey:"actionModal.confirmTransaction.text",get icon(){return createComponent(LoaderIcon,{size:"m"})},onClose:()=>r.onClose(),showButton:"open-wallet","data-tc-confirm-modal":"true"})},TransactionCanceledModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.transactionCanceled.header",textTranslationKey:"actionModal.transactionCanceled.text",get icon(){return createComponent(ErrorIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-transaction-canceled-modal":"true"}),TransactionSentModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.transactionSent.header",textTranslationKey:"actionModal.transactionSent.text",get icon(){return createComponent(SuccessIcon,{size:"m"})},showButton:"open-wallet",onClose:()=>r.onClose(),"data-tc-transaction-sent-modal":"true"}),ConfirmSignDataModal=r=>{const f=useContext(TonConnectUiContext),[d]=useI18n(),m=()=>f.wallet&&"name"in f.wallet?f.wallet.name:d("common.yourWallet",{},"Your wallet");return createComponent(ActionModal,{headerTranslationKey:"actionModal.signData.header",get headerTranslationValues(){return{name:m()}},textTranslationKey:"actionModal.signData.text",get icon(){return createComponent(LoaderIcon,{size:"m"})},onClose:()=>r.onClose(),showButton:"open-wallet","data-tc-sign-data-confirm-modal":"true"})},SignDataCanceledModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.signDataCanceled.header",get icon(){return createComponent(ErrorIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-sign-data-canceled-modal":"true"}),DataSignedModal=r=>createComponent(ActionModal,{headerTranslationKey:"actionModal.dataSigned.header",get icon(){return createComponent(SuccessIcon,{size:"m"})},onClose:()=>r.onClose(),"data-tc-data-signed-modal":"true"}),ActionsModal=()=>createComponent(Modal,{get opened(){var r;return createMemo(()=>action()!==null)()&&((r=action())==null?void 0:r.openModal)===!0},get enableAndroidBackHandler(){return appState.enableAndroidBackHandler},onClose:()=>setAction(null),showFooter:!1,"data-tc-actions-modal-container":"true",get children(){return createComponent(Switch,{get children(){return[createComponent(Match,{get when(){return action().name==="transaction-sent"},get children(){return createComponent(TransactionSentModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="transaction-canceled"},get children(){return createComponent(TransactionCanceledModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="confirm-transaction"},get children(){return createComponent(ConfirmTransactionModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="data-signed"},get children(){return createComponent(DataSignedModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="sign-data-canceled"},get children(){return createComponent(SignDataCanceledModal,{onClose:()=>setAction(null)})}}),createComponent(Match,{get when(){return action().name==="confirm-sign-data"},get children(){return createComponent(ConfirmSignDataModal,{onClose:()=>setAction(null)})}})]}})}}),SingleWalletModal=()=>{const{locale:r}=useI18n()[1];createEffect(()=>r(appState.language)),createEffect(()=>{getSingleWalletModalIsOpened()&&updateIsMobile()});const f=useContext(ConnectorContext),d=useContext(TonConnectUiContext),[m,v]=createSignal(!1),g=()=>{var x;return((x=appState.connectRequestParameters)==null?void 0:x.state)==="loading"},w=createMemo(()=>{var x;if(!g())return(x=appState.connectRequestParameters)==null?void 0:x.value}),_=x=>{d.closeSingleWalletModal(x)},S=f.onStatusChange(x=>{x&&_("wallet-selected")});return onCleanup(S),onCleanup(()=>{v(!1)}),createComponent(StyledModal,{get opened(){return getSingleWalletModalIsOpened()},get enableAndroidBackHandler(){return appState.enableAndroidBackHandler},onClose:()=>_("action-cancelled"),onClickQuestion:()=>v(x=>!x),showFooter:!0,"data-tc-wallets-modal-container":"true",get children(){return[createComponent(Show,{get when(){return m()},get children(){return createComponent(InfoModal,{onBackClick:()=>v(!1)})}}),createComponent(Show,{get when(){return!m()},get children(){return[createComponent(Show,{get when(){return g()},get children(){return[createComponent(H1Styled$a,{translationKey:"walletModal.loading",children:"Wallets list is loading"}),createComponent(LoaderContainerStyled,{get children(){return createComponent(LoaderIcon,{size:"m"})}})]}}),createComponent(Show,{get when(){return!g()},get children(){return createComponent(Dynamic,{get component(){return isMobile()?MobileConnectionModal:DesktopConnectionModal},get wallet(){return getSingleWalletModalWalletInfo()},get additionalRequest(){return w()},onBackClick:()=>{},backDisabled:!0})}})]}})]}})},App=r=>{const f=createI18nContext(i18nDictionary,appState.language);return defineStylesRoot(),fixMobileSafariActiveTransition(),createComponent(I18nContext.Provider,{value:f,get children(){return createComponent(TonConnectUiContext.Provider,{get value(){return r.tonConnectUI},get children(){return createComponent(ConnectorContext.Provider,{get value(){return appState.connector},get children(){return[createComponent(GlobalStyles,{}),createComponent(ThemeProvider,{theme:themeState,get children(){return[createComponent(Show,{get when(){return appState.buttonRootId},get children(){return createComponent(Portal,{get mount(){return document.getElementById(appState.buttonRootId)},get children(){return createComponent(AccountButton,{})}})}}),createComponent(Dynamic,{component:globalStylesTag,get children(){return[createComponent(WalletsModal,{}),createComponent(SingleWalletModal,{}),createComponent(ActionsModal,{})]}})]}})]}})}})}})},widgetController={openWalletsModal:()=>void setTimeout(()=>setWalletsModalState({status:"opened",closeReason:null})),closeWalletsModal:r=>void setTimeout(()=>setWalletsModalState({status:"closed",closeReason:r})),openSingleWalletModal:r=>{setTimeout(()=>setSingleWalletModalState({status:"opened",closeReason:null,walletInfo:r}))},closeSingleWalletModal:r=>void setTimeout(()=>setSingleWalletModalState({status:"closed",closeReason:r})),openWalletNotSupportFeatureModal:r=>void setTimeout(()=>setWalletsModalState({status:"opened",closeReason:null,type:"wallet-not-support-feature",requiredFeature:r.requiredFeature})),setAction:r=>void setTimeout(()=>setAction(r)),clearAction:()=>void setTimeout(()=>setAction(null)),getSelectedWalletInfo:()=>lastSelectedWalletInfo(),removeSelectedWalletInfo:()=>setLastSelectedWalletInfo(null),renderApp:(r,f)=>render(()=>createComponent(App,{tonConnectUI:f}),document.getElementById(r))};class WalletsModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"setConnectRequestParametersCallback"),__publicField(this,"consumers",[]),__publicField(this,"tracker"),__publicField(this,"state",walletsModalState()),this.connector=f.connector,this.tracker=f.tracker,this.setConnectRequestParametersCallback=f.setConnectRequestParametersCallback,createEffect(()=>{const d=walletsModalState();this.state=d,this.consumers.forEach(m=>m(d))})}open(){return __async(this,null,function*(){this.tracker.trackConnectionStarted();const d=(yield this.connector.getWallets()).find(isWalletInfoCurrentlyEmbedded);return d?this.connectEmbeddedWallet(d):this.openWalletsModal()})}close(f="action-cancelled"){f==="action-cancelled"&&this.tracker.trackConnectionError("Connection was cancelled"),widgetController.closeWalletsModal(f)}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}connectEmbeddedWallet(f){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;(m==null?void 0:m.state)==="loading"?this.setConnectRequestParametersCallback(d):d(m==null?void 0:m.value)}openWalletsModal(){return __async(this,null,function*(){return isInTMA()&&sendExpand(),widgetController.openWalletsModal(),new Promise(f=>{const d=this.onStateChange(m=>{const{status:v}=m;v==="opened"&&(d(),f())})})})}}class TransactionModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"consumers",[]),this.connector=f.connector,createEffect(()=>{const d=action();this.consumers.forEach(m=>m(d))})}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}}class SingleWalletModalManager{constructor(f){__publicField(this,"connector"),__publicField(this,"setConnectRequestParametersCallback"),__publicField(this,"consumers",[]),__publicField(this,"tracker"),__publicField(this,"state",singleWalletModalState()),this.connector=f.connector,this.tracker=f.tracker,this.setConnectRequestParametersCallback=f.setConnectRequestParametersCallback,createEffect(()=>{const d=singleWalletModalState();this.state=d,this.consumers.forEach(m=>m(d))})}open(f){return __async(this,null,function*(){this.tracker.trackConnectionStarted();const d=yield this.connector.getWallets(),m=applyWalletsListConfiguration(d,appState.walletsListConfiguration),v=m.find(isWalletInfoCurrentlyEmbedded);if(!!v)return this.connectEmbeddedWallet(v);const _=m.filter(isWalletInfoRemote).find(b=>eqWalletName(b,f));if(!!_)return this.openSingleWalletModal(_);const x=`Trying to open modal window with unknown wallet "${f}".`;throw this.tracker.trackConnectionError(x),new TonConnectUIError(x)})}close(f="action-cancelled"){f==="action-cancelled"&&this.tracker.trackConnectionError("Connection was cancelled"),widgetController.closeSingleWalletModal("action-cancelled")}onStateChange(f){return this.consumers.push(f),()=>{this.consumers=this.consumers.filter(d=>d!==f)}}connectEmbeddedWallet(f){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;(m==null?void 0:m.state)==="loading"?this.setConnectRequestParametersCallback(d):d(m==null?void 0:m.value)}openSingleWalletModal(f){return __async(this,null,function*(){return isInTMA()&&sendExpand(),widgetController.openSingleWalletModal(f),new Promise(d=>{const m=this.onStateChange(v=>{const{status:g}=v;g==="opened"&&(m(),d())})})})}}class TonConnectUITracker{constructor(f){__publicField(this,"eventPrefix","ton-connect-ui-"),__publicField(this,"tonConnectUiVersion"),__publicField(this,"tonConnectSdkVersion",null),__publicField(this,"eventDispatcher");var d;this.eventDispatcher=(d=f==null?void 0:f.eventDispatcher)!=null?d:new BrowserEventDispatcher,this.tonConnectUiVersion=f.tonConnectUiVersion,this.init().catch()}get version(){return createVersionInfo({ton_connect_sdk_lib:this.tonConnectSdkVersion,ton_connect_ui_lib:this.tonConnectUiVersion})}init(){return __async(this,null,function*(){try{yield this.setRequestVersionHandler(),this.tonConnectSdkVersion=yield this.requestTonConnectSdkVersion()}catch{}})}setRequestVersionHandler(){return __async(this,null,function*(){yield this.eventDispatcher.addEventListener("ton-connect-ui-request-version",()=>__async(this,null,function*(){yield this.eventDispatcher.dispatchEvent("ton-connect-ui-response-version",createResponseVersionEvent(this.tonConnectUiVersion))}))})}requestTonConnectSdkVersion(){return __async(this,null,function*(){return new Promise((f,d)=>__async(this,null,function*(){try{yield this.eventDispatcher.addEventListener("ton-connect-response-version",m=>{f(m.detail.version)},{once:!0}),yield this.eventDispatcher.dispatchEvent("ton-connect-request-version",createRequestVersionEvent())}catch(m){d(m)}}))})}dispatchUserActionEvent(f){var d;try{(d=this.eventDispatcher)==null||d.dispatchEvent(`${this.eventPrefix}${f.type}`,f).catch()}catch{}}trackConnectionStarted(...f){try{const d=createConnectionStartedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionCompleted(...f){try{const d=createConnectionCompletedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionError(...f){try{const d=createConnectionErrorEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringStarted(...f){try{const d=createConnectionRestoringStartedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringCompleted(...f){try{const d=createConnectionRestoringCompletedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackConnectionRestoringError(...f){try{const d=createConnectionRestoringErrorEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDisconnection(...f){try{const d=createDisconnectionEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSentForSignature(...f){try{const d=createTransactionSentForSignatureEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSigned(...f){try{const d=createTransactionSignedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackTransactionSigningFailed(...f){try{const d=createTransactionSigningFailedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSentForSignature(...f){try{const d=createDataSentForSignatureEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSigned(...f){try{const d=createDataSignedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}trackDataSigningFailed(...f){try{const d=createDataSigningFailedEvent(this.version,...f);this.dispatchUserActionEvent(d)}catch{}}}const tonConnectUiVersion="2.2.0";class TonConnectUI{constructor(f){if(__publicField(this,"walletInfoStorage",new WalletInfoStorage),__publicField(this,"preferredWalletStorage",new PreferredWalletStorage),__publicField(this,"tracker"),__publicField(this,"walletInfo",null),__publicField(this,"systemThemeChangeUnsubscribe",null),__publicField(this,"actionsConfiguration"),__publicField(this,"walletsList"),__publicField(this,"_walletsRequiredFeatures"),__publicField(this,"_walletsPreferredFeatures"),__publicField(this,"connectRequestParametersCallback"),__publicField(this,"connector"),__publicField(this,"modal"),__publicField(this,"singleWalletModal"),__publicField(this,"transactionModal"),__publicField(this,"connectionRestored",Promise.resolve(!1)),f&&"connector"in f&&f.connector)this.connector=f.connector;else if(f&&"manifestUrl"in f&&f.manifestUrl)this.connector=new TonConnect({manifestUrl:f.manifestUrl,eventDispatcher:f.eventDispatcher,walletsRequiredFeatures:f.walletsRequiredFeatures});else throw new TonConnectUIError("You have to specify a `manifestUrl` or a `connector` in the options.");this.tracker=new TonConnectUITracker({eventDispatcher:f==null?void 0:f.eventDispatcher,tonConnectUiVersion}),this.modal=new WalletsModalManager({connector:this.connector,tracker:this.tracker,setConnectRequestParametersCallback:v=>{this.connectRequestParametersCallback=v}}),this.singleWalletModal=new SingleWalletModalManager({connector:this.connector,tracker:this.tracker,setConnectRequestParametersCallback:v=>{this.connectRequestParametersCallback=v}}),this.transactionModal=new TransactionModalManager({connector:this.connector}),this._walletsRequiredFeatures=f.walletsRequiredFeatures,this._walletsPreferredFeatures=f.walletsPreferredFeatures,this.walletsList=this.getWallets(),this.walletsList.then(v=>preloadImages(uniq(v.map(g=>g.imageUrl))));const d=this.normalizeWidgetRoot(f==null?void 0:f.widgetRootId);this.subscribeToWalletChange(),(f==null?void 0:f.restoreConnection)!==!1&&(this.connectionRestored=createMacrotaskAsync(()=>__async(this,null,function*(){return this.tracker.trackConnectionRestoringStarted(),yield this.connector.restoreConnection(),this.connector.connected?this.tracker.trackConnectionRestoringCompleted(this.wallet):(this.tracker.trackConnectionRestoringError("Connection was not restored"),this.walletInfoStorage.removeWalletInfo()),this.connector.connected}))),this.uiOptions=mergeOptions(f,{uiPreferences:{theme:"SYSTEM"}});const m=this.preferredWalletStorage.getPreferredWalletAppName();setAppState({connector:this.connector,preferredWalletAppName:m}),widgetController.renderApp(d,this)}static getWallets(){return TonConnect.getWallets()}get walletsRequiredFeatures(){return this._walletsRequiredFeatures}get walletsPreferredFeatures(){return this._walletsPreferredFeatures}get connected(){return this.connector.connected}get account(){return this.connector.account}get wallet(){return this.connector.wallet?__spreadValues(__spreadValues({},this.connector.wallet),this.walletInfo):null}set uiOptions(f){var d,m,v,g,w;this.checkButtonRootExist(f.buttonRootId),this.actionsConfiguration=f.actionsConfiguration,"walletsRequiredFeatures"in f&&(this._walletsRequiredFeatures=f.walletsRequiredFeatures),"walletsPreferredFeatures"in f&&(this._walletsPreferredFeatures=f.walletsPreferredFeatures),(d=f.uiPreferences)!=null&&d.theme?((m=f.uiPreferences)==null?void 0:m.theme)!=="SYSTEM"?((v=this.systemThemeChangeUnsubscribe)==null||v.call(this),setTheme(f.uiPreferences.theme,f.uiPreferences.colorsSet)):(setTheme(getSystemTheme(),f.uiPreferences.colorsSet),this.systemThemeChangeUnsubscribe||(this.systemThemeChangeUnsubscribe=subscribeToThemeChange(setTheme))):(g=f.uiPreferences)!=null&&g.colorsSet&&setColors(f.uiPreferences.colorsSet),(w=f.uiPreferences)!=null&&w.borderRadius&&setBorderRadius(f.uiPreferences.borderRadius),setAppState(_=>{var S,x;const b=mergeOptions(__spreadValues(__spreadValues(__spreadValues(__spreadValues({},f.language&&{language:f.language}),!!((S=f.actionsConfiguration)!=null&&S.returnStrategy)&&{returnStrategy:f.actionsConfiguration.returnStrategy}),!!((x=f.actionsConfiguration)!=null&&x.twaReturnUrl)&&{twaReturnUrl:f.actionsConfiguration.twaReturnUrl}),!!f.walletsListConfiguration&&{walletsListConfiguration:f.walletsListConfiguration}),unwrap(_));return f.buttonRootId!==void 0&&(b.buttonRootId=f.buttonRootId),f.enableAndroidBackHandler!==void 0&&(b.enableAndroidBackHandler=f.enableAndroidBackHandler),b})}setConnectRequestParameters(f){var d;setAppState({connectRequestParameters:f}),((f==null?void 0:f.state)==="ready"||!f)&&((d=this.connectRequestParametersCallback)==null||d.call(this,f==null?void 0:f.value))}getWallets(){return __async(this,null,function*(){return this.connector.getWallets()})}onStatusChange(f,d){return this.connector.onStatusChange(m=>__async(this,null,function*(){if(m){const v=yield this.getSelectedWalletInfo(m);f(__spreadValues(__spreadValues({},m),v||this.walletInfoStorage.getWalletInfo()))}else f(m)}),d)}openModal(){return __async(this,null,function*(){return this.modal.open()})}closeModal(f){this.modal.close(f)}onModalStateChange(f){return this.modal.onStateChange(f)}get modalState(){return this.modal.state}openSingleWalletModal(f){return __async(this,null,function*(){return this.singleWalletModal.open(f)})}closeSingleWalletModal(f){this.singleWalletModal.close(f)}onSingleWalletModalStateChange(f){return this.singleWalletModal.onStateChange(f)}get singleWalletModalState(){return this.singleWalletModal.state}connectWallet(){return __async(this,null,function*(){const d=(yield this.getWallets()).find(isWalletInfoCurrentlyEmbedded);return d?yield this.connectEmbeddedWallet(d):yield this.connectExternalWallet()})}disconnect(){return this.tracker.trackDisconnection(this.wallet,"dapp"),widgetController.clearAction(),widgetController.removeSelectedWalletInfo(),this.walletInfoStorage.removeWalletInfo(),this.connector.disconnect()}sendTransaction(f,d){return __async(this,null,function*(){if(this.tracker.trackTransactionSentForSignature(this.wallet,f),!this.connected)throw this.tracker.trackTransactionSigningFailed(this.wallet,f,"Wallet was not connected"),new TonConnectUIError("Connect wallet to send a transaction.");isInTMA()&&sendExpand();const{notifications:m,modals:v,returnStrategy:g,twaReturnUrl:w}=this.getModalsAndNotificationsConfiguration(d);widgetController.setAction({name:"confirm-transaction",showNotification:m.includes("before"),openModal:v.includes("before"),sent:!1});const _=new AbortController,S=()=>{_.signal.aborted||(widgetController.setAction({name:"confirm-transaction",showNotification:m.includes("before"),openModal:v.includes("before"),sent:!0}),this.redirectAfterRequestSent({returnStrategy:g,twaReturnUrl:w}))},x=this.onTransactionModalStateChange(b=>{b!=null&&b.openModal||(x(),b||_.abort())});try{const b=yield this.waitForSendTransaction({transaction:f,signal:_.signal},S);return this.tracker.trackTransactionSigned(this.wallet,f,b),widgetController.setAction({name:"transaction-sent",showNotification:m.includes("success"),openModal:v.includes("success")}),b}catch(b){throw b instanceof WalletNotSupportFeatureError?(widgetController.clearAction(),widgetController.openWalletNotSupportFeatureModal(b.cause),b):(widgetController.setAction({name:"transaction-canceled",showNotification:m.includes("error"),openModal:v.includes("error")}),b instanceof TonConnectError?b:new TonConnectUIError("Unhandled error:"+b))}finally{x()}})}signData(f){return __async(this,null,function*(){if(this.tracker.trackDataSentForSignature(this.wallet,f),!this.connected)throw this.tracker.trackDataSigningFailed(this.wallet,f,"Wallet was not connected"),new TonConnectUIError("Connect wallet to send a transaction.");isInTMA()&&sendExpand();const{notifications:d,modals:m,returnStrategy:v,twaReturnUrl:g}=this.getModalsAndNotificationsConfiguration();widgetController.setAction({name:"confirm-sign-data",showNotification:d.includes("before"),openModal:m.includes("before"),signed:!1});const w=new AbortController,_=()=>{w.signal.aborted||(widgetController.setAction({name:"confirm-sign-data",showNotification:d.includes("before"),openModal:m.includes("before"),signed:!0}),this.redirectAfterRequestSent({returnStrategy:v,twaReturnUrl:g}))},S=this.onTransactionModalStateChange(x=>{x!=null&&x.openModal||(S(),x||w.abort())});try{const x=yield this.waitForSignData({data:f,signal:new AbortController().signal},_);return this.tracker.trackDataSigned(this.wallet,f,x),widgetController.setAction({name:"data-signed",showNotification:d.includes("success"),openModal:m.includes("success")}),x}catch(x){throw x instanceof WalletNotSupportFeatureError?(widgetController.clearAction(),widgetController.openWalletNotSupportFeatureModal(x.cause),x):(widgetController.setAction({name:"sign-data-canceled",showNotification:d.includes("error"),openModal:m.includes("error")}),x instanceof TonConnectError?x:new TonConnectUIError("Unhandled error:"+x))}finally{S()}})}redirectAfterRequestSent({returnStrategy:f,twaReturnUrl:d}){this.walletInfo&&"universalLink"in this.walletInfo&&(this.walletInfo.openMethod==="universal-link"||this.walletInfo.openMethod==="custom-deeplink")&&(isTelegramUrl(this.walletInfo.universalLink)?redirectToTelegram(this.walletInfo.universalLink,{returnStrategy:f,twaReturnUrl:d||appState.twaReturnUrl,forceRedirect:!1}):redirectToWallet(this.walletInfo.universalLink,this.walletInfo.deepLink,{returnStrategy:f,forceRedirect:!1},()=>{}))}connectEmbeddedWallet(f){return __async(this,null,function*(){const d=v=>{setLastSelectedWalletInfo(f),this.connector.connect({jsBridgeKey:f.jsBridgeKey},v)},m=appState.connectRequestParameters;return(m==null?void 0:m.state)==="loading"?this.connectRequestParametersCallback=d:d(m==null?void 0:m.value),yield this.waitForWalletConnection({ignoreErrors:!1})})}connectExternalWallet(){return __async(this,null,function*(){const f=new AbortController;widgetController.openWalletsModal();const d=this.onModalStateChange(m=>{const{status:v,closeReason:g}=m;v!=="opened"&&(d(),g==="action-cancelled"&&f.abort())});return yield this.waitForWalletConnection({ignoreErrors:!0,signal:f.signal})})}waitForWalletConnection(f){return __async(this,null,function*(){return new Promise((d,m)=>{this.tracker.trackConnectionStarted();const{ignoreErrors:v=!1,signal:g=null}=f;if(g&&g.aborted)return this.tracker.trackConnectionError("Connection was cancelled"),m(new TonConnectUIError("Wallet was not connected"));const w=x=>__async(this,null,function*(){if(x)this.tracker.trackConnectionCompleted(x),S(),d(x);else{if(this.tracker.trackConnectionError("Connection was cancelled"),v)return;S(),m(new TonConnectUIError("Wallet was not connected"))}}),_=x=>{this.tracker.trackConnectionError(x.message),!v&&(S(),m(x))},S=this.onStatusChange(x=>w(x),x=>_(x));g&&g.addEventListener("abort",()=>{S(),m(new TonConnectUIError("Wallet was not connected"))},{once:!0})})})}waitForSendTransaction(f,d){return __async(this,null,function*(){return new Promise((m,v)=>{const{transaction:g,signal:w}=f;if(w.aborted)return this.tracker.trackTransactionSigningFailed(this.wallet,g,"Transaction was cancelled"),v(new TonConnectUIError("Transaction was not sent"));const _=b=>__async(this,null,function*(){m(b)}),S=b=>{v(b)},x=()=>{this.tracker.trackTransactionSigningFailed(this.wallet,g,"Transaction was cancelled"),v(new TonConnectUIError("Transaction was not sent"))};w.addEventListener("abort",x,{once:!0}),this.connector.sendTransaction(g,{onRequestSent:d,signal:w}).then(b=>(w.removeEventListener("abort",x),_(b))).catch(b=>(w.removeEventListener("abort",x),S(b)))})})}waitForSignData(f,d){return __async(this,null,function*(){return new Promise((m,v)=>{const{data:g,signal:w}=f;if(w.aborted)return this.tracker.trackDataSigningFailed(this.wallet,g,"SignData was cancelled"),v(new TonConnectUIError("SignData was not sent"));const _=b=>__async(this,null,function*(){m(b)}),S=b=>{v(b)},x=()=>{this.tracker.trackDataSigningFailed(this.wallet,g,"SignData was cancelled"),v(new TonConnectUIError("SignData was not sent"))};w.addEventListener("abort",x,{once:!0}),this.connector.signData(g,{onRequestSent:d,signal:w}).then(b=>_(b)).catch(b=>S(b))})})}onTransactionModalStateChange(f){return this.transactionModal.onStateChange(f)}subscribeToWalletChange(){this.connector.onStatusChange(f=>__async(this,null,function*(){var d;f?(yield this.updateWalletInfo(f),this.setPreferredWalletAppName(((d=this.walletInfo)==null?void 0:d.appName)||f.device.appName)):this.walletInfoStorage.removeWalletInfo()}))}setPreferredWalletAppName(f){this.preferredWalletStorage.setPreferredWalletAppName(f),setAppState({preferredWalletAppName:f})}getSelectedWalletInfo(f){return __async(this,null,function*(){let d=widgetController.getSelectedWalletInfo();if(!d)return null;let m;if("name"in d)m=d;else{const g=applyWalletsListConfiguration(yield this.walletsList,appState.walletsListConfiguration).find(w=>eqWalletName(w,f.device.appName));if(!g)throw new TonConnectUIError(`Cannot find WalletInfo for the '${f.device.appName}' wallet`);m=__spreadValues(__spreadValues({},g),d)}return m})}updateWalletInfo(f){return __async(this,null,function*(){const d=yield this.getSelectedWalletInfo(f);if(d){this.walletInfo=d,this.walletInfoStorage.setWalletInfo(d);return}const m=this.walletInfoStorage.getWalletInfo();if(m){this.walletInfo=m;return}this.walletInfo=(yield this.walletsList).find(v=>eqWalletName(v,f.device.appName))||null})}normalizeWidgetRoot(f){if(!f||!document.getElementById(f)){f="tc-widget-root";const d=document.createElement("div");d.id=f,document.body.appendChild(d)}return f}checkButtonRootExist(f){if(f!=null&&!document.getElementById(f))throw new TonConnectUIError(`${f} element not found in the document.`)}getModalsAndNotificationsConfiguration(f){var d,m,v,g,w,_;const S=["before","success","error"];let x=S;(d=this.actionsConfiguration)!=null&&d.notifications&&((m=this.actionsConfiguration)==null?void 0:m.notifications)!=="all"&&(x=this.actionsConfiguration.notifications),f!=null&&f.notifications&&(f.notifications==="all"?x=S:x=f.notifications);let b=["before"];(v=this.actionsConfiguration)!=null&&v.modals&&(this.actionsConfiguration.modals==="all"?b=S:b=this.actionsConfiguration.modals),f!=null&&f.modals&&(f.modals==="all"?b=S:b=f.modals);const C=(f==null?void 0:f.returnStrategy)||((g=this.actionsConfiguration)==null?void 0:g.returnStrategy)||"back",E=(f==null?void 0:f.twaReturnUrl)||((w=this.actionsConfiguration)==null?void 0:w.twaReturnUrl);let M=(f==null?void 0:f.skipRedirectToWallet)||((_=this.actionsConfiguration)==null?void 0:_.skipRedirectToWallet)||"ios";return isInTMA()&&(M="never"),{notifications:x,modals:b,returnStrategy:C,twaReturnUrl:E,skipRedirectToWallet:M}}}const DEFAULT_MANIFEST_URL="https://miniapp.spinfi.me/tonconnect-manifest.json";let tonConnectUIInstance=null,currentManifestUrl=null;class DefaultTonWalletProvider{constructor(f,d){this.bindWalletCallback=d;const m=f||DEFAULT_MANIFEST_URL;if(!tonConnectUIInstance||currentManifestUrl!==m)try{tonConnectUIInstance=new TonConnectUI({manifestUrl:m}),currentManifestUrl=m}catch{throw new Error("创建TonConnectUI实例失败")}this.ui=tonConnectUIInstance}isConnected(){var f;try{return!!((f=this.ui)!=null&&f.connected)}catch{return!1}}async reportWalletAddress(){const f=this.getUserFriendlyAddress();if(f&&this.bindWalletCallback)try{await this.bindWalletCallback(f)}catch{}}async connect(){if(this.isConnected())return await this.reportWalletAddress(),!0;try{return await new Promise((f,d)=>{this.ui.openModal();const m=this.ui.onStatusChange(()=>{this.isConnected()&&(m(),f())});setTimeout(()=>{this.isConnected()||(m(),d(new Error("连接钱包超时")))},3e5)}),await this.reportWalletAddress(),this.isConnected()}catch{return!1}}getUserFriendlyAddress(){var m,v,g;const f=this.ui,d=((v=(m=f==null?void 0:f.wallet)==null?void 0:m.account)==null?void 0:v.address)||((g=f==null?void 0:f.account)==null?void 0:g.address)||null;return d?toUserFriendlyAddress(d):null}async sendTonTransaction(f){if(!this.isConnected()&&!await this.connect())throw new Error("钱包未连接");const d=await this.ui.sendTransaction(f),m=d==null?void 0:d.boc;let v;if(m)try{v=m.substring(0,16)}catch{}return{transferHash:v,boc:m,raw:d}}async sendUsdtTransaction(f){if(!this.isConnected()&&!await this.connect())throw new Error("钱包未连接");const d=await this.ui.sendTransaction(f),m=d==null?void 0:d.boc;let v;if(m)try{v=m.substring(0,16)}catch{}return{transferHash:v,boc:m,raw:d}}async disconnect(){try{const f=this.ui;if(f!=null&&f.disconnect)await f.disconnect();else if(f!=null&&f.onStatusChange){const d=f.onStatusChange(()=>{});d&&d()}return!this.isConnected()}catch{return!1}}}class HmTrackingSDK{constructor(f){this.options=f,this.token=null,this.user=null;const d=this.options||{};this.storage=new NamespacedStorage(d.storageKeyPrefix||"hm_tracking_sdk"),this.token=this.storage.get("token");const m=d.baseURL||TEST_BASE_URL;this.http=new HttpClient({getToken:()=>this.token,onAuthError:()=>this.clearAuth(),baseURL:m,getAppId:()=>this.options&&this.options.appId||null}),this.api=new APIService(this.http),this.hmAdManager=new HmAdManager({autoInjectScript:!0}),this.adMonitor=new AdMonitor(v=>this.api.adMonitor(v)),this.tonWallet=new DefaultTonWalletProvider(d.tonConnectManifestUrl,this.bindWallet.bind(this))}async init(){const f=isTelegramEnv();try{const d=this.options||{},m=f?getTelegramUserUnsafe():null;if(m?this.user=m:d.customUser?this.user=d.customUser:typeof window<"u"?this.user=getAnonymousBrowserUser():this.user=getDefaultMockUser(),!this.user)throw new Error("未获取到用户信息:请在非 Telegram 环境提供 customUser");this.clearAuth(),await this.auth();try{await this.hmAdManager.init()}catch{}}catch(d){throw d}}async auth(){var f,d;try{const m={...this.user},v=(f=this.options)==null?void 0:f.notifyUrl;v&&(m.notifyUrl=v);const g=await this.api.auth(m);if(g.code!==1)throw new Error(g.msg||"鉴权失败");const w=(d=g.data)==null?void 0:d.token;if(!w)throw new Error("鉴权未返回 token");this.token=w,this.storage.set("token",w)}catch(m){throw m}}clearAuth(){this.token=null,this.storage.remove("token")}ensureTelegramEnvOrThrow(){if(!isTelegramEnv())throw new Error("支付相关功能仅支持在 Telegram 环境内使用")}async getAdPositionConfig(f){const d=await this.api.getAdPositionConfig(String(f));if(d.code!==1)throw new Error(d.msg||"获取广告位配置失败");return d.data||[]}async createAd(f){const d=await this.api.createAd(f);if(d.code!==1)throw new Error(d.msg||"创建广告失败");const m=d.data;return m!=null&&m.spaceId&&await this.hmAdManager.setSpace(String(m.spaceId)),m}async showHmAdByPosition(f,d){const m=await this.getAdPositionConfig(f);if(!m||m.length===0)throw new Error("未找到广告位配置");const v=m[0],g=await this.createAd({adId:v.adId,adPositionId:v.adPositionId}),w={start:g.start,show:g.show,error:g.error,close:g.close,reward:g.reward};await this.showHmAdWithMonitor(w,g.adShowId,d)}async showHmAdWithMonitor(f,d,m){const v=d||"";await this.adMonitor.send(f.start,v),await this.adMonitor.send(f.show,v);try{await this.hmAdManager.show(),await this.adMonitor.send(f.close,v);const g=await this.adMonitor.send(f.reward,v);m!=null&&m.onSuccess&&await m.onSuccess(g)}catch(g){throw await this.adMonitor.send(f.error,v),m!=null&&m.onError&&await m.onError(g),g}}async showHmPopupAd(f,d,m){const v=d||"";await this.adMonitor.send(f.start,v),await this.adMonitor.send(f.show,v);try{await this.hmAdManager.showPopup(),await this.adMonitor.send(f.close,v);const g=await this.adMonitor.send(f.reward,v);m!=null&&m.onSuccess&&await m.onSuccess(g)}catch(g){throw await this.adMonitor.send(f.error,v),m!=null&&m.onError&&await m.onError(g),g}}async showHmInAppAd(f,d,m,v){const g=m||"";await this.adMonitor.send(f.start,g),await this.adMonitor.send(f.show,g);try{await this.hmAdManager.showInApp(d),await this.adMonitor.send(f.close,g);const w=await this.adMonitor.send(f.reward,g);v!=null&&v.onSuccess&&await v.onSuccess(w)}catch(w){throw await this.adMonitor.send(f.error,g),v!=null&&v.onError&&await v.onError(w),w}}async bindWallet(f){try{if((await this.api.bindWalletReq({wallet:f,forceBind:!0})).code!==1)return}catch(d){throw d}}async disconnectWallet(){try{return this.tonWallet?(await this.tonWallet.disconnect(),!this.tonWallet.isConnected()):!0}catch{return!1}}async connectWallet(){return this.tonWallet?await this.tonWallet.connect():!1}isWalletConnected(){var f;return!!((f=this.tonWallet)!=null&&f.isConnected())}async ensureWalletConnected(){return this.ensureTelegramEnvOrThrow(),this.tonWallet?await this.tonWallet.connect():!1}async getSupportedPayModes(){const f=await this.api.merchantPayModeList();if(f.code!==1)throw new Error(f.msg||"获取支付方式失败");const d=f.data;return Array.isArray(d)?{payModeList:d}:{payModeList:Array.isArray(d==null?void 0:d.payModeList)?d.payModeList:[]}}async merchantPayQueryResult(f){const d=await this.api.merchantPayQueryResult(f);if(d.code!==1)throw new Error(d.msg||"查询支付结果失败");return d.data}async finishPayment(f,d,m=""){const v={orderSn:f,status:d,transferHash:m},g=await this.api.merchantPayFinish(v);if(g.code!==1)throw new Error(g.msg||"支付完成回调失败");return g.data}async payByMerchant(f){var _,S,x;this.ensureTelegramEnvOrThrow();const d=(_=f.currencyName)==null?void 0:_.toUpperCase(),m=await this.api.merchantPayCreate(f);if(m.code!==1)throw new Error(m.msg||"创建支付订单失败");const v=m.data;if(d==="STARS"&&v.payUrl)try{return await new Promise((C,E)=>{WebApp.openInvoice(v.payUrl,M=>{M==="paid"?C():E(new Error(`星币支付未完成: ${M||"未知状态"}`))})}),await this.finishPayment(v.orderSn,"success")}catch{return await this.finishPayment(v.orderSn,"failed")}if(!this.tonWallet||!this.tonWallet.isConnected())throw new Error("请先连接钱包");if(!((x=(S=v.transferData)==null?void 0:S.messages)==null?void 0:x[0]))throw new Error("订单未返回链上消息");let w;try{if(d==="TON")w=await this.tonWallet.sendTonTransaction(v.transferData);else if(d==="USDT")w=await this.tonWallet.sendUsdtTransaction(v.transferData);else throw new Error("暂不支持的币种");const b=w==null?void 0:w.transferHash;return await this.finishPayment(v.orderSn,"success",b||"")}catch{return await this.finishPayment(v.orderSn,"failed")}}}var AdPositionName=(r=>(r.GameRewardedAdPosition="game_rewarded_ad_position",r.TaskRewardedAdPosition="task_rewarded_ad_position",r.TaskListAdPosition="task_list_ad_position",r))(AdPositionName||{});globalThis.Buffer=Buffer$1,globalThis.process=process$1,globalThis.global=globalThis,exports.AdPositionName=AdPositionName,exports.HmTrackingSDK=HmTrackingSDK,exports.getAnonymousBrowserUser=getAnonymousBrowserUser,exports.getDefaultMockUser=getDefaultMockUser,exports.getTelegramUserUnsafe=getTelegramUserUnsafe,exports.isTelegramEnv=isTelegramEnv,Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"})}));
@@ -32,7 +32,7 @@ export class HmTrackingSDK {
32
32
  this.api = new APIService(this.http);
33
33
  this.hmAdManager = new HmAdManager({ autoInjectScript: true });
34
34
  this.adMonitor = new AdMonitor((params) => this.api.adMonitor(params));
35
- this.tonWallet = new DefaultTonWalletProvider(this.bindWallet.bind(this));
35
+ this.tonWallet = new DefaultTonWalletProvider(opts.tonConnectManifestUrl, this.bindWallet.bind(this));
36
36
  }
37
37
  async init() {
38
38
  const inTelegram = isTelegramEnv();
@@ -1 +1 @@
1
- {"version":3,"file":"HmTrackingSDK.js","sourceRoot":"","sources":["../../src/sdk/HmTrackingSDK.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpClient, PROD_BASE_URL, TEST_BASE_URL } from \"./http.js\";\r\nimport { NamespacedStorage } from \"./storage.js\";\r\nimport { APIService } from \"./api.js\";\r\nimport { HmAdManager } from \"./monetag.js\";\r\nimport { AdMonitor } from \"./adMonitor.js\";\r\nimport {\r\n SDKInitOptions,\r\n TelegramUserInfo,\r\n AdPositionName,\r\n AdConfigItem,\r\n CreateAdParams,\r\n AdResponseData,\r\n MonitorUrls,\r\n MerchantPayCreateRequest,\r\n MerchantPayCreateResponseData,\r\n MerchantPayFinishRequest,\r\n MerchantPayModeListData,\r\n TonWalletProvider,\r\n MerchantPayFinishResponseData,\r\n MerchantPayQueryResultRequest,\r\n MerchantPayQueryResultResponseData,\r\n AdCallbacks,\r\n} from \"./types.js\";\r\nimport {\r\n getTelegramUserUnsafe,\r\n isTelegramEnv,\r\n getDefaultMockUser,\r\n getAnonymousBrowserUser,\r\n} from \"./telegram.js\";\r\nimport WebApp from \"@twa-dev/sdk\";\r\nimport { DefaultTonWalletProvider } from \"./tonWalletProvider.js\";\r\n\r\n/**\r\n * HmTrackingSDK\r\n * - Telegram 环境自动读取用户信息,否则使用自定义用户\r\n * - /user/auth 鉴权并缓存 token\r\n * - 封装广告位配置获取与广告创建/展示\r\n * - 集成 Monetag (脚本注入 + 展示)\r\n * - 集成 Telegram 钱包支付(基于商户支付接口)\r\n */\r\nexport class HmTrackingSDK {\r\n private storage: NamespacedStorage;\r\n private http: HttpClient;\r\n private api: APIService;\r\n private token: string | null = null;\r\n private user: TelegramUserInfo | null = null;\r\n private hmAdManager: HmAdManager;\r\n private adMonitor: AdMonitor;\r\n private tonWallet?: TonWalletProvider;\r\n\r\n constructor(private options?: SDKInitOptions) {\r\n const opts = this.options || {};\r\n this.storage = new NamespacedStorage(\r\n opts.storageKeyPrefix || \"hm_tracking_sdk\"\r\n );\r\n this.token = this.storage.get<string>(\"token\");\r\n\r\n const baseURL = opts.baseURL || TEST_BASE_URL;\r\n this.http = new HttpClient({\r\n getToken: () => this.token,\r\n onAuthError: () => this.clearAuth(),\r\n baseURL,\r\n getAppId: () =>\r\n (this.options && (this.options as SDKInitOptions).appId) || null,\r\n });\r\n this.api = new APIService(this.http);\r\n this.hmAdManager = new HmAdManager({ autoInjectScript: true });\r\n this.adMonitor = new AdMonitor((params) => this.api.adMonitor(params));\r\n this.tonWallet = new DefaultTonWalletProvider(this.bindWallet.bind(this));\r\n }\r\n\r\n async init(): Promise<void> {\r\n const inTelegram = isTelegramEnv();\r\n\r\n try {\r\n const opts = this.options || {};\r\n const tgUser = inTelegram ? getTelegramUserUnsafe() : null;\r\n // 优先级:Telegram 环境用户 > 自定义用户 > 浏览器匿名用户 > mock 用户\r\n if (tgUser) {\r\n this.user = tgUser;\r\n console.log(\"使用 Telegram 环境用户信息: 成功\");\r\n } else if (opts.customUser) {\r\n this.user = opts.customUser;\r\n console.log(\"使用自定义用户信息\");\r\n } else if (typeof window !== \"undefined\") {\r\n this.user = getAnonymousBrowserUser();\r\n console.log(\"使用浏览器匿名用户信息\");\r\n } else {\r\n this.user = getDefaultMockUser();\r\n console.log(\"使用默认Mock用户信息\");\r\n }\r\n\r\n if (!this.user) {\r\n throw new Error(\r\n \"未获取到用户信息:请在非 Telegram 环境提供 customUser\"\r\n );\r\n }\r\n\r\n // 清理旧 token,开始认证\r\n this.clearAuth();\r\n await this.auth();\r\n\r\n try {\r\n await this.hmAdManager.init();\r\n } catch (error) {\r\n console.error(\"广告管理器初始化失败,但继续执行其他初始化:\", error);\r\n }\r\n } catch (error) {\r\n console.error(\"SDK初始化失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 调用 /user/auth 并持久化 token\r\n */\r\n private async auth(): Promise<void> {\r\n try {\r\n const payload: Record<string, unknown> = {\r\n ...(this.user as Record<string, unknown>),\r\n };\r\n const notifyUrl = (this.options as SDKInitOptions | undefined)?.notifyUrl;\r\n if (notifyUrl) payload[\"notifyUrl\"] = notifyUrl;\r\n const res = await this.api.auth(payload);\r\n if (res.code !== 1) throw new Error(res.msg || \"鉴权失败\");\r\n const token = (res.data as any)?.token as string | undefined;\r\n if (!token) throw new Error(\"鉴权未返回 token\");\r\n this.token = token;\r\n this.storage.set(\"token\", token);\r\n } catch (error) {\r\n console.error(\"auth认证失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 清空鉴权状态\r\n */\r\n private clearAuth() {\r\n this.token = null;\r\n this.storage.remove(\"token\");\r\n }\r\n\r\n /**\r\n * 支付相关方法调用前校验 Telegram 环境\r\n */\r\n private ensureTelegramEnvOrThrow() {\r\n if (!isTelegramEnv()) {\r\n throw new Error(\"支付相关功能仅支持在 Telegram 环境内使用\");\r\n }\r\n }\r\n\r\n /**\r\n * 获取广告位配置\r\n */\r\n private async getAdPositionConfig(\r\n adPositionName: AdPositionName | string\r\n ): Promise<AdConfigItem[]> {\r\n const res = await this.api.getAdPositionConfig(String(adPositionName));\r\n if (res.code !== 1) throw new Error(res.msg || \"获取广告位配置失败\");\r\n return res.data || [];\r\n }\r\n\r\n /**\r\n * 创建广告\r\n */\r\n private async createAd(params: CreateAdParams): Promise<AdResponseData> {\r\n const res = await this.api.createAd(params);\r\n if (res.code !== 1) throw new Error(res.msg || \"创建广告失败\");\r\n const data = res.data as AdResponseData;\r\n\r\n if (data?.spaceId) {\r\n await this.hmAdManager.setSpace(String(data.spaceId));\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 展示广告(插屏/激励)传入 adPositionName,SDK 将自动完成:获取配置 -> 创建广告 -> 展示\r\n * - 自动调用监测 URL(第一个链接走 /v2/ad/monitor,其余直接 GET)\r\n */\r\n async showHmAdByPosition(\r\n adPositionName: AdPositionName | string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const configs = await this.getAdPositionConfig(adPositionName);\r\n if (!configs || configs.length === 0) {\r\n throw new Error(\"未找到广告位配置\");\r\n }\r\n const cfg = configs[0];\r\n const ad = await this.createAd({\r\n adId: cfg.adId,\r\n adPositionId: cfg.adPositionId,\r\n });\r\n const monitor: MonitorUrls = {\r\n start: ad.start,\r\n show: ad.show,\r\n error: ad.error,\r\n close: ad.close,\r\n reward: ad.reward,\r\n };\r\n await this.showHmAdWithMonitor(monitor, ad.adShowId, callbacks);\r\n }\r\n\r\n private async showHmAdWithMonitor(\r\n monitor: MonitorUrls,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.show();\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmPopupAd(\r\n monitor: MonitorUrls,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showPopup();\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmInAppAd(\r\n monitor: MonitorUrls,\r\n inAppOptions?: any,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showInApp(inAppOptions);\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * 绑定钱包地址到服务器\r\n */\r\n private async bindWallet(walletAddress: string): Promise<void> {\r\n try {\r\n const res = await this.api.bindWalletReq({\r\n wallet: walletAddress,\r\n forceBind: true,\r\n });\r\n if (res.code !== 1) {\r\n console.warn(\"钱包地址绑定失败:\", res.msg);\r\n return;\r\n }\r\n } catch (error) {\r\n console.error(\"钱包地址绑定请求失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnectWallet(): Promise<boolean> {\r\n try {\r\n if (!this.tonWallet) return true;\r\n await this.tonWallet.disconnect();\r\n return !this.tonWallet.isConnected();\r\n } catch (e) {\r\n console.error(\"断开 Ton 钱包失败:\", e);\r\n return false;\r\n }\r\n }\r\n\r\n async connectWallet(): Promise<boolean> {\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n isWalletConnected(): boolean {\r\n return !!this.tonWallet?.isConnected();\r\n }\r\n\r\n async ensureWalletConnected(): Promise<boolean> {\r\n this.ensureTelegramEnvOrThrow();\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n async getSupportedPayModes(): Promise<MerchantPayModeListData> {\r\n const res = await this.api.merchantPayModeList();\r\n if (res.code !== 1) throw new Error(res.msg || \"获取支付方式失败\");\r\n const raw: any = res.data as any;\r\n if (Array.isArray(raw)) {\r\n return { payModeList: raw };\r\n }\r\n const list = Array.isArray(raw?.payModeList) ? raw.payModeList : [];\r\n return { payModeList: list };\r\n }\r\n\r\n async merchantPayQueryResult(\r\n data: MerchantPayQueryResultRequest\r\n ): Promise<MerchantPayQueryResultResponseData> {\r\n const res = await this.api.merchantPayQueryResult(data);\r\n if (res.code !== 1) throw new Error(res.msg || \"查询支付结果失败\");\r\n return res.data;\r\n }\r\n\r\n /**\r\n * 通用支付完成回调\r\n * @param orderSn 订单号\r\n * @param status 支付状态 success/failed/cancelled\r\n * @param transferHash 交易哈希(可选)\r\n */\r\n private async finishPayment(\r\n orderSn: string,\r\n status: string,\r\n transferHash: string = \"\"\r\n ): Promise<MerchantPayFinishResponseData> {\r\n const finishPayload: MerchantPayFinishRequest = {\r\n orderSn,\r\n status,\r\n transferHash,\r\n };\r\n const finishRes = await this.api.merchantPayFinish(finishPayload);\r\n if (finishRes.code !== 1) {\r\n throw new Error(finishRes.msg || \"支付完成回调失败\");\r\n }\r\n return finishRes.data;\r\n }\r\n\r\n async payByMerchant(\r\n data: MerchantPayCreateRequest\r\n ): Promise<MerchantPayFinishResponseData> {\r\n this.ensureTelegramEnvOrThrow();\r\n const upperCurrency = data.currencyName?.toUpperCase();\r\n const createRes = await this.api.merchantPayCreate(data);\r\n if (createRes.code !== 1)\r\n throw new Error(createRes.msg || \"创建支付订单失败\");\r\n const order = createRes.data;\r\n\r\n // Stars 支付:无需连接钱包,直接拉起发票(若 payUrl 存在)\r\n if (upperCurrency === \"STARS\" && order.payUrl) {\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n WebApp.openInvoice(order.payUrl as any, (status) => {\r\n // status 可能是 \"paid\", \"cancelled\", \"failed\" 等\r\n if (status === \"paid\") {\r\n resolve();\r\n } else {\r\n reject(new Error(`星币支付未完成: ${status || \"未知状态\"}`));\r\n }\r\n });\r\n });\r\n // 星币支付成功后调用支付完成回调并返回结果\r\n const finishRes = await this.finishPayment(order.orderSn, \"success\");\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n\r\n // 其他币种需已连接钱包(仅判断连接状态,不主动连接或上报)\r\n if (!this.tonWallet || !this.tonWallet.isConnected()) {\r\n throw new Error(\"请先连接钱包\");\r\n }\r\n const msg = order.transferData?.messages?.[0];\r\n if (!msg) throw new Error(\"订单未返回链上消息\");\r\n\r\n let result;\r\n try {\r\n if (upperCurrency === \"TON\") {\r\n result = await this.tonWallet.sendTonTransaction(order.transferData);\r\n } else if (upperCurrency === \"USDT\") {\r\n result = await this.tonWallet.sendUsdtTransaction(order.transferData);\r\n } else {\r\n // 其他币种暂不处理\r\n throw new Error(\"暂不支持的币种\");\r\n }\r\n\r\n const transferHash = (result as any)?.transferHash;\r\n const finishRes = await this.finishPayment(\r\n order.orderSn,\r\n \"success\",\r\n transferHash || \"\"\r\n );\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HmTrackingSDK.js","sourceRoot":"","sources":["../../src/sdk/HmTrackingSDK.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpClient, PROD_BASE_URL, TEST_BASE_URL } from \"./http.js\";\r\nimport { NamespacedStorage } from \"./storage.js\";\r\nimport { APIService } from \"./api.js\";\r\nimport { HmAdManager } from \"./monetag.js\";\r\nimport { AdMonitor } from \"./adMonitor.js\";\r\nimport {\r\n SDKInitOptions,\r\n TelegramUserInfo,\r\n AdPositionName,\r\n AdConfigItem,\r\n CreateAdParams,\r\n AdResponseData,\r\n MonitorUrls,\r\n MerchantPayCreateRequest,\r\n MerchantPayCreateResponseData,\r\n MerchantPayFinishRequest,\r\n MerchantPayModeListData,\r\n TonWalletProvider,\r\n MerchantPayFinishResponseData,\r\n MerchantPayQueryResultRequest,\r\n MerchantPayQueryResultResponseData,\r\n AdCallbacks,\r\n} from \"./types.js\";\r\nimport {\r\n getTelegramUserUnsafe,\r\n isTelegramEnv,\r\n getDefaultMockUser,\r\n getAnonymousBrowserUser,\r\n} from \"./telegram.js\";\r\nimport WebApp from \"@twa-dev/sdk\";\r\nimport { DefaultTonWalletProvider } from \"./tonWalletProvider.js\";\r\n\r\n/**\r\n * HmTrackingSDK\r\n * - Telegram 环境自动读取用户信息,否则使用自定义用户\r\n * - /user/auth 鉴权并缓存 token\r\n * - 封装广告位配置获取与广告创建/展示\r\n * - 集成 Monetag (脚本注入 + 展示)\r\n * - 集成 Telegram 钱包支付(基于商户支付接口)\r\n */\r\nexport class HmTrackingSDK {\r\n private storage: NamespacedStorage;\r\n private http: HttpClient;\r\n private api: APIService;\r\n private token: string | null = null;\r\n private user: TelegramUserInfo | null = null;\r\n private hmAdManager: HmAdManager;\r\n private adMonitor: AdMonitor;\r\n private tonWallet?: TonWalletProvider;\r\n\r\n constructor(private options?: SDKInitOptions) {\r\n const opts = this.options || {};\r\n this.storage = new NamespacedStorage(\r\n opts.storageKeyPrefix || \"hm_tracking_sdk\"\r\n );\r\n this.token = this.storage.get<string>(\"token\");\r\n\r\n const baseURL = opts.baseURL || TEST_BASE_URL;\r\n this.http = new HttpClient({\r\n getToken: () => this.token,\r\n onAuthError: () => this.clearAuth(),\r\n baseURL,\r\n getAppId: () =>\r\n (this.options && (this.options as SDKInitOptions).appId) || null,\r\n });\r\n this.api = new APIService(this.http);\r\n this.hmAdManager = new HmAdManager({ autoInjectScript: true });\r\n this.adMonitor = new AdMonitor((params) => this.api.adMonitor(params));\r\n this.tonWallet = new DefaultTonWalletProvider(\r\n opts.tonConnectManifestUrl,\r\n this.bindWallet.bind(this)\r\n );\r\n }\r\n\r\n async init(): Promise<void> {\r\n const inTelegram = isTelegramEnv();\r\n\r\n try {\r\n const opts = this.options || {};\r\n const tgUser = inTelegram ? getTelegramUserUnsafe() : null;\r\n // 优先级:Telegram 环境用户 > 自定义用户 > 浏览器匿名用户 > mock 用户\r\n if (tgUser) {\r\n this.user = tgUser;\r\n console.log(\"使用 Telegram 环境用户信息: 成功\");\r\n } else if (opts.customUser) {\r\n this.user = opts.customUser;\r\n console.log(\"使用自定义用户信息\");\r\n } else if (typeof window !== \"undefined\") {\r\n this.user = getAnonymousBrowserUser();\r\n console.log(\"使用浏览器匿名用户信息\");\r\n } else {\r\n this.user = getDefaultMockUser();\r\n console.log(\"使用默认Mock用户信息\");\r\n }\r\n\r\n if (!this.user) {\r\n throw new Error(\r\n \"未获取到用户信息:请在非 Telegram 环境提供 customUser\"\r\n );\r\n }\r\n\r\n // 清理旧 token,开始认证\r\n this.clearAuth();\r\n await this.auth();\r\n\r\n try {\r\n await this.hmAdManager.init();\r\n } catch (error) {\r\n console.error(\"广告管理器初始化失败,但继续执行其他初始化:\", error);\r\n }\r\n } catch (error) {\r\n console.error(\"SDK初始化失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 调用 /user/auth 并持久化 token\r\n */\r\n private async auth(): Promise<void> {\r\n try {\r\n const payload: Record<string, unknown> = {\r\n ...(this.user as Record<string, unknown>),\r\n };\r\n const notifyUrl = (this.options as SDKInitOptions | undefined)?.notifyUrl;\r\n if (notifyUrl) payload[\"notifyUrl\"] = notifyUrl;\r\n const res = await this.api.auth(payload);\r\n if (res.code !== 1) throw new Error(res.msg || \"鉴权失败\");\r\n const token = (res.data as any)?.token as string | undefined;\r\n if (!token) throw new Error(\"鉴权未返回 token\");\r\n this.token = token;\r\n this.storage.set(\"token\", token);\r\n } catch (error) {\r\n console.error(\"auth认证失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 清空鉴权状态\r\n */\r\n private clearAuth() {\r\n this.token = null;\r\n this.storage.remove(\"token\");\r\n }\r\n\r\n /**\r\n * 支付相关方法调用前校验 Telegram 环境\r\n */\r\n private ensureTelegramEnvOrThrow() {\r\n if (!isTelegramEnv()) {\r\n throw new Error(\"支付相关功能仅支持在 Telegram 环境内使用\");\r\n }\r\n }\r\n\r\n /**\r\n * 获取广告位配置\r\n */\r\n private async getAdPositionConfig(\r\n adPositionName: AdPositionName | string\r\n ): Promise<AdConfigItem[]> {\r\n const res = await this.api.getAdPositionConfig(String(adPositionName));\r\n if (res.code !== 1) throw new Error(res.msg || \"获取广告位配置失败\");\r\n return res.data || [];\r\n }\r\n\r\n /**\r\n * 创建广告\r\n */\r\n private async createAd(params: CreateAdParams): Promise<AdResponseData> {\r\n const res = await this.api.createAd(params);\r\n if (res.code !== 1) throw new Error(res.msg || \"创建广告失败\");\r\n const data = res.data as AdResponseData;\r\n\r\n if (data?.spaceId) {\r\n await this.hmAdManager.setSpace(String(data.spaceId));\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 展示广告(插屏/激励)传入 adPositionName,SDK 将自动完成:获取配置 -> 创建广告 -> 展示\r\n * - 自动调用监测 URL(第一个链接走 /v2/ad/monitor,其余直接 GET)\r\n */\r\n async showHmAdByPosition(\r\n adPositionName: AdPositionName | string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const configs = await this.getAdPositionConfig(adPositionName);\r\n if (!configs || configs.length === 0) {\r\n throw new Error(\"未找到广告位配置\");\r\n }\r\n const cfg = configs[0];\r\n const ad = await this.createAd({\r\n adId: cfg.adId,\r\n adPositionId: cfg.adPositionId,\r\n });\r\n const monitor: MonitorUrls = {\r\n start: ad.start,\r\n show: ad.show,\r\n error: ad.error,\r\n close: ad.close,\r\n reward: ad.reward,\r\n };\r\n await this.showHmAdWithMonitor(monitor, ad.adShowId, callbacks);\r\n }\r\n\r\n private async showHmAdWithMonitor(\r\n monitor: MonitorUrls,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.show();\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmPopupAd(\r\n monitor: MonitorUrls,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showPopup();\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmInAppAd(\r\n monitor: MonitorUrls,\r\n inAppOptions?: any,\r\n adShowId?: string,\r\n callbacks?: AdCallbacks\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showInApp(inAppOptions);\r\n await this.adMonitor.send(monitor.close, id);\r\n const rewardResp = await this.adMonitor.send(monitor.reward, id);\r\n if (callbacks?.onSuccess) await callbacks.onSuccess(rewardResp);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n if (callbacks?.onError) await callbacks.onError(e);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * 绑定钱包地址到服务器\r\n */\r\n private async bindWallet(walletAddress: string): Promise<void> {\r\n try {\r\n const res = await this.api.bindWalletReq({\r\n wallet: walletAddress,\r\n forceBind: true,\r\n });\r\n if (res.code !== 1) {\r\n console.warn(\"钱包地址绑定失败:\", res.msg);\r\n return;\r\n }\r\n } catch (error) {\r\n console.error(\"钱包地址绑定请求失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnectWallet(): Promise<boolean> {\r\n try {\r\n if (!this.tonWallet) return true;\r\n await this.tonWallet.disconnect();\r\n return !this.tonWallet.isConnected();\r\n } catch (e) {\r\n console.error(\"断开 Ton 钱包失败:\", e);\r\n return false;\r\n }\r\n }\r\n\r\n async connectWallet(): Promise<boolean> {\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n isWalletConnected(): boolean {\r\n return !!this.tonWallet?.isConnected();\r\n }\r\n\r\n async ensureWalletConnected(): Promise<boolean> {\r\n this.ensureTelegramEnvOrThrow();\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n async getSupportedPayModes(): Promise<MerchantPayModeListData> {\r\n const res = await this.api.merchantPayModeList();\r\n if (res.code !== 1) throw new Error(res.msg || \"获取支付方式失败\");\r\n const raw: any = res.data as any;\r\n if (Array.isArray(raw)) {\r\n return { payModeList: raw };\r\n }\r\n const list = Array.isArray(raw?.payModeList) ? raw.payModeList : [];\r\n return { payModeList: list };\r\n }\r\n\r\n async merchantPayQueryResult(\r\n data: MerchantPayQueryResultRequest\r\n ): Promise<MerchantPayQueryResultResponseData> {\r\n const res = await this.api.merchantPayQueryResult(data);\r\n if (res.code !== 1) throw new Error(res.msg || \"查询支付结果失败\");\r\n return res.data;\r\n }\r\n\r\n /**\r\n * 通用支付完成回调\r\n * @param orderSn 订单号\r\n * @param status 支付状态 success/failed/cancelled\r\n * @param transferHash 交易哈希(可选)\r\n */\r\n private async finishPayment(\r\n orderSn: string,\r\n status: string,\r\n transferHash: string = \"\"\r\n ): Promise<MerchantPayFinishResponseData> {\r\n const finishPayload: MerchantPayFinishRequest = {\r\n orderSn,\r\n status,\r\n transferHash,\r\n };\r\n const finishRes = await this.api.merchantPayFinish(finishPayload);\r\n if (finishRes.code !== 1) {\r\n throw new Error(finishRes.msg || \"支付完成回调失败\");\r\n }\r\n return finishRes.data;\r\n }\r\n\r\n async payByMerchant(\r\n data: MerchantPayCreateRequest\r\n ): Promise<MerchantPayFinishResponseData> {\r\n this.ensureTelegramEnvOrThrow();\r\n const upperCurrency = data.currencyName?.toUpperCase();\r\n const createRes = await this.api.merchantPayCreate(data);\r\n if (createRes.code !== 1)\r\n throw new Error(createRes.msg || \"创建支付订单失败\");\r\n const order = createRes.data;\r\n\r\n // Stars 支付:无需连接钱包,直接拉起发票(若 payUrl 存在)\r\n if (upperCurrency === \"STARS\" && order.payUrl) {\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n WebApp.openInvoice(order.payUrl as any, (status) => {\r\n // status 可能是 \"paid\", \"cancelled\", \"failed\" 等\r\n if (status === \"paid\") {\r\n resolve();\r\n } else {\r\n reject(new Error(`星币支付未完成: ${status || \"未知状态\"}`));\r\n }\r\n });\r\n });\r\n // 星币支付成功后调用支付完成回调并返回结果\r\n const finishRes = await this.finishPayment(order.orderSn, \"success\");\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n\r\n // 其他币种需已连接钱包(仅判断连接状态,不主动连接或上报)\r\n if (!this.tonWallet || !this.tonWallet.isConnected()) {\r\n throw new Error(\"请先连接钱包\");\r\n }\r\n const msg = order.transferData?.messages?.[0];\r\n if (!msg) throw new Error(\"订单未返回链上消息\");\r\n\r\n let result;\r\n try {\r\n if (upperCurrency === \"TON\") {\r\n result = await this.tonWallet.sendTonTransaction(order.transferData);\r\n } else if (upperCurrency === \"USDT\") {\r\n result = await this.tonWallet.sendUsdtTransaction(order.transferData);\r\n } else {\r\n // 其他币种暂不处理\r\n throw new Error(\"暂不支持的币种\");\r\n }\r\n\r\n const transferHash = (result as any)?.transferHash;\r\n const finishRes = await this.finishPayment(\r\n order.orderSn,\r\n \"success\",\r\n transferHash || \"\"\r\n );\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n}\r\n"]}
@@ -2,7 +2,7 @@ import { TonWalletProvider, TonTransactionResult, MerchantPayTransferData } from
2
2
  export declare class DefaultTonWalletProvider implements TonWalletProvider {
3
3
  private ui;
4
4
  private bindWalletCallback?;
5
- constructor(bindWalletCallback?: (walletAddress: string) => Promise<void>);
5
+ constructor(manifestUrl?: string, bindWalletCallback?: (walletAddress: string) => Promise<void>);
6
6
  isConnected(): boolean;
7
7
  private reportWalletAddress;
8
8
  connect(): Promise<boolean>;
@@ -3,16 +3,19 @@ import { toUserFriendlyAddress } from "@tonconnect/sdk";
3
3
  const DEFAULT_MANIFEST_URL = "https://miniapp.spinfi.me/tonconnect-manifest.json";
4
4
  // 添加单例模式,确保TonConnectUI只被初始化一次
5
5
  let tonConnectUIInstance = null;
6
+ let currentManifestUrl = null;
6
7
  export class DefaultTonWalletProvider {
7
- constructor(bindWalletCallback) {
8
+ constructor(manifestUrl, bindWalletCallback) {
8
9
  this.bindWalletCallback = bindWalletCallback;
9
- // 使用单例模式,如果实例已经存在则重用
10
- if (!tonConnectUIInstance) {
10
+ const resolvedManifestUrl = manifestUrl || DEFAULT_MANIFEST_URL;
11
+ // 使用单例模式,如果实例不存在或 manifest 变更则创建新实例
12
+ if (!tonConnectUIInstance || currentManifestUrl !== resolvedManifestUrl) {
11
13
  try {
12
14
  // console.log("创建新的TonConnectUI实例");
13
15
  tonConnectUIInstance = new TonConnectUI({
14
- manifestUrl: DEFAULT_MANIFEST_URL,
16
+ manifestUrl: resolvedManifestUrl,
15
17
  });
18
+ currentManifestUrl = resolvedManifestUrl;
16
19
  }
17
20
  catch (error) {
18
21
  console.error("创建TonConnectUI实例失败:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"tonWalletProvider.js","sourceRoot":"","sources":["../../src/sdk/tonWalletProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n TonWalletProvider,\r\n TonTransactionResult,\r\n MerchantPayTransferData,\r\n} from \"./types.js\";\r\nimport { TonConnectUI } from \"@tonconnect/ui\";\r\nimport { toUserFriendlyAddress } from \"@tonconnect/sdk\";\r\n\r\nconst DEFAULT_MANIFEST_URL =\r\n \"https://miniapp.spinfi.me/tonconnect-manifest.json\";\r\n\r\n// 添加单例模式,确保TonConnectUI只被初始化一次\r\nlet tonConnectUIInstance: TonConnectUI | null = null;\r\n\r\nexport class DefaultTonWalletProvider implements TonWalletProvider {\r\n private ui: TonConnectUI;\r\n private bindWalletCallback?: (walletAddress: string) => Promise<void>;\r\n\r\n constructor(bindWalletCallback?: (walletAddress: string) => Promise<void>) {\r\n this.bindWalletCallback = bindWalletCallback;\r\n // 使用单例模式,如果实例已经存在则重用\r\n if (!tonConnectUIInstance) {\r\n try {\r\n // console.log(\"创建新的TonConnectUI实例\");\r\n tonConnectUIInstance = new TonConnectUI({\r\n manifestUrl: DEFAULT_MANIFEST_URL,\r\n });\r\n } catch (error) {\r\n console.error(\"创建TonConnectUI实例失败:\", error);\r\n throw new Error(\"创建TonConnectUI实例失败\");\r\n }\r\n } else {\r\n // console.log(\"复用已存在的TonConnectUI实例\");\r\n }\r\n this.ui = tonConnectUIInstance;\r\n }\r\n\r\n isConnected(): boolean {\r\n try {\r\n return !!(this.ui as any)?.connected;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private async reportWalletAddress(): Promise<void> {\r\n const walletAddress = this.getUserFriendlyAddress();\r\n if (walletAddress && this.bindWalletCallback) {\r\n try {\r\n await this.bindWalletCallback(walletAddress);\r\n } catch (error) {\r\n console.error(\"钱包地址上报失败:\", error);\r\n }\r\n }\r\n }\r\n\r\n async connect(): Promise<boolean> {\r\n if (this.isConnected()) {\r\n await this.reportWalletAddress();\r\n return true;\r\n }\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n this.ui.openModal();\r\n const unsub = this.ui.onStatusChange(() => {\r\n if (this.isConnected()) {\r\n unsub();\r\n resolve();\r\n }\r\n });\r\n // 设置超时,防止用户长时间不操作\r\n setTimeout(() => {\r\n if (!this.isConnected()) {\r\n unsub();\r\n reject(new Error(\"连接钱包超时\"));\r\n }\r\n }, 300000); // 5分钟超时\r\n });\r\n\r\n // 连接成功后,上报钱包地址\r\n await this.reportWalletAddress();\r\n\r\n return this.isConnected();\r\n } catch (e) {\r\n console.error(\"连接钱包失败:\", e);\r\n return false;\r\n }\r\n }\r\n\r\n private getUserFriendlyAddress(): string | null {\r\n const anyUi = this.ui as any;\r\n const rawAddress =\r\n anyUi?.wallet?.account?.address || anyUi?.account?.address || null;\r\n if (!rawAddress) return null;\r\n return toUserFriendlyAddress(rawAddress);\r\n }\r\n\r\n async sendTonTransaction(\r\n transferData: MerchantPayTransferData\r\n ): Promise<TonTransactionResult> {\r\n if (!this.isConnected()) {\r\n const ok = await this.connect();\r\n if (!ok) throw new Error(\"钱包未连接\");\r\n }\r\n const res = await (this.ui as any).sendTransaction(transferData);\r\n const boc: string | undefined = res?.boc;\r\n let transferHash: string | undefined;\r\n if (boc) {\r\n try {\r\n // const cell = Cell.fromBase64(boc);\r\n // transferHash = cell.hash().toString(\"base64\");\r\n transferHash = boc.substring(0, 16);\r\n // console.log(\"transferHash:\", transferHash);\r\n } catch {}\r\n }\r\n return { transferHash, boc, raw: res };\r\n }\r\n\r\n async sendUsdtTransaction(\r\n transferData: MerchantPayTransferData\r\n ): Promise<TonTransactionResult> {\r\n if (!this.isConnected()) {\r\n const ok = await this.connect();\r\n if (!ok) throw new Error(\"钱包未连接\");\r\n }\r\n const res = await (this.ui as any).sendTransaction(transferData);\r\n const boc: string | undefined = res?.boc;\r\n let transferHash: string | undefined;\r\n if (boc) {\r\n try {\r\n // const cell = Cell.fromBase64(boc);\r\n // transferHash = cell.hash().toString(\"base64\");\r\n // 简化处理,直接使用 boc 作为 hash\r\n transferHash = boc.substring(0, 16);\r\n // console.log(\"transferHash:\", transferHash);\r\n } catch {}\r\n }\r\n return { transferHash, boc, raw: res };\r\n }\r\n\r\n async disconnect(): Promise<boolean> {\r\n try {\r\n const anyUi = this.ui as any;\r\n if (anyUi?.disconnect) {\r\n await anyUi.disconnect();\r\n } else if (anyUi?.onStatusChange) {\r\n const unsub = anyUi.onStatusChange(() => {});\r\n unsub && unsub();\r\n }\r\n return !this.isConnected();\r\n } catch (e) {\r\n console.error(\"断开钱包连接失败:\", e);\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"tonWalletProvider.js","sourceRoot":"","sources":["../../src/sdk/tonWalletProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n TonWalletProvider,\r\n TonTransactionResult,\r\n MerchantPayTransferData,\r\n} from \"./types.js\";\r\nimport { TonConnectUI } from \"@tonconnect/ui\";\r\nimport { toUserFriendlyAddress } from \"@tonconnect/sdk\";\r\n\r\nconst DEFAULT_MANIFEST_URL =\r\n \"https://miniapp.spinfi.me/tonconnect-manifest.json\";\r\n\r\n// 添加单例模式,确保TonConnectUI只被初始化一次\r\nlet tonConnectUIInstance: TonConnectUI | null = null;\r\nlet currentManifestUrl: string | null = null;\r\n\r\nexport class DefaultTonWalletProvider implements TonWalletProvider {\r\n private ui: TonConnectUI;\r\n private bindWalletCallback?: (walletAddress: string) => Promise<void>;\r\n\r\n constructor(\r\n manifestUrl?: string,\r\n bindWalletCallback?: (walletAddress: string) => Promise<void>\r\n ) {\r\n this.bindWalletCallback = bindWalletCallback;\r\n const resolvedManifestUrl = manifestUrl || DEFAULT_MANIFEST_URL;\r\n // 使用单例模式,如果实例不存在或 manifest 变更则创建新实例\r\n if (!tonConnectUIInstance || currentManifestUrl !== resolvedManifestUrl) {\r\n try {\r\n // console.log(\"创建新的TonConnectUI实例\");\r\n tonConnectUIInstance = new TonConnectUI({\r\n manifestUrl: resolvedManifestUrl,\r\n });\r\n currentManifestUrl = resolvedManifestUrl;\r\n } catch (error) {\r\n console.error(\"创建TonConnectUI实例失败:\", error);\r\n throw new Error(\"创建TonConnectUI实例失败\");\r\n }\r\n } else {\r\n // console.log(\"复用已存在的TonConnectUI实例\");\r\n }\r\n this.ui = tonConnectUIInstance as TonConnectUI;\r\n }\r\n\r\n isConnected(): boolean {\r\n try {\r\n return !!(this.ui as any)?.connected;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private async reportWalletAddress(): Promise<void> {\r\n const walletAddress = this.getUserFriendlyAddress();\r\n if (walletAddress && this.bindWalletCallback) {\r\n try {\r\n await this.bindWalletCallback(walletAddress);\r\n } catch (error) {\r\n console.error(\"钱包地址上报失败:\", error);\r\n }\r\n }\r\n }\r\n\r\n async connect(): Promise<boolean> {\r\n if (this.isConnected()) {\r\n await this.reportWalletAddress();\r\n return true;\r\n }\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n this.ui.openModal();\r\n const unsub = this.ui.onStatusChange(() => {\r\n if (this.isConnected()) {\r\n unsub();\r\n resolve();\r\n }\r\n });\r\n // 设置超时,防止用户长时间不操作\r\n setTimeout(() => {\r\n if (!this.isConnected()) {\r\n unsub();\r\n reject(new Error(\"连接钱包超时\"));\r\n }\r\n }, 300000); // 5分钟超时\r\n });\r\n\r\n // 连接成功后,上报钱包地址\r\n await this.reportWalletAddress();\r\n\r\n return this.isConnected();\r\n } catch (e) {\r\n console.error(\"连接钱包失败:\", e);\r\n return false;\r\n }\r\n }\r\n\r\n private getUserFriendlyAddress(): string | null {\r\n const anyUi = this.ui as any;\r\n const rawAddress =\r\n anyUi?.wallet?.account?.address || anyUi?.account?.address || null;\r\n if (!rawAddress) return null;\r\n return toUserFriendlyAddress(rawAddress);\r\n }\r\n\r\n async sendTonTransaction(\r\n transferData: MerchantPayTransferData\r\n ): Promise<TonTransactionResult> {\r\n if (!this.isConnected()) {\r\n const ok = await this.connect();\r\n if (!ok) throw new Error(\"钱包未连接\");\r\n }\r\n const res = await (this.ui as any).sendTransaction(transferData);\r\n const boc: string | undefined = res?.boc;\r\n let transferHash: string | undefined;\r\n if (boc) {\r\n try {\r\n // const cell = Cell.fromBase64(boc);\r\n // transferHash = cell.hash().toString(\"base64\");\r\n transferHash = boc.substring(0, 16);\r\n // console.log(\"transferHash:\", transferHash);\r\n } catch {}\r\n }\r\n return { transferHash, boc, raw: res };\r\n }\r\n\r\n async sendUsdtTransaction(\r\n transferData: MerchantPayTransferData\r\n ): Promise<TonTransactionResult> {\r\n if (!this.isConnected()) {\r\n const ok = await this.connect();\r\n if (!ok) throw new Error(\"钱包未连接\");\r\n }\r\n const res = await (this.ui as any).sendTransaction(transferData);\r\n const boc: string | undefined = res?.boc;\r\n let transferHash: string | undefined;\r\n if (boc) {\r\n try {\r\n // const cell = Cell.fromBase64(boc);\r\n // transferHash = cell.hash().toString(\"base64\");\r\n // 简化处理,直接使用 boc 作为 hash\r\n transferHash = boc.substring(0, 16);\r\n // console.log(\"transferHash:\", transferHash);\r\n } catch {}\r\n }\r\n return { transferHash, boc, raw: res };\r\n }\r\n\r\n async disconnect(): Promise<boolean> {\r\n try {\r\n const anyUi = this.ui as any;\r\n if (anyUi?.disconnect) {\r\n await anyUi.disconnect();\r\n } else if (anyUi?.onStatusChange) {\r\n const unsub = anyUi.onStatusChange(() => {});\r\n unsub && unsub();\r\n }\r\n return !this.isConnected();\r\n } catch (e) {\r\n console.error(\"断开钱包连接失败:\", e);\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
@@ -28,6 +28,8 @@ export interface SDKInitOptions {
28
28
  appId?: string;
29
29
  /** 可选:SDK 初始化鉴权成功后的服务端回调地址 */
30
30
  notifyUrl?: string;
31
+ /** 可选:TON Connect manifest 文件地址;未传则使用默认测试清单 */
32
+ tonConnectManifestUrl?: string;
31
33
  }
32
34
  export interface AuthResponseData {
33
35
  token: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,sEAAoD,CAAA;IACpD,sEAAoD,CAAA;IACpD,8DAA4C,CAAA;AAC9C,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB","sourcesContent":["export enum AdPositionName {\n GameRewardedAdPosition = \"game_rewarded_ad_position\",\n TaskRewardedAdPosition = \"task_rewarded_ad_position\",\n TaskListAdPosition = \"task_list_ad_position\",\n}\n\nexport interface TelegramUserUnsafeInitData {\n [key: string]: unknown;\n}\n\nexport interface TelegramUserInfo {\n id?: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n language_code?: string;\n allows_write_to_pm?: boolean;\n auth_date?: number;\n hash?: string;\n [key: string]: unknown;\n}\n\nexport interface SDKInitOptions {\n /** 自定义用户信息(可选) */\n customUser?: TelegramUserInfo;\n /** 本地存储 Key 前缀,避免冲突 */\n storageKeyPrefix?: string;\n /** 自定义接口地址(可选)。不传则使用默认正式环境 */\n baseURL?: string;\n /** 可选:回调校验用 */\n appId?: string;\n /** 可选:SDK 初始化鉴权成功后的服务端回调地址 */\n notifyUrl?: string;\n}\n\nexport interface AuthResponseData {\n token: string;\n [key: string]: unknown;\n}\n\nexport interface APIResponse<T> {\n code: number;\n msg: string;\n timestamp?: number;\n datetime?: string;\n data: T;\n}\n\nexport interface AdConfigItem {\n id: number;\n adTypeId: number;\n adPlatformId: number;\n title: string;\n name: string;\n spaceId: string;\n rewardRate: number;\n payout: number;\n description?: string | null;\n status: number;\n enable: number;\n createDatetime: string;\n updateDatetime: string;\n adId: number;\n adPositionId: number;\n adPositionName: string;\n adPositionTitle: string;\n rank: number;\n adPlatformName: string; // e.g., monetag\n adPlatformTitle: string; // e.g., Monetag\n appId?: string | null;\n appSecret?: string | null;\n appUrl?: string | null;\n adPlatformConfig?: unknown | null;\n adTypeName: string; // e.g., interstitial_ad | popup_ad | inapp\n adTypeTitle: string;\n adRewardAmount?: number;\n}\n\nexport interface CreateAdParams {\n adId: number;\n adPositionId: number;\n tournamentId?: number;\n groupId?: number;\n}\n\nexport interface BindWalletResponseData {\n id: number;\n authId: number;\n authHash: string;\n authDatetime: string;\n chatInstance: string;\n firstName: string;\n lastName: string;\n username: string;\n nickname: string | null;\n allowsWritePm: number;\n languageCode: string;\n isPremiumUser: number;\n avatarUrl: string | null;\n email: string | null;\n phone: string | null;\n referrerId: number | null;\n referrerAuthId: number | null;\n walletAddress: string;\n usdtWalletAddress: string;\n points: number;\n buyContribution: number;\n revenuesContribution: number;\n taskContribution: number;\n status: number;\n enable: number;\n}\n\nexport interface AdResponseData {\n id: number;\n adTypeId: number;\n adPlatformId: number;\n title: string;\n name: string;\n spaceId: string;\n rewardRate: number;\n payout: number;\n description?: string | null;\n status: number;\n enable: number;\n createDatetime: string;\n updateDatetime: string;\n adShowId: string;\n start?: string[];\n show?: string[];\n error?: string[];\n close?: string[];\n reward?: string[];\n}\n\nexport interface MonitorUrls {\n start?: string[];\n show?: string[];\n error?: string[];\n close?: string[];\n reward?: string[];\n}\n\n// 新增:广告展示回调接口,供 SDK 用户可选传入\nexport interface AdCallbacks {\n onSuccess?: (result?: unknown) => void | Promise<void>;\n onError?: (error: unknown) => void | Promise<void>;\n}\n\nexport interface BindWalletReq {\n wallet: string;\n forceBind: boolean;\n}\n\nexport interface TonTransactionResult {\n transferHash?: string;\n boc?: string;\n raw?: unknown;\n}\n\nexport interface MerchantPayModeItem {\n id: number;\n title: string;\n name: string; // USDT | TON | STARS\n rate: number;\n nameDesc: string;\n}\n\nexport interface MerchantPayModeListData {\n payModeList: MerchantPayModeItem[];\n}\n\nexport interface MerchantPayCreateRequest {\n currencyName: string; // USDT | TON | STARS\n amount: number; // 单价/金额\n outTradeNo: string; // 商户订单号\n notifyUrl: string; // 回调地址\n attach: string; // 附加信息\n}\n\nexport interface MerchantPayTransferMessage {\n address: string;\n amount: string;\n payload?: string;\n}\n\nexport interface MerchantPayTransferData {\n validUntil: number;\n messages: MerchantPayTransferMessage[];\n}\n\nexport interface MerchantPayOrderBase {\n orderSn: string;\n transactionSn: string;\n outTradeNo: string;\n price: number | string;\n count: number;\n totalPrice: number | string;\n currencyId: number;\n currencyName: string;\n currencyRate: number;\n currencyAmount: number | string;\n payUrl: string | null;\n payExpireDatetime: string;\n payDatetime: string | null;\n finishDatetime: string | null;\n description: string;\n status: number;\n statusDesc: string;\n closeCode: string | null;\n closeCodeDesc: string | null;\n createDatetime: string;\n updateDatetime: string;\n transferHash: string | null;\n transactionHash: string | null;\n transactionLt: string | null;\n}\n\nexport interface MerchantPayCreateResponseData extends MerchantPayOrderBase {\n transferData: MerchantPayTransferData;\n}\n\nexport interface MerchantPayFinishRequest {\n orderSn: string;\n status: string; // success / failed / cancelled\n transferHash?: string;\n orderId?: string;\n}\n\nexport type MerchantPayFinishResponseData = MerchantPayOrderBase;\n\nexport interface MerchantPayQueryResultRequest {\n orderSn?: string;\n outTradeNo?: string;\n}\n\nexport type MerchantPayQueryResultResponseData = MerchantPayOrderBase;\n\nexport type MerchantPayNotifyRequest = MerchantPayOrderBase;\n\nexport interface TonWalletProvider {\n isConnected: () => boolean;\n connect: () => Promise<boolean>;\n disconnect: () => Promise<boolean>;\n sendTonTransaction: (\n transferData: MerchantPayTransferData\n ) => Promise<TonTransactionResult>;\n sendUsdtTransaction: (\n transferData: MerchantPayTransferData\n ) => Promise<TonTransactionResult>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,sEAAoD,CAAA;IACpD,sEAAoD,CAAA;IACpD,8DAA4C,CAAA;AAC9C,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB","sourcesContent":["export enum AdPositionName {\n GameRewardedAdPosition = \"game_rewarded_ad_position\",\n TaskRewardedAdPosition = \"task_rewarded_ad_position\",\n TaskListAdPosition = \"task_list_ad_position\",\n}\n\nexport interface TelegramUserUnsafeInitData {\n [key: string]: unknown;\n}\n\nexport interface TelegramUserInfo {\n id?: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n language_code?: string;\n allows_write_to_pm?: boolean;\n auth_date?: number;\n hash?: string;\n [key: string]: unknown;\n}\n\nexport interface SDKInitOptions {\n /** 自定义用户信息(可选) */\n customUser?: TelegramUserInfo;\n /** 本地存储 Key 前缀,避免冲突 */\n storageKeyPrefix?: string;\n /** 自定义接口地址(可选)。不传则使用默认正式环境 */\n baseURL?: string;\n /** 可选:回调校验用 */\n appId?: string;\n /** 可选:SDK 初始化鉴权成功后的服务端回调地址 */\n notifyUrl?: string;\n /** 可选:TON Connect manifest 文件地址;未传则使用默认测试清单 */\n tonConnectManifestUrl?: string;\n}\n\nexport interface AuthResponseData {\n token: string;\n [key: string]: unknown;\n}\n\nexport interface APIResponse<T> {\n code: number;\n msg: string;\n timestamp?: number;\n datetime?: string;\n data: T;\n}\n\nexport interface AdConfigItem {\n id: number;\n adTypeId: number;\n adPlatformId: number;\n title: string;\n name: string;\n spaceId: string;\n rewardRate: number;\n payout: number;\n description?: string | null;\n status: number;\n enable: number;\n createDatetime: string;\n updateDatetime: string;\n adId: number;\n adPositionId: number;\n adPositionName: string;\n adPositionTitle: string;\n rank: number;\n adPlatformName: string; // e.g., monetag\n adPlatformTitle: string; // e.g., Monetag\n appId?: string | null;\n appSecret?: string | null;\n appUrl?: string | null;\n adPlatformConfig?: unknown | null;\n adTypeName: string; // e.g., interstitial_ad | popup_ad | inapp\n adTypeTitle: string;\n adRewardAmount?: number;\n}\n\nexport interface CreateAdParams {\n adId: number;\n adPositionId: number;\n tournamentId?: number;\n groupId?: number;\n}\n\nexport interface BindWalletResponseData {\n id: number;\n authId: number;\n authHash: string;\n authDatetime: string;\n chatInstance: string;\n firstName: string;\n lastName: string;\n username: string;\n nickname: string | null;\n allowsWritePm: number;\n languageCode: string;\n isPremiumUser: number;\n avatarUrl: string | null;\n email: string | null;\n phone: string | null;\n referrerId: number | null;\n referrerAuthId: number | null;\n walletAddress: string;\n usdtWalletAddress: string;\n points: number;\n buyContribution: number;\n revenuesContribution: number;\n taskContribution: number;\n status: number;\n enable: number;\n}\n\nexport interface AdResponseData {\n id: number;\n adTypeId: number;\n adPlatformId: number;\n title: string;\n name: string;\n spaceId: string;\n rewardRate: number;\n payout: number;\n description?: string | null;\n status: number;\n enable: number;\n createDatetime: string;\n updateDatetime: string;\n adShowId: string;\n start?: string[];\n show?: string[];\n error?: string[];\n close?: string[];\n reward?: string[];\n}\n\nexport interface MonitorUrls {\n start?: string[];\n show?: string[];\n error?: string[];\n close?: string[];\n reward?: string[];\n}\n\n// 新增:广告展示回调接口,供 SDK 用户可选传入\nexport interface AdCallbacks {\n onSuccess?: (result?: unknown) => void | Promise<void>;\n onError?: (error: unknown) => void | Promise<void>;\n}\n\nexport interface BindWalletReq {\n wallet: string;\n forceBind: boolean;\n}\n\nexport interface TonTransactionResult {\n transferHash?: string;\n boc?: string;\n raw?: unknown;\n}\n\nexport interface MerchantPayModeItem {\n id: number;\n title: string;\n name: string; // USDT | TON | STARS\n rate: number;\n nameDesc: string;\n}\n\nexport interface MerchantPayModeListData {\n payModeList: MerchantPayModeItem[];\n}\n\nexport interface MerchantPayCreateRequest {\n currencyName: string; // USDT | TON | STARS\n amount: number; // 单价/金额\n outTradeNo: string; // 商户订单号\n notifyUrl: string; // 回调地址\n attach: string; // 附加信息\n}\n\nexport interface MerchantPayTransferMessage {\n address: string;\n amount: string;\n payload?: string;\n}\n\nexport interface MerchantPayTransferData {\n validUntil: number;\n messages: MerchantPayTransferMessage[];\n}\n\nexport interface MerchantPayOrderBase {\n orderSn: string;\n transactionSn: string;\n outTradeNo: string;\n price: number | string;\n count: number;\n totalPrice: number | string;\n currencyId: number;\n currencyName: string;\n currencyRate: number;\n currencyAmount: number | string;\n payUrl: string | null;\n payExpireDatetime: string;\n payDatetime: string | null;\n finishDatetime: string | null;\n description: string;\n status: number;\n statusDesc: string;\n closeCode: string | null;\n closeCodeDesc: string | null;\n createDatetime: string;\n updateDatetime: string;\n transferHash: string | null;\n transactionHash: string | null;\n transactionLt: string | null;\n}\n\nexport interface MerchantPayCreateResponseData extends MerchantPayOrderBase {\n transferData: MerchantPayTransferData;\n}\n\nexport interface MerchantPayFinishRequest {\n orderSn: string;\n status: string; // success / failed / cancelled\n transferHash?: string;\n orderId?: string;\n}\n\nexport type MerchantPayFinishResponseData = MerchantPayOrderBase;\n\nexport interface MerchantPayQueryResultRequest {\n orderSn?: string;\n outTradeNo?: string;\n}\n\nexport type MerchantPayQueryResultResponseData = MerchantPayOrderBase;\n\nexport type MerchantPayNotifyRequest = MerchantPayOrderBase;\n\nexport interface TonWalletProvider {\n isConnected: () => boolean;\n connect: () => Promise<boolean>;\n disconnect: () => Promise<boolean>;\n sendTonTransaction: (\n transferData: MerchantPayTransferData\n ) => Promise<TonTransactionResult>;\n sendUsdtTransaction: (\n transferData: MerchantPayTransferData\n ) => Promise<TonTransactionResult>;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hm-tracking-sdk",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "description": "Telegram tracking SDK for Web/Miniapp with TON/Stars payment integration.",
6
6
  "license": "MIT",