@gardenfi/wallet-connectors 3.0.0-beta.2 → 3.0.0-beta.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.
Files changed (48) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.js +12 -7
  3. package/dist/index10.cjs +1 -1
  4. package/dist/index10.js +83 -3
  5. package/dist/index11.cjs +1 -1
  6. package/dist/index11.js +108 -2
  7. package/dist/index12.cjs +1 -1
  8. package/dist/index12.js +81 -2
  9. package/dist/index13.cjs +1 -0
  10. package/dist/index13.js +68 -0
  11. package/dist/index14.cjs +3 -0
  12. package/dist/index14.js +116 -0
  13. package/dist/index15.cjs +1 -0
  14. package/dist/index15.js +4 -0
  15. package/dist/index16.cjs +1 -0
  16. package/dist/index16.js +5 -0
  17. package/dist/index17.cjs +1 -0
  18. package/dist/index17.js +4 -0
  19. package/dist/index18.cjs +1 -0
  20. package/dist/index18.js +4 -0
  21. package/dist/index2.cjs +1 -1
  22. package/dist/index2.js +75 -97
  23. package/dist/index5.cjs +1 -1
  24. package/dist/index5.js +89 -61
  25. package/dist/index6.cjs +1 -1
  26. package/dist/index6.js +24 -82
  27. package/dist/index7.cjs +1 -1
  28. package/dist/index7.js +140 -79
  29. package/dist/index8.cjs +1 -1
  30. package/dist/index8.js +195 -70
  31. package/dist/index9.cjs +1 -1
  32. package/dist/index9.js +41 -45
  33. package/dist/src/bitcoin/bitcoin.types.d.ts +1 -1
  34. package/dist/src/bitcoin/btcWalletsProvider.d.ts +1 -1
  35. package/dist/src/bitcoin/btcWalletsProvider.types.d.ts +0 -7
  36. package/dist/src/bitcoin/index.d.ts +3 -3
  37. package/dist/src/index.d.ts +1 -0
  38. package/dist/src/litecoin/constants.d.ts +24 -0
  39. package/dist/src/litecoin/index.d.ts +5 -0
  40. package/dist/src/litecoin/litecoin.types.d.ts +51 -0
  41. package/dist/src/litecoin/ltcWalletsProvider.d.ts +17 -0
  42. package/dist/src/litecoin/ltcWalletsProvider.types.d.ts +22 -0
  43. package/dist/src/litecoin/providers/enkrypt/enkrypt.types.d.ts +22 -0
  44. package/dist/src/litecoin/providers/enkrypt/provider.d.ts +25 -0
  45. package/dist/src/litecoin/providers/litescribe/litescribe.types.d.ts +18 -0
  46. package/dist/src/litecoin/providers/litescribe/provider.d.ts +26 -0
  47. package/dist/src/litecoin/utils.d.ts +12 -0
  48. package/package.json +6 -5
