@ada-anvil/weld-plugin-hodei 0.0.1-alpha.2 → 0.0.1-alpha.3
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 +40 -1
- package/cdn.min.js +23 -0
- package/lib.cjs +1 -0
- package/lib.d.ts +31 -2
- package/lib.js +29 -7
- package/package.json +11 -7
package/README.md
CHANGED
|
@@ -1,3 +1,42 @@
|
|
|
1
1
|
# Weld Hodei Plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This is a plugin for [Weld](https://github.com/cardano-forge/weld) to integrate with the [Hodei client](https://github.com/cardano-forge/hodei-client).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ada-anvil/weld-plugin-hodei @ada-anvil/weld
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Vanilla JS
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { weld } from "@ada-anvil/weld";
|
|
17
|
+
import { builtinPlugins } from "@ada-anvil/weld/plugins";
|
|
18
|
+
import { hodeiPlugin } from "@ada-anvil/weld-plugin-hodei";
|
|
19
|
+
|
|
20
|
+
weld.config.update({
|
|
21
|
+
plugins: [...builtinPlugins, hodeiPlugin(config)],
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
weld.init();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### React
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { weld } from "@ada-anvil/weld";
|
|
31
|
+
import { builtinPlugins } from "@ada-anvil/weld/plugins";
|
|
32
|
+
import { hodeiPlugin } from "@ada-anvil/weld-plugin-hodei";
|
|
33
|
+
|
|
34
|
+
export const App = ({ children }) => {
|
|
35
|
+
return (
|
|
36
|
+
<WeldProvider plugins={[...builtinPlugins, hodeiPlugin(config)]}>
|
|
37
|
+
{children}
|
|
38
|
+
</WeldProvider>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
package/cdn.min.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var HodeiPlugin=(function(f,y){"use strict";async function S(e){const{baseUrl:t,apiKey:n}=e.config.anvil[e.network],o=new URL(`${t}/wallets/utxos`);return o.searchParams.set("address",e.address),o.searchParams.set("includeMempool","true"),(await fetch(o,{headers:{"x-api-key":n}})).json()}async function A(e){const{baseUrl:t,apiKey:n}=e.config.anvil[e.network],o=new URL(`${t}/wallets/balance`);return o.searchParams.set("address",e.address),(await fetch(o,{headers:{"x-api-key":n}})).json()}async function j(e){const{baseUrl:t,apiKey:n}=e.config.anvil[e.network];return(await fetch(`${t}/transactions/submit`,{method:"POST",headers:{"x-api-key":n,"content-type":"application/json"},body:JSON.stringify({transaction:e.transaction,signatures:e.signature?[e.signature]:[]})})).json()}const w="hodei-token";function O(){return localStorage.getItem(w)??void 0}function z(e){localStorage.setItem(w,e)}function E(){localStorage.removeItem(w)}function b(){let e="pending",t=()=>{},n=()=>{};const o=new Promise((g,c)=>{t=d=>{e="resolved",g(d)},n=d=>{e="rejected",c(d)}});return{status:e,promise:o,resolve:t,reject:n}}function u(e){if(e){if((e instanceof Error||v(e,"message"))&&typeof e.message=="string"&&e.message.length>0)return e.message;if(v(e,"data")&&v(e.data,"message")&&typeof e.data.message=="string"&&e.data.message.length>0)return e.data.message;if(typeof e=="string"&&e.length>0)return e}}function v(e,t){return typeof e=="object"&&e!==null&&t in e}class Q{_config;_onStateChange;_debug;_connectPromise;_connection;constructor(t){this._config=t.config,this._onStateChange=t.onStateChange,this._debug=t.config?.debug??!1}setDebug(t){this._debug=t}debugLog(...t){if(!this._debug)return;let n="[HODEI]";this.connection&&(n+=` (${this.connection.id})`),console.log(n,...t)}get connection(){return this._connection}isConnected(){return this.connection?.state.status==="paired"||this.connection?.state.status==="pairing"}async connect(){if(this._connectPromise)return this._connectPromise;if(this.isConnected())return this.connection.state;this._connectPromise=this._connect();try{return await this._connectPromise}finally{this._connectPromise=void 0}}disconnect(){this._connection?.ws.close(1e3,"disconnected"),this._connection=void 0}unlink(){this.send({type:"client.session_unlinked",payload:{}})}getState(){return this.connection?.state}async _connect(){this.disconnect();const t=this._config.bridge.baseUrl.replace("http","ws"),n=new URL(`${t}/client/ws`),o=await this._getToken();o&&n.searchParams.set("token",o);const g=(this.connection?.id??0)+1,c=new WebSocket(n),d=new AbortController,r=b();this.debugLog("connecting"),c.addEventListener("message",i=>{try{const s=JSON.parse(i.data);C(s),this.debugLog("received connection message"),r.resolve(s.payload)}catch(s){r.reject(`Error parsing connection message ${i.data}: ${u(s)}`)}finally{d.abort()}},{signal:d.signal}),c.addEventListener("error",i=>{this.debugLog("received connection error"),r.reject(`Error connecting: ${u(i)}`),d.abort()},{signal:d.signal});try{const i=await r.promise;this.debugLog("connected"),z(i.token);const s={id:g,ws:c,state:i,controller:new AbortController};return this._connection=s,this._onStateChange(s.state),c.addEventListener("message",a=>{try{if(s.state.status==="error")throw new Error("Received message after error");if(s.state.status==="closed")throw new Error("Received message after closed");const l=JSON.parse(a.data);U(l),l.type==="client.wallet_updated"&&(this.debugLog("received wallet_updated message"),s.state={...l.payload,status:"paired",sessionId:s.state.sessionId,token:s.state.token},this._onStateChange(s.state))}catch(l){this.debugLog(`error parsing message ${a.data}: ${u(l)}`)}},{signal:s.controller.signal}),c.addEventListener("error",a=>{if(this._scheduleReconnect()){this.debugLog("scheduled reconnect after error");return}this.debugLog(`received error: ${u(a)}`),s.state={status:"error",error:u(a)},this._onStateChange(s.state),s.controller.abort()},{signal:s.controller.signal}),c.addEventListener("close",async a=>{if(a.code===4001&&(this.debugLog("session deleted"),E()),a.code!==1e3&&this._scheduleReconnect()){this.debugLog("scheduled reconnect after close");return}this.debugLog(`received close: ${a.code} ${a.reason}`),s.state={status:"closed",reason:a.reason,code:a.code},this._onStateChange(s.state),s.controller.abort()},{signal:s.controller.signal}),this._attempts=0,i}catch(i){throw c.close(void 0,`failed to connect: ${u(i)}`),i}}send(t){this.connection?.ws.send(JSON.stringify(t))}_attempts=0;_reconnectTimer;_scheduleReconnect(){this._reconnectTimer&&(this.debugLog("clearing reconnect timer"),clearTimeout(this._reconnectTimer)),this._attempts=Math.min(this._attempts+1,5);const t=2**this._attempts*1e3;this.debugLog(`reconnecting in ${t/1e3}s`);const n=setTimeout(()=>{if(this._reconnectTimer!==n){this.debugLog("reconnect timer cleared. ignoring");return}this.debugLog("reconnecting"),this._reconnectTimer=void 0,this._connect().catch(()=>this._scheduleReconnect())},t);return this._reconnectTimer=n,!0}async _getToken(){const t=O();if(!t)return;const n=await P({config:this._config,token:t});if(this.debugLog(`checked token: ${n.valid?"valid":`invalid: ${n.reason}`}`),n.valid)return t;if(n.reason==="alreadyConnected")throw new Error("Already connected");n.reason==="notFound"&&E()}}async function P(e){const t=new URL(`${e.config.bridge.baseUrl}/client/check`),n=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${e.token}`}});return n.status===404?{valid:!1,reason:"notFound"}:n.status===409?{valid:!1,reason:"alreadyConnected"}:{valid:!0,token:e.token}}function h(e){return typeof e=="object"&&e!==null}function x(e){return h(e)&&(e.status==="pairing"||e.status==="paired")}function C(e){if(!h(e)||e.type!=="client.connected"||!x(e.payload))throw new Error("Invalid connected message")}const V=new Set(["client.wallet_updated","client.sig_req_accepted","client.sig_req_rejected"]);function U(e){if(!h(e)||typeof e.type!="string"||!V.has(e.type))throw new Error("Invalid incoming message")}function X(e){if(!h(e)||e.type!=="client.sig_req_accepted"&&e.type!=="client.sig_req_rejected")throw new Error("Invalid sig req response")}const I=new Set(["pairing","paired","closed","error"]);function W(e){return h(e)&&typeof e.status=="string"&&I.has(e.status)}function k(e,t){e.dispatchEvent(new CustomEvent("command",{detail:t}))}function L(e,t,n){const o=g=>{const c=T(g);c&&t(c)};return e.addEventListener("command",o,n),()=>{e.removeEventListener("command",o,n)}}function T(e){if(e instanceof CustomEvent)return D(e.detail)?e.detail:void 0}const q=new Set(["disconnecting","disconnected","unlinked","dialog_closed"]);function D(e){if(typeof e!="object"||e===null)return!1;const t=e;return typeof t.type!="string"?!1:q.has(t.type)?!0:t.type==="state_changed"&&W(t.payload)}const N={bridge:{baseUrl:"https://bridge.hodei.io/api/dev"},anvil:{mainnet:{baseUrl:"https://prod.api.ada-anvil.app/v2/services",apiKey:"mainnet_IIrhwohjiEAJ2LFOgI8p5F735xz4C6XsgH6KfzpC"},preprod:{baseUrl:"https://preprod.api.ada-anvil.app/v2/services",apiKey:"testnet_C301LOscFsUccwR4zCqEtTJvizEAUc3AaVhRDdcY"}},debug:!1,waitForPairing:!0,onError:({error:e})=>console.error("[HODEI] unhandled error:",e??"unknown"),onClose:({code:e,reason:t})=>console.error("[HODEI] unhandled closure:",e,t)},Z={refused:1,failure:2};function F(e,t){return{code:Z[e],info:u(t)??"unknown"}}const R={invalidRequest:-1,internalError:-2,refused:-3,accountChange:-4};function p(e,t){return{code:R[e],info:u(t)??"unknown"}}function K(e){if(!(typeof window>"u"))return window.cardano||(window.cardano={}),window.cardano.hodei||(window.cardano.hodei=Y(e)),window.cardano.hodei}function Y(e={}){const t={config:{...N,...e}},n=async o=>{await t.promise?.catch(()=>{}),o.status==="error"&&t.config.onError(o),o.status==="closed"&&t.config.onClose(o),o.status==="paired"&&t.config.onWalletUpdate?.({baseAddress:o.baseAddress,stakeAddress:o.stakeAddress,network:o.network}),t.resolved?t.resolved?.client.sendCommand({sender:"wallet",type:"state_changed",payload:o}):console.error("[HODEI] (state_changed)",o)};return{name:"hodei",icon:"data:image/png;base64,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",apiVersion:"1",async enable(){if(t.resolved?.bridge.isConnected())return t.resolved.api;t.promise||(t.promise=J({config:t.config,onStateChange:n}));try{const o=await t.promise;return t.resolved=o,t.config.waitForPairing?await o.pairingPromise:o.pairingPromise.catch(()=>{}),o.api}finally{t.promise=void 0}},async isEnabled(){if(t.promise)try{return await t.promise,!0}catch{return!1}if(t.resolved)return t.resolved.bridge.isConnected();const o=O();if(!o)return!1;try{return(await P({config:t.config,token:o})).valid}catch{return!1}}}}async function J(e){const t=await M(),n=new Q(e);await n.connect(),L(t.element,r=>{if(r.sender==="client")switch(r.type){case"dialog_closed":{n.getState()?.status==="pairing"&&n.disconnect();break}case"disconnected":{n.disconnect();break}case"unlinked":{n.unlink();break}default:{n.debugLog(`unhandled command received from client: ${JSON.stringify(r)}`);break}}},{signal:n.connection?.controller.signal});const o=()=>{const r=n.getState();if(r?.status!=="paired")throw p("refused",new Error("Wallet is not connected"));return r},g=async r=>{if(o(),!n.isConnected())throw p("refused",new Error("Wallet is not connected"));const i=new AbortController;n.connection.controller.signal.addEventListener("abort",()=>i.abort(),{signal:i.signal});const s=b();return n.connection.ws.addEventListener("message",a=>{try{const l=JSON.parse(a.data);X(l);const m=l;if(m.payload.requestId!==r.requestId)return;m.type==="client.sig_req_accepted"?s.resolve(m.payload.signature):s.reject(`Rejected by user: ${m.payload.reason}`),i.abort()}catch(l){n.debugLog(`error parsing message ${a.data}: ${u(l)}`)}},{signal:i.signal}),n.send({type:"client.sig_req_created",payload:r}),s.promise},c={getNetworkId:async()=>o().network==="mainnet"?1:0,getUtxos:async()=>{const r=o();try{return await S({config:e.config,network:r.network,address:r.baseAddress})}catch(i){throw p("internalError",i)}},getBalance:async()=>{const r=o();try{return await A({config:e.config,network:r.network,address:r.baseAddress})}catch(i){throw p("internalError",i)}},getUsedAddresses:async()=>[o().baseAddress],getUnusedAddresses:async()=>[],getChangeAddress:async()=>o().baseAddress,getRewardAddresses:async()=>[o().stakeAddress],signTx:async(r,i=!1)=>g({requestId:crypto.randomUUID(),tx:r,partialSign:i}),signData:async(r,i)=>{const s=await g({requestId:crypto.randomUUID(),address:r,data:i}),[a,l]=s.split("::");if(!a||!l)throw p("internalError",new Error("Invalid signature"));return{signature:a,key:l}},submitTx:async r=>{const i=o();try{return(await j({config:e.config,network:i.network,transaction:r})).txHash}catch(s){throw F("failure",s)}},disconnect:async()=>{t.sendCommand({sender:"wallet",type:"disconnecting"})}},d=b();if(n.connection&&n.getState()?.status==="pairing"){const r=new AbortController;n.connection.controller.signal.addEventListener("abort",()=>{r.abort(),d.reject(new Error("Aborted"))},{signal:r.signal}),n.connection.ws.addEventListener("message",i=>{try{const s=JSON.parse(i.data);U(s),s.type==="client.wallet_updated"&&(d.resolve(),r.abort())}catch{}},{signal:r.signal})}else d.resolve();return{api:c,bridge:n,client:t,pairingPromise:d.promise}}async function M(){if(!customElements.get("hodei-client")){const t=await Promise.resolve().then(()=>ee);customElements.define("hodei-client",t.HodeiClient)}let e=document.querySelector("hodei-client")??void 0;if(!e){e=document.createElement("hodei-client");const t=b();e.addEventListener("mounted",()=>t.resolve(),{once:!0}),document.body.appendChild(e),await t.promise}return{element:e,sendCommand:t=>k(e,t)}}class H extends y.DefaultWalletHandler{async disconnect(){if("disconnect"in this.enabledApi&&typeof this.enabledApi.disconnect=="function")return this.enabledApi?.disconnect()}}function B(e){return{key:"hodei",connector:y.getDefaultWalletConnector(H),initialize:y.runOnce(t=>K({debug:t.config.debug,...e,onError:o=>{t.config.debug&&console.error("[WELD] Hodei socket error, disconnecting.",o),e?.onError?.(o,t),t.wallet.disconnect()},onClose:o=>{t.config.debug&&console.error("[WELD] Hodei socket closed, disconnecting.",o),e?.onClose?.(o,t),t.wallet.disconnect()},onWalletUpdate:o=>{t.config.debug&&console.log("[WELD] Hodei wallet updated, updating state.",o),e?.onWalletUpdate?.(o,t),t.wallet.updateState()}})?(t.extensions.registerWallets([{supported:!0,key:"hodei",displayName:"Hodei",icon:"https://raw.githubusercontent.com/cardano-forge/weld/main/images/wallets/hodei.png",website:"https://github.com/cardano-forge/hodei-client",supportsTxChaining:!1}]),!0):!1)}}const G="*{box-sizing:border-box}:host{font-family:Roboto,Arial,Helvetica,sans-serif;pointer-events:auto}dialog{width:100%;max-width:300px;outline:none;border:none;padding:24px;background:transparent}dialog::backdrop{background:#00000052}article{padding:24px;border-radius:22px;display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;overflow:hidden;text-align:center;background:linear-gradient(to bottom right,#ebdee8,#fff7fa);color:#1e191e}h1{margin:12px 0 16px;font-size:20px;font-weight:400}p{margin:0;font-size:14px}h2{margin:0 0 24px;font-size:24px;font-weight:600;letter-spacing:.2em}img{width:75px;height:75px}button{--bg: #69548e;--fg: #ffffff;background:var(--bg);color:var(--fg);outline:none;border:none;height:32px;padding:0 12px;border-radius:24px;position:relative;overflow:hidden;transition:all .2s ease-in-out}button:hover{cursor:pointer;--bg: #746197;--fg: #ffffff}button.tonal{--bg: #e8dff8;--fg: #1e182b}button.tonal:hover{--bg: #d9cfe7;--fg: #1f182b}footer{margin-top:24px}@media(prefers-color-scheme:dark){article{background:linear-gradient(to bottom right,#362a36,#181215);color:#eadfe6}button{--bg: #d3bcfd;--fg: #37265c}button:hover{--bg: #c6b0f0;--fg: #37265c}button.tonal{--bg: #4b4358;--fg: #e8dff8}button.tonal:hover{--bg: #574f63;--fg: #e9def8}}",_=`<dialog></dialog>
|
|
2
|
+
|
|
3
|
+
<template id="pairing">
|
|
4
|
+
<article>
|
|
5
|
+
<img src="https://ik.imagekit.io/pizzli/cforge/logo.png" alt="hodei" />
|
|
6
|
+
<h1>Pairing</h1>
|
|
7
|
+
<h2 class="pin"></h2>
|
|
8
|
+
<p>Enter this code on the Hodei app to pair your wallet</p>
|
|
9
|
+
</article>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<template id="disconnecting">
|
|
13
|
+
<article>
|
|
14
|
+
<img src="https://ik.imagekit.io/pizzli/cforge/logo.png" alt="hodei" />
|
|
15
|
+
<h1>Disconnecting</h1>
|
|
16
|
+
<p>Do you want to unlink your wallet from the Hodei app or disconnect only?</p>
|
|
17
|
+
<footer>
|
|
18
|
+
<button type="button" class="tonal" data-action="unlink">Unlink</button>
|
|
19
|
+
<button type="button" data-action="disconnect">Disconnect only</button>
|
|
20
|
+
</footer>
|
|
21
|
+
</article>
|
|
22
|
+
</template>
|
|
23
|
+
`;class $ extends HTMLElement{_state={status:"disconnected"};_shadow;_dialog;_unsub;_observer;constructor(){super(),this._shadow=this.attachShadow({mode:"open"}),this._shadow.innerHTML=`<style>${G}</style>${_}`;const t=this._shadow.querySelector("dialog");if(t)this._dialog=t;else throw new Error("dialog not found");for(const n of["pointerdown","pointerup","click","mousedown","mouseup"])this.addEventListener(n,o=>o.stopPropagation());this._dialog.addEventListener("click",n=>{n.target===this._dialog&&this._dialog.close("backdrop")}),this._dialog.addEventListener("close",()=>{switch(this._state.status){case"pairing":k(this,{sender:"client",type:"dialog_closed"});break;case"disconnecting":this._dialog.returnValue==="backdrop"?this._state={status:"connected"}:k(this,{sender:"client",type:this._state.shouldUnlink?"unlinked":"disconnected"});break}})}connectedCallback(){this._unsub=L(this,n=>{if(n.sender==="wallet")switch(n.type){case"state_changed":switch(n.payload.status){case"paired":this._state={status:"connected"};break;case"pairing":this._state={status:"pairing",pin:n.payload.pin};break;default:this._state={status:"disconnected"};break}this._update();break;case"disconnecting":this._state.status==="connected"&&(this._state={status:"disconnecting",shouldUnlink:!1},this._update());break}});const t=this.parentElement;t&&(this._observer=new MutationObserver(()=>{t.lastElementChild!==this&&(t.removeChild(this),t.appendChild(this))}),this._observer.observe(t,{childList:!0})),this.dispatchEvent(new CustomEvent("mounted"))}disconnectedCallback(){this._unsub?.(),this._observer?.disconnect(),this.dispatchEvent(new CustomEvent("unmounted"))}_cloneTemplate(t){return this._shadow.querySelector(`#${t}`)?.content.cloneNode(!0)}_update(){const t=this._state;switch(t.status){case"pairing":{const n=this._cloneTemplate(t.status),o=n.querySelector(".pin");o&&(o.textContent=t.pin),this._dialog.replaceChildren(n),this._dialog.open||this._dialog.showModal();break}case"disconnecting":{const n=this._cloneTemplate(t.status);this._dialog.replaceChildren(n);for(const o of this._dialog.querySelectorAll("button"))o.addEventListener("click",()=>{t.shouldUnlink=o.dataset.action==="unlink",this._dialog.close("disconnect")});this._dialog.open||this._dialog.showModal();break}default:{this._dialog.open&&this._dialog.close("no-content");break}}}}const ee=Object.freeze(Object.defineProperty({__proto__:null,HodeiClient:$},Symbol.toStringTag,{value:"Module"}));return f.HodeiHandler=H,f.hodeiPlugin=B,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"}),f})({},WeldCore);
|
package/lib.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("@ada-anvil/hodei-client"),o=require("@ada-anvil/weld/core");class i extends o.DefaultWalletHandler{async disconnect(){if("disconnect"in this.enabledApi&&typeof this.enabledApi.disconnect=="function")return this.enabledApi?.disconnect()}}function s(t){return{key:"hodei",connector:o.getDefaultWalletConnector(i),initialize:o.runOnce(e=>r.initialize({debug:e.config.debug,...t,onError:n=>{e.config.debug&&console.error("[WELD] Hodei socket error, disconnecting.",n),t?.onError?.(n,e),e.wallet.disconnect()},onClose:n=>{e.config.debug&&console.error("[WELD] Hodei socket closed, disconnecting.",n),t?.onClose?.(n,e),e.wallet.disconnect()},onWalletUpdate:n=>{e.config.debug&&console.log("[WELD] Hodei wallet updated, updating state.",n),t?.onWalletUpdate?.(n,e),e.wallet.updateState()}})?(e.extensions.registerWallets([{supported:!0,key:"hodei",displayName:"Hodei",icon:"https://raw.githubusercontent.com/cardano-forge/weld/main/images/wallets/hodei.png",website:"https://github.com/cardano-forge/hodei-client",supportsTxChaining:!1}]),!0):!1)}}exports.HodeiHandler=i;exports.hodeiPlugin=s;
|
package/lib.d.ts
CHANGED
|
@@ -1,6 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DefaultWalletHandler } from '@ada-anvil/weld/core';
|
|
2
|
+
import { WeldInstance } from '@ada-anvil/weld';
|
|
2
3
|
import { WeldPlugin } from '@ada-anvil/weld/plugins';
|
|
3
4
|
|
|
4
|
-
export declare
|
|
5
|
+
export declare class HodeiHandler extends DefaultWalletHandler {
|
|
6
|
+
disconnect(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export declare function hodeiPlugin(config?: Partial<HodeiPluginConfig>): WeldPlugin;
|
|
10
|
+
|
|
11
|
+
export declare type HodeiPluginConfig = {
|
|
12
|
+
bridge: {
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
};
|
|
15
|
+
anvil: Record<"mainnet" | "preprod", {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
}>;
|
|
19
|
+
debug: boolean;
|
|
20
|
+
waitForPairing: boolean;
|
|
21
|
+
onError(data: {
|
|
22
|
+
error?: string;
|
|
23
|
+
}, weld: WeldInstance): void;
|
|
24
|
+
onClose(data: {
|
|
25
|
+
code: number;
|
|
26
|
+
reason: string;
|
|
27
|
+
}, weld: WeldInstance): void;
|
|
28
|
+
onWalletUpdate(wallet: {
|
|
29
|
+
baseAddress: string;
|
|
30
|
+
stakeAddress: string;
|
|
31
|
+
network: "mainnet" | "preprod";
|
|
32
|
+
}, weld: WeldInstance): void;
|
|
33
|
+
};
|
|
5
34
|
|
|
6
35
|
export { }
|
package/lib.js
CHANGED
|
@@ -1,18 +1,40 @@
|
|
|
1
|
-
import { initialize as
|
|
2
|
-
import {
|
|
3
|
-
class c extends
|
|
1
|
+
import { initialize as t } from "@ada-anvil/hodei-client";
|
|
2
|
+
import { DefaultWalletHandler as i, runOnce as r, getDefaultWalletConnector as s } from "@ada-anvil/weld/core";
|
|
3
|
+
class c extends i {
|
|
4
4
|
async disconnect() {
|
|
5
5
|
if ("disconnect" in this.enabledApi && typeof this.enabledApi.disconnect == "function")
|
|
6
6
|
return this.enabledApi?.disconnect();
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
function
|
|
9
|
+
function u(o) {
|
|
10
10
|
return {
|
|
11
11
|
key: "hodei",
|
|
12
|
-
connector:
|
|
13
|
-
initialize:
|
|
12
|
+
connector: s(c),
|
|
13
|
+
initialize: r((e) => t({
|
|
14
|
+
debug: e.config.debug,
|
|
15
|
+
...o,
|
|
16
|
+
onError: (n) => {
|
|
17
|
+
e.config.debug && console.error("[WELD] Hodei socket error, disconnecting.", n), o?.onError?.(n, e), e.wallet.disconnect();
|
|
18
|
+
},
|
|
19
|
+
onClose: (n) => {
|
|
20
|
+
e.config.debug && console.error("[WELD] Hodei socket closed, disconnecting.", n), o?.onClose?.(n, e), e.wallet.disconnect();
|
|
21
|
+
},
|
|
22
|
+
onWalletUpdate: (n) => {
|
|
23
|
+
e.config.debug && console.log("[WELD] Hodei wallet updated, updating state.", n), o?.onWalletUpdate?.(n, e), e.wallet.updateState();
|
|
24
|
+
}
|
|
25
|
+
}) ? (e.extensions.registerWallets([
|
|
26
|
+
{
|
|
27
|
+
supported: !0,
|
|
28
|
+
key: "hodei",
|
|
29
|
+
displayName: "Hodei",
|
|
30
|
+
icon: "https://raw.githubusercontent.com/cardano-forge/weld/main/images/wallets/hodei.png",
|
|
31
|
+
website: "https://github.com/cardano-forge/hodei-client",
|
|
32
|
+
supportsTxChaining: !1
|
|
33
|
+
}
|
|
34
|
+
]), !0) : !1)
|
|
14
35
|
};
|
|
15
36
|
}
|
|
16
37
|
export {
|
|
17
|
-
|
|
38
|
+
c as HodeiHandler,
|
|
39
|
+
u as hodeiPlugin
|
|
18
40
|
};
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ada-anvil/weld-plugin-hodei",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.3",
|
|
4
4
|
"devDependencies": {
|
|
5
|
-
"@ada-anvil/weld": "^0.6.0-plugin-system.
|
|
5
|
+
"@ada-anvil/weld": "^0.6.0-plugin-system.2",
|
|
6
6
|
"@biomejs/biome": "2.4.4",
|
|
7
7
|
"@microsoft/api-extractor": "^7.57.4",
|
|
8
|
+
"@types/node": "^25.4.0",
|
|
8
9
|
"typescript": "~5.9.3",
|
|
9
10
|
"unplugin-dts": "^1.0.0-beta.6",
|
|
10
11
|
"vite": "^7.3.1",
|
|
@@ -12,7 +13,9 @@
|
|
|
12
13
|
},
|
|
13
14
|
"scripts": {
|
|
14
15
|
"dev": "vite",
|
|
15
|
-
"build": "
|
|
16
|
+
"build:client": "vite build --config ./vite.client.ts",
|
|
17
|
+
"build:cdn": "vite build --config ./vite.cdn.ts",
|
|
18
|
+
"build": "tsc && bun run build:client && bun run build:cdn",
|
|
16
19
|
"preview": "vite preview",
|
|
17
20
|
"check": "tsc --noEmit",
|
|
18
21
|
"lint": "biome check --write .",
|
|
@@ -22,21 +25,22 @@
|
|
|
22
25
|
},
|
|
23
26
|
"type": "module",
|
|
24
27
|
"peerDependencies": {
|
|
25
|
-
"@ada-anvil/weld": "^0.6.0-plugin-system.
|
|
28
|
+
"@ada-anvil/weld": "^0.6.0-plugin-system.2"
|
|
26
29
|
},
|
|
27
30
|
"dependencies": {
|
|
28
|
-
"@ada-anvil/hodei-client": "^0.0.1-alpha.
|
|
31
|
+
"@ada-anvil/hodei-client": "^0.0.1-alpha.5"
|
|
29
32
|
},
|
|
30
33
|
"files": [
|
|
31
34
|
"**"
|
|
32
35
|
],
|
|
33
|
-
"main": "./lib.
|
|
36
|
+
"main": "./lib.cjs",
|
|
34
37
|
"module": "./lib.js",
|
|
35
38
|
"types": "./lib.d.ts",
|
|
36
39
|
"exports": {
|
|
37
40
|
".": {
|
|
38
41
|
"types": "./lib.d.ts",
|
|
39
|
-
"import": "./lib.js"
|
|
42
|
+
"import": "./lib.js",
|
|
43
|
+
"require": "./lib.cjs"
|
|
40
44
|
}
|
|
41
45
|
}
|
|
42
46
|
}
|