package/dist/index7.js CHANGED
@@ -1,110 +1,171 @@
1
- var g = (n) => {
2
- throw TypeError(n);
1
+ var P = (i) => {
2
+ throw TypeError(i);
3
3
  };
4
- var p = (n, t, r) => t.has(n) || g("Cannot " + r);
5
- var s = (n, t, r) => (p(n, t, "read from private field"), r ? r.call(n) : t.get(n)), P = (n, t, r) => t.has(n) ? g("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(n) : t.set(n, r), y = (n, t, r, e) => (p(n, t, "write to private field"), e ? e.call(n, r) : t.set(n, r), r);
6
- import * as m from "bitcoinjs-lib";
7
- import { initEccLib as N } from "bitcoinjs-lib";
8
- import * as b from "tiny-secp256k1";
9
- import { Ok as u, Network as a, Err as i, executeWithTryCatch as l } from "@gardenfi/utils";
10
- import { WALLET_CONFIG as c } from "./index3.js";
11
- import { BitcoinProvider as I, BitcoinWallet as B } from "@gardenfi/core";
12
- import { getBalance as v } from "./index4.js";
13
- N(b);
14
- var o;
15
- class W {
4
+ var F = (i, t, e) => t.has(i) || P("Cannot " + e);
5
+ var n = (i, t, e) => (F(i, t, "read from private field"), e ? e.call(i) : t.get(i)), m = (i, t, e) => t.has(i) ? P("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(i) : t.set(i, e), g = (i, t, e, s) => (F(i, t, "write to private field"), s ? s.call(i, e) : t.set(i, e), e);
6
+ import * as T from "bitcoinjs-lib";
7
+ import * as I from "tiny-secp256k1";
8
+ import { Ok as w, Network as p, Err as r, executeWithTryCatch as x } from "@gardenfi/utils";
9
+ import { WALLET_CONFIG as v } from "./index6.js";
10
+ import { getBalance as A, getUTXOs as O, getLitecoinNetwork as U, getRecommendedFeeRate as L, broadcastTransaction as S } from "./index14.js";
11
+ T.initEccLib(I);
12
+ var o, a;
13
+ class C {
16
14
  constructor(t) {
17
- P(this, o);
18
- this.address = "", this.id = c.Phantom.id, this.name = c.Phantom.name, this.icon = c.Phantom.icon, this.disconnect = () => (this.address = "", Promise.resolve(u("Disconnected Phantom wallet"))), y(this, o, t);
15
+ m(this, o);
16
+ m(this, a);
17
+ this.address = "", this.id = v.Enkrypt.id, this.name = v.Enkrypt.name, this.icon = v.Enkrypt.icon, this.disconnect = () => (this.address = "", Promise.resolve(w("Disconnected Enkrypt wallet"))), g(this, o, t), g(this, a, p.MAINNET);
19
18
  }
20
19
  async connect(t) {
21
- if (t || (t = a.MAINNET), t === a.TESTNET)
22
- return i("Phantom wallet does not support testnet");
20
+ if (t || (t = p.MAINNET), t === p.TESTNET)
21
+ return r("Enkrypt wallet does not support testnet");
23
22
  try {
24
- const r = await s(this, o).requestAccounts();
25
- for (const e of r)
26
- e.purpose === "payment" && (this.address = e.address);
27
- return this.address === "" ? i("Could not connect to Phantom bitcoin payment account") : u({
23
+ const e = await n(this, o).requestAccounts();
24
+ return e.length > 0 && (this.address = e[0]), w({
28
25
  address: this.address,
29
26
  provider: this,
30
27
  network: t,
31
- id: c.Phantom.id
28
+ id: v.Enkrypt.id
32
29
  });
33
- } catch (r) {
34
- return i("Error while connecting to Phantom wallet: " + r);
30
+ } catch (e) {
31
+ return r("Error while connecting to Enkrypt wallet: " + e);
35
32
  }
36
33
  }
37
34
  async requestAccounts() {
38
- return await l(async () => {
39
- const t = await s(this, o).requestAccounts();
40
- return t.length > 0 && (this.address = t[0].address), t.map((r) => r.address);
41
- }, "Error while requesting accounts from Phantom wallet");
35
+ return await x(async () => await n(this, o).requestAccounts(), "Error while requesting accounts from the Enkrypt wallet");
42
36
  }
43
37
  async getAccounts() {
44
38
  return this.requestAccounts();
45
39
  }
46
- // bitcoin testnet is not supported in Phantom wallet
47
40
  async getNetwork() {
48
- return u(a.MAINNET);
41
+ return w(n(this, a));
49
42
  }
50
43
  async switchNetwork() {
51
- return i("Phantom wallet does not support testnet");
44
+ g(this, a, n(this, a) === p.MAINNET ? p.TESTNET : p.MAINNET);
45
+ const t = await this.connect();
46
+ return t.error ? r(
47
+ `Failed to connect to ${n(this, a)}: ${t.error}`
48
+ ) : w(n(this, a));
52
49
  }
53
50
  async getBalance() {
54
- return await l(async () => {
55
- const t = await v(this.address, a.MAINNET);
56
- if (t.ok && t.val)
57
- return t.val;
58
- throw new Error(t.error);
59
- }, "Error while getting balance from Phantom wallet");
51
+ let t = await this.getAccounts();
52
+ if (!t.ok) return r("Failed to get address");
53
+ this.address = t.val[0];
54
+ const e = await this.getNetwork();
55
+ return e.ok ? (g(this, a, e.val), await A(this.address, n(this, a))) : r("Failed to get network");
60
56
  }
61
- async sendBitcoin(t, r) {
62
- return await l(async () => {
63
- const e = m.networks.bitcoin, f = new I(a.MAINNET);
64
- try {
65
- const { txHex: d, utxoCount: A } = await B.generateUnsignedPSBT(
66
- f,
67
- e,
68
- this.address,
69
- t,
70
- r
71
- ), E = await s(this, o).signPSBT(
72
- this.fromHexString(d),
73
- {
74
- inputsToSign: [
75
- {
76
- address: this.address,
77
- signingIndexes: Array.from({ length: A }, (S, x) => x),
78
- sigHash: m.Transaction.SIGHASH_ALL
79
- }
80
- ]
81
- }
82
- ), w = m.Psbt.fromBuffer(
83
- Buffer.from(E)
84
- );
85
- w.finalizeAllInputs();
86
- const h = w.extractTransaction();
87
- console.log("tx", h);
88
- const T = h.getId();
89
- return await f.broadcast(h.toHex()), T;
90
- } catch (d) {
91
- throw new Error(`Failed to send bitcoin: ${d}`);
57
+ async sendLitecoin(t, e) {
58
+ try {
59
+ const s = await this.getAccounts();
60
+ if (!s.ok) return r("Failed to get address");
61
+ this.address = s.val[0];
62
+ const b = await this.getNetwork();
63
+ if (!b.ok)
64
+ return r("Failed to get network");
65
+ if (g(this, a, b.val), !t || t.trim() === "")
66
+ return r("Invalid destination address");
67
+ if (e <= 0)
68
+ return r("Amount must be greater than 0");
69
+ const l = await this.getBalance();
70
+ if (!l.ok)
71
+ return r("Failed to get balance", l.error);
72
+ if (l.val.total < e)
73
+ return r("Insufficient balance");
74
+ const d = await O(this.address, n(this, a));
75
+ if (!d.ok)
76
+ return r("Failed to fetch UTXOs", d.error);
77
+ const k = d.val;
78
+ if (!k || k.length === 0)
79
+ return r("No UTXOs available");
80
+ const h = await this.buildTransaction(
81
+ k,
82
+ t,
83
+ e,
84
+ this.address
85
+ );
86
+ if (!h.ok)
87
+ return r("Failed to build transaction", h.error);
88
+ const f = await this.signPsbt(h.val);
89
+ if (!f.ok)
90
+ return r("Failed to sign transaction", f.error);
91
+ const c = await this.broadcastTransaction(f.val);
92
+ return c.ok ? w(c.val) : r("Failed to broadcast transaction", c.error);
93
+ } catch (s) {
94
+ return s instanceof Error ? s.message.includes("User rejected") || s.message.includes("cancelled") || s.message.includes("denied") ? r("Transaction cancelled by user") : r("Error while sending Litecoin: " + s.message) : r("Error while sending Litecoin", String(s));
95
+ }
96
+ }
97
+ async buildTransaction(t, e, s, b) {
98
+ try {
99
+ const l = U(n(this, a)), d = new T.Psbt({ network: l }), k = t.sort((u, y) => y.value - u.value), h = await L(n(this, a));
100
+ if (!h.ok)
101
+ return r("Failed to fetch recommended fee rate", h.error);
102
+ const f = h.val;
103
+ let c = 0;
104
+ for (const u of k) {
105
+ if (c >= s + f * 250) break;
106
+ let y;
107
+ try {
108
+ y = {
109
+ script: T.address.toOutputScript(
110
+ b,
111
+ l
112
+ ),
113
+ value: u.value
114
+ };
115
+ } catch {
116
+ if (u.scriptPubKey)
117
+ y = {
118
+ script: Buffer.from(u.scriptPubKey, "hex"),
119
+ value: u.value
120
+ };
121
+ else
122
+ throw new Error("Cannot determine script for UTXO");
123
+ }
124
+ d.addInput({
125
+ hash: u.txid,
126
+ index: u.vout,
127
+ witnessUtxo: y
128
+ }), c += u.value;
92
129
  }
93
- }, "Error while sending bitcoin from Phantom wallet");
130
+ if (c === 0)
131
+ return r("No valid UTXOs found");
132
+ const E = (d.txInputs.length * 148 + 2 * 34 + 10) * f;
133
+ if (c < s + E)
134
+ return r(
135
+ `Insufficient funds: need ${s + E} sats, have ${c} sats`
136
+ );
137
+ d.addOutput({
138
+ address: e,
139
+ value: s
140
+ });
141
+ const N = c - s - E;
142
+ return N > 546 && d.addOutput({
143
+ address: b,
144
+ value: N
145
+ }), w(d.toBase64());
146
+ } catch (l) {
147
+ return r("Error building transaction", String(l));
148
+ }
149
+ }
150
+ async signPsbt(t) {
151
+ return await x(async () => await n(this, o).signPsbt(t), "Error while signing transaction");
94
152
  }
95
- fromHexString(t) {
96
- return Uint8Array.from(
97
- t.match(/.{1,2}/g).map((r) => parseInt(r, 16))
153
+ async broadcastTransaction(t) {
154
+ const e = typeof n(this, o).pushPsbt == "function" ? n(this, o).pushPsbt.bind(n(this, o)) : void 0;
155
+ return await S(
156
+ t,
157
+ n(this, a),
158
+ e
98
159
  );
99
160
  }
100
- on(t, r) {
101
- s(this, o).on(t, r);
161
+ on(t, e) {
162
+ n(this, o).on(t, e);
102
163
  }
103
- off(t, r) {
104
- s(this, o).off(t, r);
164
+ off(t, e) {
165
+ n(this, o).off(t, e);
105
166
  }
106
167
  }
107
- o = new WeakMap();
168
+ o = new WeakMap(), a = new WeakMap();
108
169
  export {
109
- W as PhantomProvider
170
+ C as EnkryptProvider
110
171
  };
package/dist/index8.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var l=n=>{throw TypeError(n)};var d=(n,e,t)=>e.has(n)||l("Cannot "+t);var o=(n,e,t)=>(d(n,e,"read from private field"),t?t.call(n):e.get(n)),N=(n,e,t)=>e.has(n)?l("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),k=(n,e,t,s)=>(d(n,e,"write to private field"),s?s.call(n,t):e.set(n,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("./index3.cjs"),u=require("./index11.cjs"),r=require("@gardenfi/utils");var i;class y{constructor(e){N(this,i);this.address="",this.id=w.WALLET_CONFIG.Xverse.id,this.name=w.WALLET_CONFIG.Xverse.name,this.icon=w.WALLET_CONFIG.Xverse.icon,this.connect=async t=>{try{t||(t=r.Network.MAINNET),await o(this,i).request("wallet_connect",null);const s=await this.getNetwork();if(s.error)return r.Err("Could not get network",s.error);if(s.val!==t){const c=await this.switchNetwork();if(c.error)return r.Err("Failed to switch network",c.error)}const a=await this.getAccounts();return a.ok&&a.val.length>0&&(this.address=a.val[0]),r.Ok({address:this.address,provider:this,network:t,id:w.WALLET_CONFIG.Xverse.id})}catch(s){return r.Err("Error while connecting to the XVerse wallet",s)}},this.getBalance=async()=>await r.executeWithTryCatch(async()=>(await o(this,i).request("getBalance",{})).result,"Error while getting balance from XVerse wallet"),this.requestAccounts=async()=>await r.executeWithTryCatch(async()=>(await o(this,i).request("getAccounts",{purposes:["payment"],message:"I want to connect"})).result.map(s=>s.address)),this.getAccounts=async()=>await r.executeWithTryCatch(async()=>(await o(this,i).request("getAddresses",{purposes:["payment"]})).result.addresses.map(s=>s.address)),this.sendBitcoin=async(t,s)=>await r.executeWithTryCatch(async()=>{var h;const a=await o(this,i).request("sendTransfer",{recipients:[{address:t,amount:s}]}),c=(h=a.result)==null?void 0:h.txid;if(c)return r.Ok(c);throw new Error(a.error)},"Error while sending bitcoin from Xverse wallet"),this.on=()=>{},this.off=()=>{},this.disconnect=()=>(this.address="",Promise.resolve(r.Ok("Disconnected"))),k(this,i,e)}async getNetwork(){return await r.executeWithTryCatch(async()=>{const e=await o(this,i).request("wallet_getNetwork",null);if(e.result.bitcoin.name===u.XverseBitcoinNetworkType.Mainnet)return r.Network.MAINNET;if(e.result.bitcoin.name===u.XverseBitcoinNetworkType.Testnet4)return r.Network.TESTNET;throw new Error(e.result)},"Error while getting network from Xverse wallet")}async switchNetwork(){try{const e=await this.getNetwork();if(e.error)return r.Err("Failed to get current network");const t=e.val===r.Network.MAINNET?u.XverseBitcoinNetworkType.Testnet4:u.XverseBitcoinNetworkType.Mainnet;await o(this,i).request("wallet_changeNetwork",{name:t});const s=await this.getNetwork();return s.ok?r.Ok(s.val):r.Err("Failed to verify network switch")}catch(e){return r.Err("Error while switching network in Xverse:",e)}}}i=new WeakMap;exports.XverseProvider=y;
1
+ "use strict";var L=s=>{throw TypeError(s)};var O=(s,t,e)=>t.has(s)||L("Cannot "+e);var n=(s,t,e)=>(O(s,t,"read from private field"),e?e.call(s):t.get(s)),y=(s,t,e)=>t.has(s)?L("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(s):t.set(s,e),b=(s,t,e,i)=>(O(s,t,"write to private field"),i?i.call(s,e):t.set(s,e),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("@gardenfi/utils"),k=require("./index15.cjs"),P=require("bitcoinjs-lib"),S=require("tiny-secp256k1"),N=require("./index6.cjs"),T=require("./index14.cjs");function x(s){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const e in s)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(s,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>s[e]})}}return t.default=s,Object.freeze(t)}const v=x(P),I=x(S);v.initEccLib(I);var a,o;class U{constructor(t){y(this,a);y(this,o);this.address="",this.id=N.WALLET_CONFIG.LiteScribe.id,this.name=N.WALLET_CONFIG.LiteScribe.name,this.icon=N.WALLET_CONFIG.LiteScribe.icon,b(this,a,t),b(this,o,r.Network.TESTNET)}async connect(t){try{t||(t=n(this,o));let e=await this.getNetwork();if(!e.ok)return r.Err("Could not get network",e.error);if(e.val!==t){const d=await this.switchNetwork();if(!d.ok)return r.Err("Failed to switch network",d.error)}const i=await n(this,a).requestAccounts();return i.length>0&&(this.address=i[0]),r.Ok({address:this.address,provider:this,network:t,id:N.WALLET_CONFIG.LiteScribe.id})}catch(e){return r.Err("Error while connecting to the litescribe wallet",e)}}async getBalance(){let t=await this.getAccounts();if(!t.ok)return r.Err("Failed to get address");this.address=t.val[0];const e=await this.getNetwork();return e.ok?(b(this,o,e.val),await T.getBalance(this.address,n(this,o))):r.Err("Failed to get network")}async requestAccounts(){return await r.executeWithTryCatch(async()=>await n(this,a).requestAccounts(),"Error while requesting accounts from the litescribe wallet")}async getAccounts(){return await r.executeWithTryCatch(async()=>await n(this,a).getAccounts(),"Error while getting accounts from the litescribe wallet")}async sendLitecoin(t,e){try{const i=await this.getAccounts();if(!i.ok)return r.Err("Failed to get address");this.address=i.val[0];const d=await this.getNetwork();if(!d.ok)return r.Err("Failed to get network");if(b(this,o,d.val),!t||t.trim()==="")return r.Err("Invalid destination address");if(e<=0)return r.Err("Amount must be greater than 0");const h=await this.getBalance();if(!h.ok)return r.Err("Failed to get balance",h.error);if(h.val.total<e)return r.Err("Insufficient balance");const u=await this.getUTXOs();if(!u.ok)return r.Err("Failed to fetch UTXOs",u.error);const g=u.val;if(!g||g.length===0)return r.Err("No UTXOs available");const w=await this.buildTransaction(g,t,e,this.address);if(!w.ok)return r.Err("Failed to build transaction",w.error);console.log("psbtResult",w.val);const f=await this.signPsbt(w.val);if(!f.ok)return r.Err("Failed to sign transaction",f.error);const c=await this.broadcastTransaction(f.val);return c.ok?r.Ok(c.val):r.Err("Failed to broadcast transaction",c.error)}catch(i){return i instanceof Error?i.message.includes("User rejected")||i.message.includes("cancelled")||i.message.includes("denied")?r.Err("Transaction cancelled by user"):r.Err("Error while sending Litecoin: "+i.message):r.Err("Error while sending Litecoin",String(i))}}async getUTXOs(){return await r.executeWithTryCatch(async()=>{if(typeof n(this,a).getUtxos=="function")return await n(this,a).getUtxos();const t=n(this,o)===r.Network.MAINNET?`https://litecoinspace.org/api/address/${this.address}/utxo`:`https://litecoinspace.org/testnet/api/address/${this.address}/utxo`,e=await fetch(t);if(!e.ok)throw new Error(`Failed to fetch UTXOs: ${e.statusText}`);return await e.json()},"Error while fetching UTXOs")}async buildTransaction(t,e,i,d){try{const h=T.getLitecoinNetwork(n(this,o)),u=new v.Psbt({network:h}),g=t.sort((l,E)=>E.value-l.value),w=await T.getRecommendedFeeRate(n(this,o));if(!w.ok)return r.Err("Failed to fetch recommended fee rate",w.error);const f=w.val;let c=0;for(const l of g){if(c>=i+f*250)break;let E;try{E={script:v.address.toOutputScript(d,h),value:l.value}}catch{if(l.scriptPubKey)E={script:Buffer.from(l.scriptPubKey,"hex"),value:l.value};else throw new Error("Cannot determine script for UTXO")}u.addInput({hash:l.txid,index:l.vout,witnessUtxo:E}),c+=l.value}if(c===0)return r.Err("No valid UTXOs found");const p=(u.txInputs.length*148+2*34+10)*f;if(c<i+p)return r.Err(`Insufficient funds: need ${i+p} sats, have ${c} sats`);u.addOutput({address:e,value:i});const m=c-i-p;return m>546&&u.addOutput({address:d,value:m}),r.Ok(u.toBase64())}catch(h){return r.Err("Error building transaction",String(h))}}async signPsbt(t){return await r.executeWithTryCatch(async()=>await n(this,a).signPsbt(t),"Error while signing transaction")}async broadcastTransaction(t){const e=typeof n(this,a).pushPsbt=="function"?n(this,a).pushPsbt.bind(n(this,a)):void 0;return await T.broadcastTransaction(t,n(this,o),e)}async getNetwork(){return await r.executeWithTryCatch(async()=>{const t=await n(this,a).getNetwork();if(t===k.LitescribeNetworkEnum.LIVENET)return r.Network.MAINNET;if(t===k.LitescribeNetworkEnum.TESTNET)return r.Network.TESTNET;throw new Error("Invalid or unsupported network"+t)},"Error while getting network from Litescribe wallet")}async switchNetwork(){try{const t=await this.getNetwork();if(t.error)return r.Err("Failed to get current network");const e=t.val===r.Network.MAINNET?k.LitescribeNetworkEnum.TESTNET:k.LitescribeNetworkEnum.LIVENET;await n(this,a).switchNetwork(e);const i=await this.getNetwork();return i.ok?r.Ok(i.val):r.Err("Failed to verify network switch")}catch(t){return r.Err("Error while switching network in litescribe:",t)}}async disconnect(){return this.address="",Promise.resolve(r.Ok("Disconnected litescribe wallet"))}on(t,e){n(this,a).on(t,e)}off(t,e){n(this,a).off(t,e)}}a=new WeakMap,o=new WeakMap;exports.LitescribeProvider=U;
package/dist/index8.js CHANGED
@@ -1,83 +1,208 @@
1
- var N = (s) => {
2
- throw TypeError(s);
1
+ var L = (a) => {
2
+ throw TypeError(a);
3
3
  };
4
- var k = (s, e, t) => e.has(s) || N("Cannot " + t);
5
- var i = (s, e, t) => (k(s, e, "read from private field"), t ? t.call(s) : e.get(s)), m = (s, e, t) => e.has(s) ? N("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(s) : e.set(s, t), f = (s, e, t, r) => (k(s, e, "write to private field"), r ? r.call(s, t) : e.set(s, t), t);
6
- import { WALLET_CONFIG as u } from "./index3.js";
7
- import { XverseBitcoinNetworkType as h } from "./index11.js";
8
- import { Network as l, Err as a, Ok as d, executeWithTryCatch as w } from "@gardenfi/utils";
9
- var n;
10
- class T {
11
- constructor(e) {
12
- m(this, n);
13
- this.address = "", this.id = u.Xverse.id, this.name = u.Xverse.name, this.icon = u.Xverse.icon, this.connect = async (t) => {
14
- try {
15
- t || (t = l.MAINNET), await i(this, n).request("wallet_connect", null);
16
- const r = await this.getNetwork();
17
- if (r.error)
18
- return a("Could not get network", r.error);
19
- if (r.val !== t) {
20
- const c = await this.switchNetwork();
21
- if (c.error)
22
- return a("Failed to switch network", c.error);
4
+ var P = (a, t, e) => t.has(a) || L("Cannot " + e);
5
+ var i = (a, t, e) => (P(a, t, "read from private field"), e ? e.call(a) : t.get(a)), y = (a, t, e) => t.has(a) ? L("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(a) : t.set(a, e), k = (a, t, e, s) => (P(a, t, "write to private field"), s ? s.call(a, e) : t.set(a, e), e);
6
+ import { Network as p, Err as r, Ok as v, executeWithTryCatch as T } from "@gardenfi/utils";
7
+ import { LitescribeNetworkEnum as E } from "./index15.js";
8
+ import * as x from "bitcoinjs-lib";
9
+ import * as I from "tiny-secp256k1";
10
+ import { WALLET_CONFIG as N } from "./index6.js";
11
+ import { getBalance as O, getLitecoinNetwork as R, getRecommendedFeeRate as S, broadcastTransaction as A } from "./index14.js";
12
+ x.initEccLib(I);
13
+ var n, o;
14
+ class j {
15
+ constructor(t) {
16
+ y(this, n);
17
+ y(this, o);
18
+ this.address = "", this.id = N.LiteScribe.id, this.name = N.LiteScribe.name, this.icon = N.LiteScribe.icon, k(this, n, t), k(this, o, p.TESTNET);
19
+ }
20
+ async connect(t) {
21
+ try {
22
+ t || (t = i(this, o));
23
+ let e = await this.getNetwork();
24
+ if (!e.ok)
25
+ return r("Could not get network", e.error);
26
+ if (e.val !== t) {
27
+ const l = await this.switchNetwork();
28
+ if (!l.ok)
29
+ return r("Failed to switch network", l.error);
30
+ }
31
+ const s = await i(this, n).requestAccounts();
32
+ return s.length > 0 && (this.address = s[0]), v({
33
+ address: this.address,
34
+ provider: this,
35
+ network: t,
36
+ id: N.LiteScribe.id
37
+ });
38
+ } catch (e) {
39
+ return r("Error while connecting to the litescribe wallet", e);
40
+ }
41
+ }
42
+ async getBalance() {
43
+ let t = await this.getAccounts();
44
+ if (!t.ok) return r("Failed to get address");
45
+ this.address = t.val[0];
46
+ const e = await this.getNetwork();
47
+ return e.ok ? (k(this, o, e.val), await O(this.address, i(this, o))) : r("Failed to get network");
48
+ }
49
+ async requestAccounts() {
50
+ return await T(async () => await i(this, n).requestAccounts(), "Error while requesting accounts from the litescribe wallet");
51
+ }
52
+ async getAccounts() {
53
+ return await T(async () => await i(this, n).getAccounts(), "Error while getting accounts from the litescribe wallet");
54
+ }
55
+ async sendLitecoin(t, e) {
56
+ try {
57
+ const s = await this.getAccounts();
58
+ if (!s.ok) return r("Failed to get address");
59
+ this.address = s.val[0];
60
+ const l = await this.getNetwork();
61
+ if (!l.ok)
62
+ return r("Failed to get network");
63
+ if (k(this, o, l.val), !t || t.trim() === "")
64
+ return r("Invalid destination address");
65
+ if (e <= 0)
66
+ return r("Amount must be greater than 0");
67
+ const h = await this.getBalance();
68
+ if (!h.ok)
69
+ return r("Failed to get balance", h.error);
70
+ if (h.val.total < e)
71
+ return r("Insufficient balance");
72
+ const u = await this.getUTXOs();
73
+ if (!u.ok)
74
+ return r("Failed to fetch UTXOs", u.error);
75
+ const g = u.val;
76
+ if (!g || g.length === 0)
77
+ return r("No UTXOs available");
78
+ const w = await this.buildTransaction(
79
+ g,
80
+ t,
81
+ e,
82
+ this.address
83
+ );
84
+ if (!w.ok)
85
+ return r("Failed to build transaction", w.error);
86
+ console.log("psbtResult", w.val);
87
+ const f = await this.signPsbt(w.val);
88
+ if (!f.ok)
89
+ return r("Failed to sign transaction", f.error);
90
+ const c = await this.broadcastTransaction(f.val);
91
+ return c.ok ? v(c.val) : r("Failed to broadcast transaction", c.error);
92
+ } catch (s) {
93
+ return s instanceof Error ? s.message.includes("User rejected") || s.message.includes("cancelled") || s.message.includes("denied") ? r("Transaction cancelled by user") : r("Error while sending Litecoin: " + s.message) : r("Error while sending Litecoin", String(s));
94
+ }
95
+ }
96
+ async getUTXOs() {
97
+ return await T(async () => {
98
+ if (typeof i(this, n).getUtxos == "function")
99
+ return await i(this, n).getUtxos();
100
+ const t = i(this, o) === p.MAINNET ? `https://litecoinspace.org/api/address/${this.address}/utxo` : `https://litecoinspace.org/testnet/api/address/${this.address}/utxo`, e = await fetch(t);
101
+ if (!e.ok)
102
+ throw new Error(`Failed to fetch UTXOs: ${e.statusText}`);
103
+ return await e.json();
104
+ }, "Error while fetching UTXOs");
105
+ }
106
+ async buildTransaction(t, e, s, l) {
107
+ try {
108
+ const h = R(i(this, o)), u = new x.Psbt({ network: h }), g = t.sort((d, b) => b.value - d.value), w = await S(i(this, o));
109
+ if (!w.ok)
110
+ return r("Failed to fetch recommended fee rate", w.error);
111
+ const f = w.val;
112
+ let c = 0;
113
+ for (const d of g) {
114
+ if (c >= s + f * 250) break;
115
+ let b;
116
+ try {
117
+ b = {
118
+ script: x.address.toOutputScript(
119
+ l,
120
+ h
121
+ ),
122
+ value: d.value
123
+ };
124
+ } catch {
125
+ if (d.scriptPubKey)
126
+ b = {
127
+ script: Buffer.from(d.scriptPubKey, "hex"),
128
+ value: d.value
129
+ };
130
+ else
131
+ throw new Error("Cannot determine script for UTXO");
23
132
  }
24
- const o = await this.getAccounts();
25
- return o.ok && o.val.length > 0 && (this.address = o.val[0]), d({
26
- address: this.address,
27
- provider: this,
28
- network: t,
29
- id: u.Xverse.id
30
- });
31
- } catch (r) {
32
- return a("Error while connecting to the XVerse wallet", r);
133
+ u.addInput({
134
+ hash: d.txid,
135
+ index: d.vout,
136
+ witnessUtxo: b
137
+ }), c += d.value;
33
138
  }
34
- }, this.getBalance = async () => await w(async () => (await i(this, n).request("getBalance", {})).result, "Error while getting balance from XVerse wallet"), this.requestAccounts = async () => await w(async () => (await i(this, n).request("getAccounts", {
35
- purposes: ["payment"],
36
- message: "I want to connect"
37
- })).result.map((r) => r.address)), this.getAccounts = async () => await w(async () => (await i(this, n).request("getAddresses", {
38
- purposes: ["payment"]
39
- })).result.addresses.map((r) => r.address)), this.sendBitcoin = async (t, r) => await w(async () => {
40
- var g;
41
- const o = await i(this, n).request("sendTransfer", {
42
- recipients: [{ address: t, amount: r }]
43
- }), c = (g = o.result) == null ? void 0 : g.txid;
44
- if (c)
45
- return d(c);
46
- throw new Error(o.error);
47
- }, "Error while sending bitcoin from Xverse wallet"), this.on = () => {
48
- }, this.off = () => {
49
- }, this.disconnect = () => (this.address = "", Promise.resolve(d("Disconnected"))), f(this, n, e);
139
+ if (c === 0)
140
+ return r("No valid UTXOs found");
141
+ const m = (u.txInputs.length * 148 + 2 * 34 + 10) * f;
142
+ if (c < s + m)
143
+ return r(
144
+ `Insufficient funds: need ${s + m} sats, have ${c} sats`
145
+ );
146
+ u.addOutput({
147
+ address: e,
148
+ value: s
149
+ });
150
+ const F = c - s - m;
151
+ return F > 546 && u.addOutput({
152
+ address: l,
153
+ value: F
154
+ }), v(u.toBase64());
155
+ } catch (h) {
156
+ return r("Error building transaction", String(h));
157
+ }
158
+ }
159
+ async signPsbt(t) {
160
+ return await T(async () => await i(this, n).signPsbt(t), "Error while signing transaction");
161
+ }
162
+ async broadcastTransaction(t) {
163
+ const e = typeof i(this, n).pushPsbt == "function" ? i(this, n).pushPsbt.bind(
164
+ i(this, n)
165
+ ) : void 0;
166
+ return await A(
167
+ t,
168
+ i(this, o),
169
+ e
170
+ );
50
171
  }
51
172
  async getNetwork() {
52
- return await w(async () => {
53
- const e = await i(this, n).request(
54
- "wallet_getNetwork",
55
- null
56
- );
57
- if (e.result.bitcoin.name === h.Mainnet)
58
- return l.MAINNET;
59
- if (e.result.bitcoin.name === h.Testnet4)
60
- return l.TESTNET;
61
- throw new Error(e.result);
62
- }, "Error while getting network from Xverse wallet");
173
+ return await T(async () => {
174
+ const t = await i(this, n).getNetwork();
175
+ if (t === E.LIVENET)
176
+ return p.MAINNET;
177
+ if (t === E.TESTNET)
178
+ return p.TESTNET;
179
+ throw new Error("Invalid or unsupported network" + t);
180
+ }, "Error while getting network from Litescribe wallet");
63
181
  }
64
182
  async switchNetwork() {
65
183
  try {
66
- const e = await this.getNetwork();
67
- if (e.error)
68
- return a("Failed to get current network");
69
- const t = e.val === l.MAINNET ? h.Testnet4 : h.Mainnet;
70
- await i(this, n).request("wallet_changeNetwork", {
71
- name: t
72
- });
73
- const r = await this.getNetwork();
74
- return r.ok ? d(r.val) : a("Failed to verify network switch");
75
- } catch (e) {
76
- return a("Error while switching network in Xverse:", e);
184
+ const t = await this.getNetwork();
185
+ if (t.error)
186
+ return r("Failed to get current network");
187
+ const e = t.val === p.MAINNET ? E.TESTNET : E.LIVENET;
188
+ await i(this, n).switchNetwork(e);
189
+ const s = await this.getNetwork();
190
+ return s.ok ? v(s.val) : r("Failed to verify network switch");
191
+ } catch (t) {
192
+ return r("Error while switching network in litescribe:", t);
77
193
  }
78
194
  }
195
+ async disconnect() {
196
+ return this.address = "", Promise.resolve(v("Disconnected litescribe wallet"));
197
+ }
198
+ on(t, e) {
199
+ i(this, n).on(t, e);
200
+ }
201
+ off(t, e) {
202
+ i(this, n).off(t, e);
203
+ }
79
204
  }
80
- n = new WeakMap();
205
+ n = new WeakMap(), o = new WeakMap();
81
206
  export {
82
- T as XverseProvider
207
+ j as LitescribeProvider
83
208
  };
package/dist/index9.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var o=r=>{throw TypeError(r)};var l=(r,e,t)=>e.has(r)||o("Cannot "+t);var s=(r,e,t)=>(l(r,e,"read from private field"),t?t.call(r):e.get(r)),u=(r,e,t)=>e.has(r)?o("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),h=(r,e,t,c)=>(l(r,e,"write to private field"),c?c.call(r,t):e.set(r,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("./index12.cjs"),a=require("./index3.cjs"),n=require("@gardenfi/utils");var i;class p{constructor(e){u(this,i);this.address="",this.id=a.WALLET_CONFIG.Keplr.id,this.name=a.WALLET_CONFIG.Keplr.name,this.icon=a.WALLET_CONFIG.Keplr.icon,h(this,i,e)}async connect(e){if(e||(e=n.Network.MAINNET),e===n.Network.TESTNET)return n.Err("Keplr wallet does not support testnet4");try{const t=await s(this,i).requestAccounts();return t.length>0&&(this.address=t[0]),n.Ok({address:this.address,provider:this,network:e,id:a.WALLET_CONFIG.Keplr.id})}catch(t){return n.Err("Error while connecting to the Keplr wallet",t)}}async requestAccounts(){return await n.executeWithTryCatch(async()=>await s(this,i).requestAccounts(),"Error while requesting accounts from the Keplr wallet")}async getAccounts(){return await n.executeWithTryCatch(async()=>await s(this,i).getAccounts(),"Error while getting accounts from the Keplr wallet")}async getNetwork(){return await n.executeWithTryCatch(async()=>{const e=await s(this,i).getChain();if(e.enum===w.KeplrBitcoinChainType.MAINNET)return n.Network.MAINNET;if(e.enum===w.KeplrBitcoinChainType.TESTNET)return n.Network.TESTNET;throw new Error("Invalid or unsupported network"+e.enum)},"Error while getting network from the Keplr wallet")}async switchNetwork(){return n.Err("Keplr wallet does not support testnet4")}async getBalance(){return await n.executeWithTryCatch(async()=>await s(this,i).getBalance(),"Error while getting balance from Keplr wallet")}async sendBitcoin(e,t){return await n.executeWithTryCatch(async()=>await s(this,i).sendBitcoin(e,t),"Error while sending bitcoin from Keplr wallet")}on(e,t){s(this,i).on(e,t)}off(e,t){s(this,i).off(e,t)}async disconnect(){return await s(this,i).disconnect(),this.address="",n.Ok("Disconnected Keplr wallet")}}i=new WeakMap;exports.KeplrProvider=p;
1
+ "use strict";var l=i=>{throw TypeError(i)};var d=(i,t,e)=>t.has(i)||l("Cannot "+e);var n=(i,t,e)=>(d(i,t,"read from private field"),e?e.call(i):t.get(i)),h=(i,t,e)=>t.has(i)?l("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(i):t.set(i,e),a=(i,t,e,u)=>(d(i,t,"write to private field"),u?u.call(i,e):t.set(i,e),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("@gardenfi/utils"),o=require("./index3.cjs");var s,c;class w{constructor(t,e){h(this,s);h(this,c);this.address="",this.id=o.WALLET_CONFIG.OKX.id,this.name=o.WALLET_CONFIG.OKX.name,this.icon=o.WALLET_CONFIG.OKX.icon,this.disconnect=()=>(this.address="",n(this,s).disconnect(),Promise.resolve(r.Ok("Disconnected OKX wallet"))),a(this,s,t),a(this,c,e)}async connect(){try{const t=await n(this,s).connect();return!t||!t.address?r.Err("Failed to connect to OKX wallet"):(this.address=t.address,r.Ok({address:this.address,provider:this,network:n(this,c),id:o.WALLET_CONFIG.OKX.id}))}catch(t){return r.Err("Error while connecting to the OKX wallet",t)}}async getPublicKey(){return await r.executeWithTryCatch(async()=>await n(this,s).getPublicKey(),"Error while getting public key from OKX wallet")}async requestAccounts(){const t=await this.connect();return t.ok?r.Ok([t.val.address]):r.Err(t.error)}async getAccounts(){return n(this,c)===r.Network.TESTNET?await this.requestAccounts():await r.executeWithTryCatch(async()=>await n(this,s).getAccounts(),"Error while getting accounts from OKX wallet")}async getNetwork(){return r.Ok(n(this,c))}async switchNetwork(){a(this,c,n(this,c)===r.Network.MAINNET?r.Network.TESTNET:r.Network.MAINNET);const t=await this.connect();return t.error?r.Err(`Failed to connect to ${n(this,c)}: ${t.error}`):r.Ok(n(this,c))}async getBalance(){return await r.executeWithTryCatch(async()=>await n(this,s).getBalance(),"Error while getting balance from OKX wallet")}async sendBitcoin(t,e){return await r.executeWithTryCatch(async()=>await n(this,s).sendBitcoin(t,e),"Error while sending bitcoin from OKX wallet")}on(t,e){n(this,s).on(t,e)}off(t,e){n(this,s).off(t,e)}}s=new WeakMap,c=new WeakMap;exports.OKXProvider=w;