@rango-dev/provider-phantom 0.43.1-next.3 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/legacy/index.d.ts +2 -2
- package/dist/legacy/index.d.ts.map +1 -1
- package/dist/legacy/signer.d.ts +2 -1
- package/dist/legacy/signer.d.ts.map +1 -1
- package/dist/legacy/utxoSigner.d.ts +12 -0
- package/dist/legacy/utxoSigner.d.ts.map +1 -0
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +4 -4
- package/dist/namespaces/utxo.d.ts +4 -0
- package/dist/namespaces/utxo.d.ts.map +1 -0
- package/dist/provider-phantom.build.json +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/constants.ts +1 -1
- package/src/legacy/index.ts +16 -10
- package/src/legacy/signer.ts +5 -1
- package/src/legacy/utxoSigner.ts +92 -0
- package/src/namespaces/utxo.ts +152 -0
- package/src/provider.ts +2 -0
- package/src/utils.ts +19 -2
package/dist/legacy/index.d.ts
CHANGED
|
@@ -2,13 +2,13 @@ import type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';
|
|
|
2
2
|
import type { Subscribe, WalletInfo } from '@rango-dev/wallets-shared';
|
|
3
3
|
import type { BlockchainMeta, SignerFactory } from 'rango-types';
|
|
4
4
|
import { WalletTypes } from '@rango-dev/wallets-shared';
|
|
5
|
-
import { phantom as phantom_instance } from '../utils.js';
|
|
5
|
+
import { phantom as phantom_instance, type Provider } from '../utils.js';
|
|
6
6
|
export declare const config: {
|
|
7
7
|
type: WalletTypes;
|
|
8
8
|
};
|
|
9
9
|
export declare const getInstance: typeof phantom_instance;
|
|
10
10
|
export declare const subscribe: Subscribe;
|
|
11
|
-
export declare const getSigners: (provider:
|
|
11
|
+
export declare const getSigners: (provider: Provider) => Promise<SignerFactory>;
|
|
12
12
|
export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
|
|
13
13
|
declare const buildLegacyProvider: () => LegacyProviderInterface;
|
|
14
14
|
export { buildLegacyProvider };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/legacy/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAIV,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,cAAc,EAEd,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EAGL,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/legacy/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAIV,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,cAAc,EAEd,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EAGL,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMzE,eAAO,MAAM,MAAM;;CAElB,CAAC;AAEF,eAAO,MAAM,WAAW,yBAAmB,CAAC;AAiB5C,eAAO,MAAM,SAAS,EAAE,SAevB,CAAC;AAMF,eAAO,MAAM,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,aAAa,CAC9D,CAAC;AAWT,eAAO,MAAM,aAAa,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,UAiDjE,CAAC;AAEF,QAAA,MAAM,mBAAmB,EAAE,MAAM,uBAS/B,CAAC;AAEH,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/legacy/signer.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Provider } from '../utils.js';
|
|
1
2
|
import type { SignerFactory } from 'rango-types';
|
|
2
|
-
export default function getSigners(provider:
|
|
3
|
+
export default function getSigners(provider: Provider): Promise<SignerFactory>;
|
|
3
4
|
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/legacy/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD,wBAA8B,UAAU,CACtC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/legacy/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD,wBAA8B,UAAU,CACtC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAaxB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GenericSigner, Transfer } from 'rango-types';
|
|
2
|
+
type TransferExternalProvider = any;
|
|
3
|
+
export declare class BTCSigner implements GenericSigner<Transfer> {
|
|
4
|
+
private provider;
|
|
5
|
+
constructor(provider: TransferExternalProvider);
|
|
6
|
+
signMessage(): Promise<string>;
|
|
7
|
+
signAndSendTx(tx: Transfer): Promise<{
|
|
8
|
+
hash: string;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=utxoSigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxoSigner.d.ts","sourceRoot":"","sources":["../../src/legacy/utxoSigner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ3D,KAAK,wBAAwB,GAAG,GAAG,CAAC;AAiBpC,qBAAa,SAAU,YAAW,aAAa,CAAC,QAAQ,CAAC;IACvD,OAAO,CAAC,QAAQ,CAA2B;gBAC/B,QAAQ,EAAE,wBAAwB;IAIxC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAwD7D"}
|
package/dist/mod.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var T=Object.defineProperty;var r=(t,o)=>T(t,"name",{value:o,configurable:!0});var F=(t,o)=>()=>(t&&(o=t(t=0)),o);var V=(t,o)=>{for(var n in o)T(t,n,{get:o[n],enumerable:!0})};var I={};V(I,{BTCSigner:()=>P});import*as $ from"@bitcoinerlab/secp256k1";import{Networks as G}from"@rango-dev/wallets-shared";import*as d from"bitcoinjs-lib";import{SignerError as X}from"rango-types";function z(t){let o=atob(t),n=o.length,e=new Uint8Array(n);for(let a=0;a<n;a++)e[a]=o.charCodeAt(a);return e}var q,P,x=F(()=>{"use strict";q="https://go.getblock.io/f37bad28a991436483c0a3679a3acbee";r(z,"base64ToUint8Array");P=class{static{r(this,"BTCSigner")}provider;constructor(o){this.provider=o}async signMessage(){throw X.UnimplementedError("signMessage")}async signAndSendTx(o){let{asset:n,psbt:e}=o;if(!e)throw new Error("No PSBT found to sign. Ensure a valid PSBT is provided.");if(n.blockchain!==G.BTC)throw new Error(`Signing ${n.blockchain} transaction is not implemented by the signer.`);d.initEccLib($);let a=await this.provider.signPSBT(z(e.unsignedPsbtBase64),{inputsToSign:e.inputsToSign}),c=d.Psbt.fromBuffer(Buffer.from(a));c.finalizeAllInputs();let i=c.extractTransaction().toHex(),s=await fetch(q,{method:"POST",body:JSON.stringify({method:"sendrawtransaction",params:[i]})});if(!s.ok){let W=await s.text();throw new Error(`Error broadcasting transaction: ${W}`)}let m=await s.json();if(!m.result)throw new Error(`Error broadcasting transaction. Error Code ${m.error.code}: ${m.error.message}`);return{hash:m.result}}}});import{defineVersions as Ho}from"@rango-dev/wallets-core/utils";import{LegacyNetworks as f}from"@rango-dev/wallets-core/legacy";import{chooseInstance as Y,getSolanaAccounts as K,WalletTypes as Q}from"@rango-dev/wallets-shared";import{isEvmBlockchain as Z,solanaBlockchain as oo}from"rango-types";import"@rango-dev/wallets-core";import{LegacyNetworks as g}from"@rango-dev/wallets-core/legacy";var h=[g.ETHEREUM,g.POLYGON,g.BASE],p="phantom",C={name:"Phantom",icon:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg",extensions:{chrome:"https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa",homepage:"https://phantom.app/"},properties:[{name:"detached",value:["Solana","EVM","UTXO"]}]};import{LegacyNetworks as u}from"@rango-dev/wallets-core/legacy";function l(){let{phantom:t}=window;if(!t)return null;let{solana:o,ethereum:n,bitcoin:e}=t,a=new Map;return n&&n.isPhantom&&a.set(u.ETHEREUM,n),o&&o.isPhantom&&a.set(u.SOLANA,o),e&&e.isPhantom&&a.set(u.BTC,e),a}r(l,"phantom");function A(){let o=l()?.get(u.ETHEREUM);if(!o)throw new Error("Phantom not injected or EVM not enabled. Please check your wallet.");return o}r(A,"evmPhantom");function b(){let o=l()?.get(u.SOLANA);if(!o)throw new Error("Phantom not injected or Solana not enabled. Please check your wallet.");return o}r(b,"solanaPhantom");function w(){let o=l()?.get(u.BTC);if(!o)throw new Error("Phantom not injected or Bitcoin not enabled. Please check your wallet.");return o}r(w,"bitcoinPhantom");import{LegacyNetworks as y}from"@rango-dev/wallets-core/legacy";import{getNetworkInstance as v}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as J,TransactionType as S}from"rango-types";async function E(t){let o=v(t,y.SOLANA),n=v(t,y.ETHEREUM),e=v(t,y.BTC),{DefaultEvmSigner:a}=await import("@rango-dev/signer-evm"),{DefaultSolanaSigner:c}=await import("@rango-dev/signer-solana"),{BTCSigner:i}=await Promise.resolve().then(()=>(x(),I)),s=new J;return s.registerSigner(S.SOLANA,new c(o)),s.registerSigner(S.EVM,new a(n)),s.registerSigner(S.TRANSFER,new i(e)),s}r(E,"getSigners");var to=Q.PHANTOM,no={type:to},eo=l,ro=r(async({instance:t,meta:o})=>{let n=t.get(f.SOLANA);return await K({instance:n,meta:o})},"connect"),ao=r(({instance:t,updateAccounts:o,connect:n})=>{let e=r(async a=>{let c=f.SOLANA;if(a){let i=a.toString();o([i])}else n(c)},"handleAccountsChanged");return t?.on?.("accountChanged",e),()=>{t?.off?.("accountChanged",e)}},"subscribe"),co=r(({network:t})=>h.includes(t),"canSwitchNetworkTo"),so=E,io=r(async({instance:t,meta:o})=>{let n=Y(t,o,f.SOLANA);try{return!!await n.connect({onlyIfTrusted:!0})}catch{return!1}},"canEagerConnect"),mo=r(t=>{let o=[],n=oo(t),e=t.filter(c=>Z(c)&&h.includes(c.name)),a=t.find(c=>c.name===f.BTC);return o=o.concat(n).concat(e),a&&o.push(a),{name:"Phantom",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg",installLink:{CHROME:"https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa",DEFAULT:"https://phantom.app/"},color:"#4d40c6",needsNamespace:{selection:"multiple",data:[{label:"EVM",value:"EVM",id:"ETH"},{label:"Solana",value:"Solana",id:"SOLANA"},{label:"BTC",value:"UTXO",id:"BTC"}]},supportedChains:o}},"getWalletInfo"),B=r(()=>({config:no,getInstance:eo,connect:ro,subscribe:ao,canSwitchNetworkTo:co,getSigners:so,getWalletInfo:mo,canEagerConnect:io}),"buildLegacyProvider");import{ProviderBuilder as Do}from"@rango-dev/wallets-core";import{NamespaceBuilder as po}from"@rango-dev/wallets-core";import{builders as lo}from"@rango-dev/wallets-core/namespaces/common";import{actions as N,builders as uo}from"@rango-dev/wallets-core/namespaces/evm";var[fo,k]=N.changeAccountSubscriber(A),go=uo.connect().action(N.connect(A)).before(fo).or(k).build(),ho=lo.disconnect().after(k).build(),L=new po("EVM",p).action(go).action(ho).build();import{NamespaceBuilder as Ao}from"@rango-dev/wallets-core";import{builders as bo}from"@rango-dev/wallets-core/namespaces/common";import{actions as wo,builders as Po,CAIP_NAMESPACE as yo,CAIP_SOLANA_CHAIN_ID as vo}from"@rango-dev/wallets-core/namespaces/solana";import{CAIP as So}from"@rango-dev/wallets-core/utils";import{getSolanaAccounts as Eo}from"@rango-dev/wallets-shared";var[To,M]=wo.changeAccountSubscriber(b),Co=Po.connect().action(async function(){let t=b(),o=await Eo({instance:t,meta:[]});if(Array.isArray(o))throw new Error("Expecting solana response to be a single value, not an array.");return o.accounts.map(e=>So.AccountId.format({address:e,chainId:{namespace:yo,reference:vo}}))}).before(To).or(M).build(),Io=bo.disconnect().after(M).build(),O=new Ao("Solana",p).action(Co).action(Io).build();import{NamespaceBuilder as xo}from"@rango-dev/wallets-core";import{builders as Bo}from"@rango-dev/wallets-core/namespaces/common";import{builders as No,CAIP_BITCOIN_CHAIN_ID as U,CAIP_NAMESPACE as _}from"@rango-dev/wallets-core/namespaces/utxo";import{CAIP as D}from"@rango-dev/wallets-core/utils";import{Networks as ko}from"@rango-dev/wallets-shared";var Lo=r(async()=>({accounts:(await w().requestAccounts()).filter(n=>n.purpose==="payment").map(n=>n.address),chainId:ko.BTC}),"getBitcoinAccounts");function Mo(t){let o;return[(n,e)=>{let a=t();if(!a)throw new Error("Trying to subscribe to your Solana wallet, but seems its instance is not available.");let[,c]=n.state();if(o=r(i=>{if(!i.length){n.action("disconnect");return}let s=i.filter(m=>m.purpose==="payment").map(m=>D.AccountId.format({address:m.address,chainId:{namespace:_,reference:U}}));c("accounts",s)},"eventCallback"),a.on("accountsChanged",o),e instanceof Error)throw e},(n,e)=>{let a=t();if(o&&a&&a.off("accountsChanged",o),e instanceof Error)throw e}]}r(Mo,"getChangeAccountSubscriber");var[Oo,H]=Mo(w),Uo=No.connect().action(async function(){let t=await Lo();if(Array.isArray(t))throw new Error("Expecting bitcoin response to be a single value, not an array.");return t.accounts.map(n=>D.AccountId.format({address:n,chainId:{namespace:_,reference:U}}))}).before(Oo).or(H).build(),_o=Bo.disconnect().after(H).build(),R=new xo("UTXO",p).action(Uo).action(_o).build();var j=r(()=>new Do(p).init(function(t){let[,o]=t.state();l()&&(o("installed",!0),console.debug("[phantom] instance detected.",t))}).config("info",C).add("solana",O).add("evm",L).add("utxo",R).build(),"buildProvider");var Ft=r(()=>Ho().version("0.0.0",B()).version("1.0.0",j()).build(),"versions");export{Ft as versions};
|
|
2
2
|
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/mod.ts", "../src/legacy/index.ts", "../src/constants.ts", "../src/utils.ts", "../src/legacy/signer.ts", "../src/provider.ts", "../src/namespaces/evm.ts", "../src/namespaces/solana.ts"],
|
|
4
|
-
"sourcesContent": ["import { defineVersions } from '@rango-dev/wallets-core/utils';\n\nimport { buildLegacyProvider } from './legacy/index.js';\nimport { buildProvider } from './provider.js';\n\nconst versions = () =>\n defineVersions()\n .version('0.0.0', buildLegacyProvider())\n .version('1.0.0', buildProvider())\n .build();\n\nexport { versions };\n", "import type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';\nimport type {\n CanEagerConnect,\n CanSwitchNetwork,\n Connect,\n Subscribe,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n EvmBlockchainMeta,\n SignerFactory,\n} from 'rango-types';\n\nimport { LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';\nimport {\n chooseInstance,\n getSolanaAccounts,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain, solanaBlockchain } from 'rango-types';\n\nimport { EVM_SUPPORTED_CHAINS } from '../constants.js';\nimport { phantom as phantom_instance } from '../utils.js';\n\nimport signer from './signer.js';\n\nconst WALLET = WalletTypes.PHANTOM;\n\nexport const config = {\n type: WALLET,\n};\n\nexport const getInstance = phantom_instance;\n\n/*\n * NOTE: Phantom's Hub version has support for EVM as well since we are deprecating the legacy,\n * we just want to keep the implementation for some time and then legacy provider will be removed soon.\n * So we don't add new namespaces (like EVM) to legacy.\n */\nconst connect: Connect = async ({ instance, meta }) => {\n const solanaInstance = instance.get(Networks.SOLANA);\n const result = await getSolanaAccounts({\n instance: solanaInstance,\n meta,\n });\n\n return result;\n};\n\nexport const subscribe: Subscribe = ({ instance, updateAccounts, connect }) => {\n const handleAccountsChanged = async (publicKey: string) => {\n const network = Networks.SOLANA;\n if (publicKey) {\n const account = publicKey.toString();\n updateAccounts([account]);\n } else {\n connect(network);\n }\n };\n instance?.on?.('accountChanged', handleAccountsChanged);\n\n return () => {\n instance?.off?.('accountChanged', handleAccountsChanged);\n };\n};\n\nconst canSwitchNetworkTo: CanSwitchNetwork = ({ network }) => {\n return EVM_SUPPORTED_CHAINS.includes(network as Networks);\n};\n\nexport const getSigners: (provider: any) => Promise<SignerFactory> = signer;\n\nconst canEagerConnect: CanEagerConnect = async ({ instance, meta }) => {\n const solanaInstance = chooseInstance(instance, meta, Networks.SOLANA);\n try {\n const result = await solanaInstance.connect({ onlyIfTrusted: true });\n return !!result;\n } catch (error) {\n return false;\n }\n};\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n const solana = solanaBlockchain(allBlockChains);\n const evms = allBlockChains.filter(\n (chain): chain is EvmBlockchainMeta =>\n isEvmBlockchain(chain) &&\n EVM_SUPPORTED_CHAINS.includes(chain.name as Networks)\n );\n\n return {\n name: 'Phantom',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg',\n installLink: {\n CHROME:\n 'https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n\n DEFAULT: 'https://phantom.app/',\n },\n color: '#4d40c6',\n // if you are adding a new namespace, don't forget to also update `properties`\n supportedChains: [\n ...solana,\n ...evms.filter((chain) =>\n EVM_SUPPORTED_CHAINS.includes(chain.name as Networks)\n ),\n ],\n\n needsNamespace: {\n selection: 'multiple',\n data: [\n {\n label: 'EVM',\n value: 'EVM',\n id: 'ETH',\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n },\n ],\n },\n };\n};\n\nconst buildLegacyProvider: () => LegacyProviderInterface = () => ({\n config,\n getInstance,\n connect,\n subscribe,\n canSwitchNetworkTo,\n getSigners,\n getWalletInfo,\n canEagerConnect,\n});\n\nexport { buildLegacyProvider };\n", "import { type ProviderInfo } from '@rango-dev/wallets-core';\nimport { LegacyNetworks } from '@rango-dev/wallets-core/legacy';\n\nexport const EVM_SUPPORTED_CHAINS = [\n LegacyNetworks.ETHEREUM,\n LegacyNetworks.POLYGON,\n LegacyNetworks.BASE,\n];\n\nexport const WALLET_ID = 'phantom';\n\nexport const info: ProviderInfo = {\n name: 'Phantom',\n icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg',\n extensions: {\n chrome:\n 'https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n homepage: 'https://phantom.app/',\n },\n properties: [\n {\n name: 'detached',\n // if you are adding a new namespace, don't forget to also update `getWalletInfo`\n value: ['Solana', 'EVM'],\n },\n ],\n};\n", "import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';\nimport type { ProviderAPI as SolanaProviderApi } from '@rango-dev/wallets-core/namespaces/solana';\n\nimport { LegacyNetworks } from '@rango-dev/wallets-core/legacy';\n\ntype Provider = Map<string, unknown>;\n\nexport function phantom(): Provider | null {\n const { phantom } = window;\n\n if (!phantom) {\n return null;\n }\n\n const { solana, ethereum } = phantom;\n\n const instances: Provider = new Map();\n\n if (ethereum && ethereum.isPhantom) {\n instances.set(LegacyNetworks.ETHEREUM, ethereum);\n }\n\n if (solana && solana.isPhantom) {\n instances.set(LegacyNetworks.SOLANA, solana);\n }\n\n return instances;\n}\n\nexport function evmPhantom(): EvmProviderApi {\n const instances = phantom();\n\n const evmInstance = instances?.get(LegacyNetworks.ETHEREUM);\n\n if (!evmInstance) {\n throw new Error(\n 'Phantom not injected or EVM not enabled. Please check your wallet.'\n );\n }\n\n return evmInstance as EvmProviderApi;\n}\n\nexport function solanaPhantom(): SolanaProviderApi {\n const instance = phantom();\n const solanaInstance = instance?.get(LegacyNetworks.SOLANA);\n\n if (!solanaInstance) {\n throw new Error(\n 'Phantom not injected or Solana not enabled. Please check your wallet.'\n );\n }\n\n return solanaInstance;\n}\n", "import type { SignerFactory } from 'rango-types';\n\nimport { LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';\nimport { getNetworkInstance } from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(\n provider: any\n): Promise<SignerFactory> {\n const solProvider = getNetworkInstance(provider, Networks.SOLANA);\n const evmProvider = getNetworkInstance(provider, Networks.ETHEREUM);\n\n const { DefaultEvmSigner } = await import('@rango-dev/signer-evm');\n const { DefaultSolanaSigner } = await import('@rango-dev/signer-solana');\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.SOLANA, new DefaultSolanaSigner(solProvider));\n signers.registerSigner(TxType.EVM, new DefaultEvmSigner(evmProvider));\n return signers;\n}\n", "import { ProviderBuilder } from '@rango-dev/wallets-core';\n\nimport { info, WALLET_ID } from './constants.js';\nimport { evm } from './namespaces/evm.js';\nimport { solana } from './namespaces/solana.js';\nimport { phantom as phantomInstance } from './utils.js';\n\nconst buildProvider = () =>\n new ProviderBuilder(WALLET_ID)\n .init(function (context) {\n const [, setState] = context.state();\n\n if (phantomInstance()) {\n setState('installed', true);\n console.debug('[phantom] instance detected.', context);\n }\n })\n .config('info', info)\n .add('solana', solana)\n .add('evm', evm)\n .build();\n\nexport { buildProvider };\n", "import type { EvmActions } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { NamespaceBuilder } from '@rango-dev/wallets-core';\nimport { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';\nimport { actions, builders } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { WALLET_ID } from '../constants.js';\nimport { evmPhantom } from '../utils.js';\n\nconst [changeAccountSubscriber, changeAccountCleanup] =\n actions.changeAccountSubscriber(evmPhantom);\n\n/*\n * TODO: If user imported a private key for EVM, it hasn't solana.\n * when trying to connect to solana for this user we go through `-32603` which is an internal error.\n * If phantom added an specific error code for this situation, we can consider handling the error here.\n * @see https://docs.phantom.app/solana/errors\n */\nconst connect = builders\n .connect()\n .action(actions.connect(evmPhantom))\n .before(changeAccountSubscriber)\n .or(changeAccountCleanup)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<EvmActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { evm };\n", "import type { CaipAccount } from '@rango-dev/wallets-core/namespaces/common';\nimport type { SolanaActions } from '@rango-dev/wallets-core/namespaces/solana';\n\nimport { NamespaceBuilder } from '@rango-dev/wallets-core';\nimport { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';\nimport {\n actions,\n builders,\n CAIP_NAMESPACE,\n CAIP_SOLANA_CHAIN_ID,\n} from '@rango-dev/wallets-core/namespaces/solana';\nimport { CAIP } from '@rango-dev/wallets-core/utils';\nimport { getSolanaAccounts } from '@rango-dev/wallets-shared';\n\nimport { WALLET_ID } from '../constants.js';\nimport { solanaPhantom } from '../utils.js';\n\nconst [changeAccountSubscriber, changeAccountCleanup] =\n actions.changeAccountSubscriber(solanaPhantom);\n\n/*\n * TODO: If user imported a private key for EVM, it hasn't solana.\n * when trying to connect to solana for this user we go through `-32603` which is an internal error.\n * If phantom added an specific error code for this situation, we can consider handling the error here.\n * @see https://docs.phantom.app/solana/errors\n */\nconst connect = builders\n .connect()\n .action(async function () {\n const solanaInstance = solanaPhantom();\n const result = await getSolanaAccounts({\n instance: solanaInstance,\n meta: [],\n });\n if (Array.isArray(result)) {\n throw new Error(\n 'Expecting solana response to be a single value, not an array.'\n );\n }\n\n const formatAccounts = result.accounts.map(\n (account) =>\n CAIP.AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_SOLANA_CHAIN_ID,\n },\n }) as CaipAccount\n );\n\n return formatAccounts;\n })\n .before(changeAccountSubscriber)\n .or(changeAccountCleanup)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<SolanaActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst solana = new NamespaceBuilder<SolanaActions>('Solana', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { solana };\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["defineVersions", "Networks", "chooseInstance", "getSolanaAccounts", "WalletTypes", "isEvmBlockchain", "solanaBlockchain", "LegacyNetworks", "EVM_SUPPORTED_CHAINS", "WALLET_ID", "info", "LegacyNetworks", "phantom", "solana", "ethereum", "instances", "LegacyNetworks", "__name", "evmPhantom", "evmInstance", "solanaPhantom", "solanaInstance", "Networks", "getNetworkInstance", "DefaultSignerFactory", "TxType", "getSigners", "provider", "solProvider", "getNetworkInstance", "Networks", "evmProvider", "DefaultEvmSigner", "DefaultSolanaSigner", "signers", "DefaultSignerFactory", "TxType", "__name", "WALLET", "WalletTypes", "config", "getInstance", "phantom", "connect", "__name", "instance", "meta", "solanaInstance", "Networks", "getSolanaAccounts", "subscribe", "updateAccounts", "handleAccountsChanged", "publicKey", "network", "account", "canSwitchNetworkTo", "EVM_SUPPORTED_CHAINS", "getSigners", "canEagerConnect", "chooseInstance", "getWalletInfo", "allBlockChains", "solana", "solanaBlockchain", "evms", "chain", "isEvmBlockchain", "buildLegacyProvider", "ProviderBuilder", "NamespaceBuilder", "commonBuilders", "actions", "builders", "changeAccountSubscriber", "changeAccountCleanup", "actions", "evmPhantom", "connect", "builders", "disconnect", "commonBuilders", "evm", "NamespaceBuilder", "WALLET_ID", "NamespaceBuilder", "commonBuilders", "actions", "builders", "CAIP_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "CAIP", "getSolanaAccounts", "changeAccountSubscriber", "changeAccountCleanup", "actions", "solanaPhantom", "connect", "builders", "solanaInstance", "result", "getSolanaAccounts", "account", "CAIP", "CAIP_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "disconnect", "commonBuilders", "solana", "NamespaceBuilder", "WALLET_ID", "buildProvider", "__name", "ProviderBuilder", "WALLET_ID", "context", "setState", "phantom", "info", "solana", "evm", "versions", "__name", "defineVersions", "buildLegacyProvider", "buildProvider"]
|
|
3
|
+
"sources": ["../src/legacy/utxoSigner.ts", "../src/mod.ts", "../src/legacy/index.ts", "../src/constants.ts", "../src/utils.ts", "../src/legacy/signer.ts", "../src/provider.ts", "../src/namespaces/evm.ts", "../src/namespaces/solana.ts", "../src/namespaces/utxo.ts"],
|
|
4
|
+
"sourcesContent": ["import type { GenericSigner, Transfer } from 'rango-types';\n\nimport * as secp256k1 from '@bitcoinerlab/secp256k1';\nimport { Networks } from '@rango-dev/wallets-shared';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport { SignerError } from 'rango-types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TransferExternalProvider = any;\n\nconst BTC_RPC_URL = 'https://go.getblock.io/f37bad28a991436483c0a3679a3acbee';\n\n// TODO: use Uint8Array.fromBase64() static method and use this function as a polyfill after updating TypeScript DOM lib\nfunction base64ToUint8Array(base64String: string) {\n const binaryString = atob(base64String);\n const length = binaryString.length;\n const uint8Array = new Uint8Array(length);\n\n for (let i = 0; i < length; i++) {\n uint8Array[i] = binaryString.charCodeAt(i);\n }\n\n return uint8Array;\n}\n\nexport class BTCSigner implements GenericSigner<Transfer> {\n private provider: TransferExternalProvider;\n constructor(provider: TransferExternalProvider) {\n this.provider = provider;\n }\n\n async signMessage(): Promise<string> {\n throw SignerError.UnimplementedError('signMessage');\n }\n\n async signAndSendTx(tx: Transfer): Promise<{ hash: string }> {\n const { asset, psbt } = tx;\n\n if (!psbt) {\n throw new Error(\n 'No PSBT found to sign. Ensure a valid PSBT is provided.'\n );\n }\n\n if (asset.blockchain !== Networks.BTC) {\n throw new Error(\n `Signing ${asset.blockchain} transaction is not implemented by the signer.`\n );\n }\n // Initialize ECC library\n bitcoin.initEccLib(secp256k1);\n\n const signedPSBTBytes = await this.provider.signPSBT(\n base64ToUint8Array(psbt.unsignedPsbtBase64),\n {\n inputsToSign: psbt.inputsToSign,\n }\n );\n\n // Finalize PSBT\n const finalPsbt = bitcoin.Psbt.fromBuffer(Buffer.from(signedPSBTBytes));\n finalPsbt.finalizeAllInputs();\n\n const finalPsbtBaseHex = finalPsbt.extractTransaction().toHex();\n\n // Broadcast PSBT to rpc node\n const response = await fetch(BTC_RPC_URL, {\n method: 'POST',\n body: JSON.stringify({\n method: 'sendrawtransaction',\n params: [finalPsbtBaseHex],\n }),\n });\n\n if (!response.ok) {\n // Handle network and fetch errors\n const errorText = await response.text();\n throw new Error(`Error broadcasting transaction: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (!data.result) {\n // Handle Bitcoin specific errors\n throw new Error(\n `Error broadcasting transaction. Error Code ${data.error.code}: ${data.error.message}`\n );\n }\n\n return { hash: data.result };\n }\n}\n", "import { defineVersions } from '@rango-dev/wallets-core/utils';\n\nimport { buildLegacyProvider } from './legacy/index.js';\nimport { buildProvider } from './provider.js';\n\nconst versions = () =>\n defineVersions()\n .version('0.0.0', buildLegacyProvider())\n .version('1.0.0', buildProvider())\n .build();\n\nexport { versions };\n", "import type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';\nimport type {\n CanEagerConnect,\n CanSwitchNetwork,\n Connect,\n Subscribe,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n EvmBlockchainMeta,\n SignerFactory,\n} from 'rango-types';\n\nimport { LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';\nimport {\n chooseInstance,\n getSolanaAccounts,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain, solanaBlockchain } from 'rango-types';\n\nimport { EVM_SUPPORTED_CHAINS } from '../constants.js';\nimport { phantom as phantom_instance, type Provider } from '../utils.js';\n\nimport signer from './signer.js';\n\nconst WALLET = WalletTypes.PHANTOM;\n\nexport const config = {\n type: WALLET,\n};\n\nexport const getInstance = phantom_instance;\n\n/*\n * NOTE: Phantom's Hub version has support for EVM as well since we are deprecating the legacy,\n * we just want to keep the implementation for some time and then legacy provider will be removed soon.\n * So we don't add new namespaces (like EVM) to legacy.\n */\nconst connect: Connect = async ({ instance, meta }) => {\n const solanaInstance = instance.get(Networks.SOLANA);\n const result = await getSolanaAccounts({\n instance: solanaInstance,\n meta,\n });\n\n return result;\n};\n\nexport const subscribe: Subscribe = ({ instance, updateAccounts, connect }) => {\n const handleAccountsChanged = async (publicKey: string) => {\n const network = Networks.SOLANA;\n if (publicKey) {\n const account = publicKey.toString();\n updateAccounts([account]);\n } else {\n connect(network);\n }\n };\n instance?.on?.('accountChanged', handleAccountsChanged);\n\n return () => {\n instance?.off?.('accountChanged', handleAccountsChanged);\n };\n};\n\nconst canSwitchNetworkTo: CanSwitchNetwork = ({ network }) => {\n return EVM_SUPPORTED_CHAINS.includes(network as Networks);\n};\n\nexport const getSigners: (provider: Provider) => Promise<SignerFactory> =\n signer;\n\nconst canEagerConnect: CanEagerConnect = async ({ instance, meta }) => {\n const solanaInstance = chooseInstance(instance, meta, Networks.SOLANA);\n try {\n const result = await solanaInstance.connect({ onlyIfTrusted: true });\n return !!result;\n } catch {\n return false;\n }\n};\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n let supportedChains: BlockchainMeta[] = [];\n const solana = solanaBlockchain(allBlockChains);\n const evms = allBlockChains.filter(\n (chain): chain is EvmBlockchainMeta =>\n isEvmBlockchain(chain) &&\n EVM_SUPPORTED_CHAINS.includes(chain.name as Networks)\n );\n const btc = allBlockChains.find((chain) => chain.name === Networks.BTC);\n supportedChains = supportedChains.concat(solana).concat(evms);\n if (btc) {\n supportedChains.push(btc);\n }\n\n return {\n name: 'Phantom',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg',\n installLink: {\n CHROME:\n 'https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n\n DEFAULT: 'https://phantom.app/',\n },\n color: '#4d40c6',\n // if you are adding a new namespace, don't forget to also update `properties`\n needsNamespace: {\n selection: 'multiple',\n data: [\n {\n label: 'EVM',\n value: 'EVM',\n id: 'ETH',\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n },\n {\n label: 'BTC',\n value: 'UTXO',\n id: 'BTC',\n },\n ],\n },\n supportedChains,\n };\n};\n\nconst buildLegacyProvider: () => LegacyProviderInterface = () => ({\n config,\n getInstance,\n connect,\n subscribe,\n canSwitchNetworkTo,\n getSigners,\n getWalletInfo,\n canEagerConnect,\n});\n\nexport { buildLegacyProvider };\n", "import { type ProviderInfo } from '@rango-dev/wallets-core';\nimport { LegacyNetworks } from '@rango-dev/wallets-core/legacy';\n\nexport const EVM_SUPPORTED_CHAINS = [\n LegacyNetworks.ETHEREUM,\n LegacyNetworks.POLYGON,\n LegacyNetworks.BASE,\n];\n\nexport const WALLET_ID = 'phantom';\n\nexport const info: ProviderInfo = {\n name: 'Phantom',\n icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/phantom/icon.svg',\n extensions: {\n chrome:\n 'https://chrome.google.com/webstore/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n homepage: 'https://phantom.app/',\n },\n properties: [\n {\n name: 'detached',\n // if you are adding a new namespace, don't forget to also update `getWalletInfo`\n value: ['Solana', 'EVM', 'UTXO'],\n },\n ],\n};\n", "import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';\nimport type { ProviderAPI as SolanaProviderApi } from '@rango-dev/wallets-core/namespaces/solana';\n\nimport { LegacyNetworks } from '@rango-dev/wallets-core/legacy';\n\nexport type Provider = Map<string, unknown>;\n\nexport function phantom(): Provider | null {\n const { phantom } = window;\n\n if (!phantom) {\n return null;\n }\n\n const { solana, ethereum, bitcoin } = phantom;\n\n const instances: Provider = new Map();\n\n if (ethereum && ethereum.isPhantom) {\n instances.set(LegacyNetworks.ETHEREUM, ethereum);\n }\n\n if (solana && solana.isPhantom) {\n instances.set(LegacyNetworks.SOLANA, solana);\n }\n\n if (bitcoin && bitcoin.isPhantom) {\n instances.set(LegacyNetworks.BTC, bitcoin);\n }\n\n return instances;\n}\n\nexport function evmPhantom(): EvmProviderApi {\n const instances = phantom();\n\n const evmInstance = instances?.get(LegacyNetworks.ETHEREUM);\n\n if (!evmInstance) {\n throw new Error(\n 'Phantom not injected or EVM not enabled. Please check your wallet.'\n );\n }\n\n return evmInstance as EvmProviderApi;\n}\n\nexport function solanaPhantom(): SolanaProviderApi {\n const instance = phantom();\n const solanaInstance = instance?.get(LegacyNetworks.SOLANA);\n\n if (!solanaInstance) {\n throw new Error(\n 'Phantom not injected or Solana not enabled. Please check your wallet.'\n );\n }\n\n return solanaInstance;\n}\n\nexport function bitcoinPhantom(): SolanaProviderApi {\n const instance = phantom();\n const bitcoinInstance = instance?.get(LegacyNetworks.BTC);\n\n if (!bitcoinInstance) {\n throw new Error(\n 'Phantom not injected or Bitcoin not enabled. Please check your wallet.'\n );\n }\n\n return bitcoinInstance;\n}\n", "import type { Provider } from '../utils.js';\nimport type { SignerFactory } from 'rango-types';\n\nimport { LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';\nimport { getNetworkInstance } from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(\n provider: Provider\n): Promise<SignerFactory> {\n const solProvider = getNetworkInstance(provider, Networks.SOLANA);\n const evmProvider = getNetworkInstance(provider, Networks.ETHEREUM);\n const bitcoinInstance = getNetworkInstance(provider, Networks.BTC);\n\n const { DefaultEvmSigner } = await import('@rango-dev/signer-evm');\n const { DefaultSolanaSigner } = await import('@rango-dev/signer-solana');\n const { BTCSigner } = await import('./utxoSigner.js');\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.SOLANA, new DefaultSolanaSigner(solProvider));\n signers.registerSigner(TxType.EVM, new DefaultEvmSigner(evmProvider));\n signers.registerSigner(TxType.TRANSFER, new BTCSigner(bitcoinInstance));\n return signers;\n}\n", "import { ProviderBuilder } from '@rango-dev/wallets-core';\n\nimport { info, WALLET_ID } from './constants.js';\nimport { evm } from './namespaces/evm.js';\nimport { solana } from './namespaces/solana.js';\nimport { utxo } from './namespaces/utxo.js';\nimport { phantom as phantomInstance } from './utils.js';\n\nconst buildProvider = () =>\n new ProviderBuilder(WALLET_ID)\n .init(function (context) {\n const [, setState] = context.state();\n\n if (phantomInstance()) {\n setState('installed', true);\n console.debug('[phantom] instance detected.', context);\n }\n })\n .config('info', info)\n .add('solana', solana)\n .add('evm', evm)\n .add('utxo', utxo)\n .build();\n\nexport { buildProvider };\n", "import type { EvmActions } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { NamespaceBuilder } from '@rango-dev/wallets-core';\nimport { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';\nimport { actions, builders } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { WALLET_ID } from '../constants.js';\nimport { evmPhantom } from '../utils.js';\n\nconst [changeAccountSubscriber, changeAccountCleanup] =\n actions.changeAccountSubscriber(evmPhantom);\n\n/*\n * TODO: If user imported a private key for EVM, it hasn't solana.\n * when trying to connect to solana for this user we go through `-32603` which is an internal error.\n * If phantom added an specific error code for this situation, we can consider handling the error here.\n * @see https://docs.phantom.app/solana/errors\n */\nconst connect = builders\n .connect()\n .action(actions.connect(evmPhantom))\n .before(changeAccountSubscriber)\n .or(changeAccountCleanup)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<EvmActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { evm };\n", "import type { CaipAccount } from '@rango-dev/wallets-core/namespaces/common';\nimport type { SolanaActions } from '@rango-dev/wallets-core/namespaces/solana';\n\nimport { NamespaceBuilder } from '@rango-dev/wallets-core';\nimport { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';\nimport {\n actions,\n builders,\n CAIP_NAMESPACE,\n CAIP_SOLANA_CHAIN_ID,\n} from '@rango-dev/wallets-core/namespaces/solana';\nimport { CAIP } from '@rango-dev/wallets-core/utils';\nimport { getSolanaAccounts } from '@rango-dev/wallets-shared';\n\nimport { WALLET_ID } from '../constants.js';\nimport { solanaPhantom } from '../utils.js';\n\nconst [changeAccountSubscriber, changeAccountCleanup] =\n actions.changeAccountSubscriber(solanaPhantom);\n\n/*\n * TODO: If user imported a private key for EVM, it hasn't solana.\n * when trying to connect to solana for this user we go through `-32603` which is an internal error.\n * If phantom added an specific error code for this situation, we can consider handling the error here.\n * @see https://docs.phantom.app/solana/errors\n */\nconst connect = builders\n .connect()\n .action(async function () {\n const solanaInstance = solanaPhantom();\n const result = await getSolanaAccounts({\n instance: solanaInstance,\n meta: [],\n });\n if (Array.isArray(result)) {\n throw new Error(\n 'Expecting solana response to be a single value, not an array.'\n );\n }\n\n const formatAccounts = result.accounts.map(\n (account) =>\n CAIP.AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_SOLANA_CHAIN_ID,\n },\n }) as CaipAccount\n );\n\n return formatAccounts;\n })\n .before(changeAccountSubscriber)\n .or(changeAccountCleanup)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<SolanaActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst solana = new NamespaceBuilder<SolanaActions>('Solana', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { solana };\n", "import type { CaipAccount } from '@rango-dev/wallets-core/namespaces/common';\nimport type {\n ProviderAPI,\n UtxoActions,\n} from '@rango-dev/wallets-core/namespaces/utxo';\n\nimport {\n NamespaceBuilder,\n type Subscriber,\n type SubscriberCleanUp,\n} from '@rango-dev/wallets-core';\nimport { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';\nimport {\n builders,\n CAIP_BITCOIN_CHAIN_ID,\n CAIP_NAMESPACE,\n} from '@rango-dev/wallets-core/namespaces/utxo';\nimport { CAIP } from '@rango-dev/wallets-core/utils';\nimport {\n Networks,\n type ProviderConnectResult,\n} from '@rango-dev/wallets-shared';\n\nimport { WALLET_ID } from '../constants.js';\nimport { bitcoinPhantom } from '../utils.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any;\n\ntype BtcAccount = {\n address: string;\n publicKey: string;\n addressType: 'p2tr' | 'p2wpkh' | 'p2sh' | 'p2pkh';\n purpose: 'payment' | 'ordinals';\n};\n\nconst getBitcoinAccounts: () => Promise<ProviderConnectResult> = async () => {\n const instance = bitcoinPhantom();\n const accounts = await instance.requestAccounts();\n\n return {\n accounts: accounts\n .filter((account: BtcAccount) => account.purpose === 'payment')\n .map((account: BtcAccount) => account.address),\n chainId: Networks.BTC,\n };\n};\n\nfunction getChangeAccountSubscriber(\n instance: () => ProviderAPI | undefined\n): [Subscriber<UtxoActions>, SubscriberCleanUp<UtxoActions>] {\n let eventCallback: AnyFunction;\n\n // subscriber can be passed to `or`, it will get the error and should rethrow error to pass the error to next `or` or throw error.\n return [\n (context, err) => {\n const bitcoinInstance = instance();\n\n if (!bitcoinInstance) {\n throw new Error(\n 'Trying to subscribe to your Solana wallet, but seems its instance is not available.'\n );\n }\n\n const [, setState] = context.state();\n\n eventCallback = (accounts: BtcAccount[]) => {\n /*\n * In Phantom, when user is switching to an account which is not connected to dApp yet, it returns an empty array on `accountsChanged`.\n * So empty array means we don't have access to account and we need to disconnect and let the user connect the account.\n */\n if (!accounts.length) {\n context.action('disconnect');\n return;\n }\n\n const formatAccounts = accounts\n .filter((account) => account.purpose === 'payment')\n .map(\n (account: BtcAccount) =>\n CAIP.AccountId.format({\n address: account.address,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_BITCOIN_CHAIN_ID,\n },\n }) as CaipAccount\n );\n\n setState('accounts', formatAccounts);\n };\n bitcoinInstance.on('accountsChanged', eventCallback);\n\n if (err instanceof Error) {\n throw err;\n }\n },\n (_context, err) => {\n const bitcoinInstance = instance();\n\n if (eventCallback && bitcoinInstance) {\n bitcoinInstance.off('accountsChanged', eventCallback);\n }\n\n if (err instanceof Error) {\n throw err;\n }\n },\n ];\n}\n\nconst [changeAccountSubscriber, changeAccountCleanup] =\n getChangeAccountSubscriber(bitcoinPhantom);\n\nconst connect = builders\n .connect()\n .action(async function () {\n const result = await getBitcoinAccounts();\n if (Array.isArray(result)) {\n throw new Error(\n 'Expecting bitcoin response to be a single value, not an array.'\n );\n }\n\n const formatAccounts = result.accounts.map(\n (account) =>\n CAIP.AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_BITCOIN_CHAIN_ID,\n },\n }) as CaipAccount\n );\n\n return formatAccounts;\n })\n .before(changeAccountSubscriber)\n .or(changeAccountCleanup)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<UtxoActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst utxo = new NamespaceBuilder<UtxoActions>('UTXO', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { utxo };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["utxoSigner_exports", "__export", "BTCSigner", "secp256k1", "Networks", "bitcoin", "SignerError", "base64ToUint8Array", "base64String", "binaryString", "length", "uint8Array", "i", "BTC_RPC_URL", "init_utxoSigner", "__esmMin", "__name", "provider", "tx", "asset", "psbt", "signedPSBTBytes", "finalPsbt", "finalPsbtBaseHex", "response", "errorText", "data", "defineVersions", "Networks", "chooseInstance", "getSolanaAccounts", "WalletTypes", "isEvmBlockchain", "solanaBlockchain", "LegacyNetworks", "EVM_SUPPORTED_CHAINS", "WALLET_ID", "info", "LegacyNetworks", "phantom", "solana", "ethereum", "bitcoin", "instances", "LegacyNetworks", "__name", "evmPhantom", "evmInstance", "solanaPhantom", "solanaInstance", "bitcoinPhantom", "bitcoinInstance", "Networks", "getNetworkInstance", "DefaultSignerFactory", "TxType", "getSigners", "provider", "solProvider", "getNetworkInstance", "Networks", "evmProvider", "bitcoinInstance", "DefaultEvmSigner", "DefaultSolanaSigner", "BTCSigner", "signers", "DefaultSignerFactory", "TxType", "__name", "WALLET", "WalletTypes", "config", "getInstance", "phantom", "connect", "__name", "instance", "meta", "solanaInstance", "Networks", "getSolanaAccounts", "subscribe", "updateAccounts", "handleAccountsChanged", "publicKey", "network", "account", "canSwitchNetworkTo", "EVM_SUPPORTED_CHAINS", "getSigners", "canEagerConnect", "chooseInstance", "getWalletInfo", "allBlockChains", "supportedChains", "solana", "solanaBlockchain", "evms", "chain", "isEvmBlockchain", "btc", "buildLegacyProvider", "ProviderBuilder", "NamespaceBuilder", "commonBuilders", "actions", "builders", "changeAccountSubscriber", "changeAccountCleanup", "actions", "evmPhantom", "connect", "builders", "disconnect", "commonBuilders", "evm", "NamespaceBuilder", "WALLET_ID", "NamespaceBuilder", "commonBuilders", "actions", "builders", "CAIP_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "CAIP", "getSolanaAccounts", "changeAccountSubscriber", "changeAccountCleanup", "actions", "solanaPhantom", "connect", "builders", "solanaInstance", "result", "getSolanaAccounts", "account", "CAIP", "CAIP_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "disconnect", "commonBuilders", "solana", "NamespaceBuilder", "WALLET_ID", "NamespaceBuilder", "commonBuilders", "builders", "CAIP_BITCOIN_CHAIN_ID", "CAIP_NAMESPACE", "CAIP", "Networks", "getBitcoinAccounts", "__name", "bitcoinPhantom", "account", "Networks", "getChangeAccountSubscriber", "instance", "eventCallback", "context", "err", "bitcoinInstance", "setState", "accounts", "formatAccounts", "CAIP", "CAIP_NAMESPACE", "CAIP_BITCOIN_CHAIN_ID", "_context", "changeAccountSubscriber", "changeAccountCleanup", "connect", "builders", "result", "disconnect", "commonBuilders", "utxo", "NamespaceBuilder", "WALLET_ID", "buildProvider", "__name", "ProviderBuilder", "WALLET_ID", "context", "setState", "phantom", "info", "solana", "evm", "utxo", "versions", "__name", "defineVersions", "buildLegacyProvider", "buildProvider"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxo.d.ts","sourceRoot":"","sources":["../../src/namespaces/utxo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,WAAW,EACZ,MAAM,yCAAyC,CAAC;AA8IjD,QAAA,MAAM,IAAI,iEAGA,CAAC;AAEX,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/constants.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/constants.ts":{"bytes":786,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true}],"format":"esm"},"src/utils.ts":{"bytes":1756,"imports":[{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/legacy/utxoSigner.ts":{"bytes":2672,"imports":[{"path":"@bitcoinerlab/secp256k1","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"bitcoinjs-lib","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/legacy/signer.ts":{"bytes":1115,"imports":[{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/signer-evm","kind":"dynamic-import","external":true},{"path":"@rango-dev/signer-solana","kind":"dynamic-import","external":true},{"path":"src/legacy/utxoSigner.ts","kind":"dynamic-import","original":"./utxoSigner.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/legacy/index.ts":{"bytes":3892,"imports":[{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"},{"path":"src/legacy/signer.ts","kind":"import-statement","original":"./signer.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/namespaces/evm.ts":{"bytes":1210,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/evm","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"}],"format":"esm"},"src/namespaces/solana.ts":{"bytes":2073,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/solana","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"}],"format":"esm"},"src/namespaces/utxo.ts":{"bytes":4258,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/utxo","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/provider.ts":{"bytes":727,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"./constants.js"},{"path":"src/namespaces/evm.ts","kind":"import-statement","original":"./namespaces/evm.js"},{"path":"src/namespaces/solana.ts","kind":"import-statement","original":"./namespaces/solana.js"},{"path":"src/namespaces/utxo.ts","kind":"import-statement","original":"./namespaces/utxo.js"},{"path":"src/utils.ts","kind":"import-statement","original":"./utils.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/mod.ts":{"bytes":332,"imports":[{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"src/legacy/index.ts","kind":"import-statement","original":"./legacy/index.js"},{"path":"src/provider.ts","kind":"import-statement","original":"./provider.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/mod.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":30275},"dist/mod.js":{"imports":[{"path":"@bitcoinerlab/secp256k1","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"bitcoinjs-lib","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/signer-evm","kind":"dynamic-import","external":true},{"path":"@rango-dev/signer-solana","kind":"dynamic-import","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/evm","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/solana","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/utxo","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true}],"exports":["versions"],"entryPoint":"src/mod.ts","inputs":{"src/legacy/utxoSigner.ts":{"bytesInOutput":1343},"src/mod.ts":{"bytesInOutput":144},"src/legacy/index.ts":{"bytesInOutput":1558},"src/constants.ts":{"bytesInOutput":454},"src/utils.ts":{"bytesInOutput":773},"src/legacy/signer.ts":{"bytesInOutput":592},"src/provider.ts":{"bytesInOutput":276},"src/namespaces/evm.ts":{"bytesInOutput":395},"src/namespaces/solana.ts":{"bytesInOutput":812},"src/namespaces/utxo.ts":{"bytesInOutput":1437}},"bytes":8016}}}
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,aAAa,kDAcP,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';
|
|
2
2
|
import type { ProviderAPI as SolanaProviderApi } from '@rango-dev/wallets-core/namespaces/solana';
|
|
3
|
-
type Provider = Map<string, unknown>;
|
|
3
|
+
export type Provider = Map<string, unknown>;
|
|
4
4
|
export declare function phantom(): Provider | null;
|
|
5
5
|
export declare function evmPhantom(): EvmProviderApi;
|
|
6
6
|
export declare function solanaPhantom(): SolanaProviderApi;
|
|
7
|
-
export
|
|
7
|
+
export declare function bitcoinPhantom(): SolanaProviderApi;
|
|
8
8
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAC5F,OAAO,KAAK,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAIlG,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAC5F,OAAO,KAAK,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAIlG,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,wBAAgB,OAAO,IAAI,QAAQ,GAAG,IAAI,CAwBzC;AAED,wBAAgB,UAAU,IAAI,cAAc,CAY3C;AAED,wBAAgB,aAAa,IAAI,iBAAiB,CAWjD;AAED,wBAAgB,cAAc,IAAI,iBAAiB,CAWlD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rango-dev/provider-phantom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"source": "./src/mod.ts",
|
|
@@ -21,8 +21,10 @@
|
|
|
21
21
|
"lint": "eslint \"**/*.{ts,tsx}\""
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@
|
|
25
|
-
"@rango-dev/
|
|
24
|
+
"@bitcoinerlab/secp256k1": "^1.2.0",
|
|
25
|
+
"@rango-dev/signer-solana": "^0.38.0",
|
|
26
|
+
"@rango-dev/wallets-shared": "^0.43.0",
|
|
27
|
+
"bitcoinjs-lib": "^6.1.7",
|
|
26
28
|
"rango-types": "^0.1.81"
|
|
27
29
|
},
|
|
28
30
|
"publishConfig": {
|
package/src/constants.ts
CHANGED
package/src/legacy/index.ts
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import { isEvmBlockchain, solanaBlockchain } from 'rango-types';
|
|
22
22
|
|
|
23
23
|
import { EVM_SUPPORTED_CHAINS } from '../constants.js';
|
|
24
|
-
import { phantom as phantom_instance } from '../utils.js';
|
|
24
|
+
import { phantom as phantom_instance, type Provider } from '../utils.js';
|
|
25
25
|
|
|
26
26
|
import signer from './signer.js';
|
|
27
27
|
|
|
@@ -69,26 +69,33 @@ const canSwitchNetworkTo: CanSwitchNetwork = ({ network }) => {
|
|
|
69
69
|
return EVM_SUPPORTED_CHAINS.includes(network as Networks);
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
-
export const getSigners: (provider:
|
|
72
|
+
export const getSigners: (provider: Provider) => Promise<SignerFactory> =
|
|
73
|
+
signer;
|
|
73
74
|
|
|
74
75
|
const canEagerConnect: CanEagerConnect = async ({ instance, meta }) => {
|
|
75
76
|
const solanaInstance = chooseInstance(instance, meta, Networks.SOLANA);
|
|
76
77
|
try {
|
|
77
78
|
const result = await solanaInstance.connect({ onlyIfTrusted: true });
|
|
78
79
|
return !!result;
|
|
79
|
-
} catch
|
|
80
|
+
} catch {
|
|
80
81
|
return false;
|
|
81
82
|
}
|
|
82
83
|
};
|
|
83
84
|
export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
84
85
|
allBlockChains
|
|
85
86
|
) => {
|
|
87
|
+
let supportedChains: BlockchainMeta[] = [];
|
|
86
88
|
const solana = solanaBlockchain(allBlockChains);
|
|
87
89
|
const evms = allBlockChains.filter(
|
|
88
90
|
(chain): chain is EvmBlockchainMeta =>
|
|
89
91
|
isEvmBlockchain(chain) &&
|
|
90
92
|
EVM_SUPPORTED_CHAINS.includes(chain.name as Networks)
|
|
91
93
|
);
|
|
94
|
+
const btc = allBlockChains.find((chain) => chain.name === Networks.BTC);
|
|
95
|
+
supportedChains = supportedChains.concat(solana).concat(evms);
|
|
96
|
+
if (btc) {
|
|
97
|
+
supportedChains.push(btc);
|
|
98
|
+
}
|
|
92
99
|
|
|
93
100
|
return {
|
|
94
101
|
name: 'Phantom',
|
|
@@ -101,13 +108,6 @@ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
|
101
108
|
},
|
|
102
109
|
color: '#4d40c6',
|
|
103
110
|
// if you are adding a new namespace, don't forget to also update `properties`
|
|
104
|
-
supportedChains: [
|
|
105
|
-
...solana,
|
|
106
|
-
...evms.filter((chain) =>
|
|
107
|
-
EVM_SUPPORTED_CHAINS.includes(chain.name as Networks)
|
|
108
|
-
),
|
|
109
|
-
],
|
|
110
|
-
|
|
111
111
|
needsNamespace: {
|
|
112
112
|
selection: 'multiple',
|
|
113
113
|
data: [
|
|
@@ -121,8 +121,14 @@ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
|
121
121
|
value: 'Solana',
|
|
122
122
|
id: 'SOLANA',
|
|
123
123
|
},
|
|
124
|
+
{
|
|
125
|
+
label: 'BTC',
|
|
126
|
+
value: 'UTXO',
|
|
127
|
+
id: 'BTC',
|
|
128
|
+
},
|
|
124
129
|
],
|
|
125
130
|
},
|
|
131
|
+
supportedChains,
|
|
126
132
|
};
|
|
127
133
|
};
|
|
128
134
|
|
package/src/legacy/signer.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Provider } from '../utils.js';
|
|
1
2
|
import type { SignerFactory } from 'rango-types';
|
|
2
3
|
|
|
3
4
|
import { LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';
|
|
@@ -5,15 +6,18 @@ import { getNetworkInstance } from '@rango-dev/wallets-shared';
|
|
|
5
6
|
import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';
|
|
6
7
|
|
|
7
8
|
export default async function getSigners(
|
|
8
|
-
provider:
|
|
9
|
+
provider: Provider
|
|
9
10
|
): Promise<SignerFactory> {
|
|
10
11
|
const solProvider = getNetworkInstance(provider, Networks.SOLANA);
|
|
11
12
|
const evmProvider = getNetworkInstance(provider, Networks.ETHEREUM);
|
|
13
|
+
const bitcoinInstance = getNetworkInstance(provider, Networks.BTC);
|
|
12
14
|
|
|
13
15
|
const { DefaultEvmSigner } = await import('@rango-dev/signer-evm');
|
|
14
16
|
const { DefaultSolanaSigner } = await import('@rango-dev/signer-solana');
|
|
17
|
+
const { BTCSigner } = await import('./utxoSigner.js');
|
|
15
18
|
const signers = new DefaultSignerFactory();
|
|
16
19
|
signers.registerSigner(TxType.SOLANA, new DefaultSolanaSigner(solProvider));
|
|
17
20
|
signers.registerSigner(TxType.EVM, new DefaultEvmSigner(evmProvider));
|
|
21
|
+
signers.registerSigner(TxType.TRANSFER, new BTCSigner(bitcoinInstance));
|
|
18
22
|
return signers;
|
|
19
23
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { GenericSigner, Transfer } from 'rango-types';
|
|
2
|
+
|
|
3
|
+
import * as secp256k1 from '@bitcoinerlab/secp256k1';
|
|
4
|
+
import { Networks } from '@rango-dev/wallets-shared';
|
|
5
|
+
import * as bitcoin from 'bitcoinjs-lib';
|
|
6
|
+
import { SignerError } from 'rango-types';
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
type TransferExternalProvider = any;
|
|
10
|
+
|
|
11
|
+
const BTC_RPC_URL = 'https://go.getblock.io/f37bad28a991436483c0a3679a3acbee';
|
|
12
|
+
|
|
13
|
+
// TODO: use Uint8Array.fromBase64() static method and use this function as a polyfill after updating TypeScript DOM lib
|
|
14
|
+
function base64ToUint8Array(base64String: string) {
|
|
15
|
+
const binaryString = atob(base64String);
|
|
16
|
+
const length = binaryString.length;
|
|
17
|
+
const uint8Array = new Uint8Array(length);
|
|
18
|
+
|
|
19
|
+
for (let i = 0; i < length; i++) {
|
|
20
|
+
uint8Array[i] = binaryString.charCodeAt(i);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return uint8Array;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class BTCSigner implements GenericSigner<Transfer> {
|
|
27
|
+
private provider: TransferExternalProvider;
|
|
28
|
+
constructor(provider: TransferExternalProvider) {
|
|
29
|
+
this.provider = provider;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async signMessage(): Promise<string> {
|
|
33
|
+
throw SignerError.UnimplementedError('signMessage');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async signAndSendTx(tx: Transfer): Promise<{ hash: string }> {
|
|
37
|
+
const { asset, psbt } = tx;
|
|
38
|
+
|
|
39
|
+
if (!psbt) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
'No PSBT found to sign. Ensure a valid PSBT is provided.'
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (asset.blockchain !== Networks.BTC) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Signing ${asset.blockchain} transaction is not implemented by the signer.`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
// Initialize ECC library
|
|
51
|
+
bitcoin.initEccLib(secp256k1);
|
|
52
|
+
|
|
53
|
+
const signedPSBTBytes = await this.provider.signPSBT(
|
|
54
|
+
base64ToUint8Array(psbt.unsignedPsbtBase64),
|
|
55
|
+
{
|
|
56
|
+
inputsToSign: psbt.inputsToSign,
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Finalize PSBT
|
|
61
|
+
const finalPsbt = bitcoin.Psbt.fromBuffer(Buffer.from(signedPSBTBytes));
|
|
62
|
+
finalPsbt.finalizeAllInputs();
|
|
63
|
+
|
|
64
|
+
const finalPsbtBaseHex = finalPsbt.extractTransaction().toHex();
|
|
65
|
+
|
|
66
|
+
// Broadcast PSBT to rpc node
|
|
67
|
+
const response = await fetch(BTC_RPC_URL, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: JSON.stringify({
|
|
70
|
+
method: 'sendrawtransaction',
|
|
71
|
+
params: [finalPsbtBaseHex],
|
|
72
|
+
}),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
// Handle network and fetch errors
|
|
77
|
+
const errorText = await response.text();
|
|
78
|
+
throw new Error(`Error broadcasting transaction: ${errorText}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const data = await response.json();
|
|
82
|
+
|
|
83
|
+
if (!data.result) {
|
|
84
|
+
// Handle Bitcoin specific errors
|
|
85
|
+
throw new Error(
|
|
86
|
+
`Error broadcasting transaction. Error Code ${data.error.code}: ${data.error.message}`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return { hash: data.result };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { CaipAccount } from '@rango-dev/wallets-core/namespaces/common';
|
|
2
|
+
import type {
|
|
3
|
+
ProviderAPI,
|
|
4
|
+
UtxoActions,
|
|
5
|
+
} from '@rango-dev/wallets-core/namespaces/utxo';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
NamespaceBuilder,
|
|
9
|
+
type Subscriber,
|
|
10
|
+
type SubscriberCleanUp,
|
|
11
|
+
} from '@rango-dev/wallets-core';
|
|
12
|
+
import { builders as commonBuilders } from '@rango-dev/wallets-core/namespaces/common';
|
|
13
|
+
import {
|
|
14
|
+
builders,
|
|
15
|
+
CAIP_BITCOIN_CHAIN_ID,
|
|
16
|
+
CAIP_NAMESPACE,
|
|
17
|
+
} from '@rango-dev/wallets-core/namespaces/utxo';
|
|
18
|
+
import { CAIP } from '@rango-dev/wallets-core/utils';
|
|
19
|
+
import {
|
|
20
|
+
Networks,
|
|
21
|
+
type ProviderConnectResult,
|
|
22
|
+
} from '@rango-dev/wallets-shared';
|
|
23
|
+
|
|
24
|
+
import { WALLET_ID } from '../constants.js';
|
|
25
|
+
import { bitcoinPhantom } from '../utils.js';
|
|
26
|
+
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
type AnyFunction = (...args: any[]) => any;
|
|
29
|
+
|
|
30
|
+
type BtcAccount = {
|
|
31
|
+
address: string;
|
|
32
|
+
publicKey: string;
|
|
33
|
+
addressType: 'p2tr' | 'p2wpkh' | 'p2sh' | 'p2pkh';
|
|
34
|
+
purpose: 'payment' | 'ordinals';
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const getBitcoinAccounts: () => Promise<ProviderConnectResult> = async () => {
|
|
38
|
+
const instance = bitcoinPhantom();
|
|
39
|
+
const accounts = await instance.requestAccounts();
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
accounts: accounts
|
|
43
|
+
.filter((account: BtcAccount) => account.purpose === 'payment')
|
|
44
|
+
.map((account: BtcAccount) => account.address),
|
|
45
|
+
chainId: Networks.BTC,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function getChangeAccountSubscriber(
|
|
50
|
+
instance: () => ProviderAPI | undefined
|
|
51
|
+
): [Subscriber<UtxoActions>, SubscriberCleanUp<UtxoActions>] {
|
|
52
|
+
let eventCallback: AnyFunction;
|
|
53
|
+
|
|
54
|
+
// subscriber can be passed to `or`, it will get the error and should rethrow error to pass the error to next `or` or throw error.
|
|
55
|
+
return [
|
|
56
|
+
(context, err) => {
|
|
57
|
+
const bitcoinInstance = instance();
|
|
58
|
+
|
|
59
|
+
if (!bitcoinInstance) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
'Trying to subscribe to your Solana wallet, but seems its instance is not available.'
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const [, setState] = context.state();
|
|
66
|
+
|
|
67
|
+
eventCallback = (accounts: BtcAccount[]) => {
|
|
68
|
+
/*
|
|
69
|
+
* In Phantom, when user is switching to an account which is not connected to dApp yet, it returns an empty array on `accountsChanged`.
|
|
70
|
+
* So empty array means we don't have access to account and we need to disconnect and let the user connect the account.
|
|
71
|
+
*/
|
|
72
|
+
if (!accounts.length) {
|
|
73
|
+
context.action('disconnect');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const formatAccounts = accounts
|
|
78
|
+
.filter((account) => account.purpose === 'payment')
|
|
79
|
+
.map(
|
|
80
|
+
(account: BtcAccount) =>
|
|
81
|
+
CAIP.AccountId.format({
|
|
82
|
+
address: account.address,
|
|
83
|
+
chainId: {
|
|
84
|
+
namespace: CAIP_NAMESPACE,
|
|
85
|
+
reference: CAIP_BITCOIN_CHAIN_ID,
|
|
86
|
+
},
|
|
87
|
+
}) as CaipAccount
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
setState('accounts', formatAccounts);
|
|
91
|
+
};
|
|
92
|
+
bitcoinInstance.on('accountsChanged', eventCallback);
|
|
93
|
+
|
|
94
|
+
if (err instanceof Error) {
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
(_context, err) => {
|
|
99
|
+
const bitcoinInstance = instance();
|
|
100
|
+
|
|
101
|
+
if (eventCallback && bitcoinInstance) {
|
|
102
|
+
bitcoinInstance.off('accountsChanged', eventCallback);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (err instanceof Error) {
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const [changeAccountSubscriber, changeAccountCleanup] =
|
|
113
|
+
getChangeAccountSubscriber(bitcoinPhantom);
|
|
114
|
+
|
|
115
|
+
const connect = builders
|
|
116
|
+
.connect()
|
|
117
|
+
.action(async function () {
|
|
118
|
+
const result = await getBitcoinAccounts();
|
|
119
|
+
if (Array.isArray(result)) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
'Expecting bitcoin response to be a single value, not an array.'
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const formatAccounts = result.accounts.map(
|
|
126
|
+
(account) =>
|
|
127
|
+
CAIP.AccountId.format({
|
|
128
|
+
address: account,
|
|
129
|
+
chainId: {
|
|
130
|
+
namespace: CAIP_NAMESPACE,
|
|
131
|
+
reference: CAIP_BITCOIN_CHAIN_ID,
|
|
132
|
+
},
|
|
133
|
+
}) as CaipAccount
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
return formatAccounts;
|
|
137
|
+
})
|
|
138
|
+
.before(changeAccountSubscriber)
|
|
139
|
+
.or(changeAccountCleanup)
|
|
140
|
+
.build();
|
|
141
|
+
|
|
142
|
+
const disconnect = commonBuilders
|
|
143
|
+
.disconnect<UtxoActions>()
|
|
144
|
+
.after(changeAccountCleanup)
|
|
145
|
+
.build();
|
|
146
|
+
|
|
147
|
+
const utxo = new NamespaceBuilder<UtxoActions>('UTXO', WALLET_ID)
|
|
148
|
+
.action(connect)
|
|
149
|
+
.action(disconnect)
|
|
150
|
+
.build();
|
|
151
|
+
|
|
152
|
+
export { utxo };
|
package/src/provider.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { ProviderBuilder } from '@rango-dev/wallets-core';
|
|
|
3
3
|
import { info, WALLET_ID } from './constants.js';
|
|
4
4
|
import { evm } from './namespaces/evm.js';
|
|
5
5
|
import { solana } from './namespaces/solana.js';
|
|
6
|
+
import { utxo } from './namespaces/utxo.js';
|
|
6
7
|
import { phantom as phantomInstance } from './utils.js';
|
|
7
8
|
|
|
8
9
|
const buildProvider = () =>
|
|
@@ -18,6 +19,7 @@ const buildProvider = () =>
|
|
|
18
19
|
.config('info', info)
|
|
19
20
|
.add('solana', solana)
|
|
20
21
|
.add('evm', evm)
|
|
22
|
+
.add('utxo', utxo)
|
|
21
23
|
.build();
|
|
22
24
|
|
|
23
25
|
export { buildProvider };
|
package/src/utils.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { ProviderAPI as SolanaProviderApi } from '@rango-dev/wallets-core/n
|
|
|
3
3
|
|
|
4
4
|
import { LegacyNetworks } from '@rango-dev/wallets-core/legacy';
|
|
5
5
|
|
|
6
|
-
type Provider = Map<string, unknown>;
|
|
6
|
+
export type Provider = Map<string, unknown>;
|
|
7
7
|
|
|
8
8
|
export function phantom(): Provider | null {
|
|
9
9
|
const { phantom } = window;
|
|
@@ -12,7 +12,7 @@ export function phantom(): Provider | null {
|
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const { solana, ethereum } = phantom;
|
|
15
|
+
const { solana, ethereum, bitcoin } = phantom;
|
|
16
16
|
|
|
17
17
|
const instances: Provider = new Map();
|
|
18
18
|
|
|
@@ -24,6 +24,10 @@ export function phantom(): Provider | null {
|
|
|
24
24
|
instances.set(LegacyNetworks.SOLANA, solana);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
if (bitcoin && bitcoin.isPhantom) {
|
|
28
|
+
instances.set(LegacyNetworks.BTC, bitcoin);
|
|
29
|
+
}
|
|
30
|
+
|
|
27
31
|
return instances;
|
|
28
32
|
}
|
|
29
33
|
|
|
@@ -53,3 +57,16 @@ export function solanaPhantom(): SolanaProviderApi {
|
|
|
53
57
|
|
|
54
58
|
return solanaInstance;
|
|
55
59
|
}
|
|
60
|
+
|
|
61
|
+
export function bitcoinPhantom(): SolanaProviderApi {
|
|
62
|
+
const instance = phantom();
|
|
63
|
+
const bitcoinInstance = instance?.get(LegacyNetworks.BTC);
|
|
64
|
+
|
|
65
|
+
if (!bitcoinInstance) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
'Phantom not injected or Bitcoin not enabled. Please check your wallet.'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return bitcoinInstance;
|
|
72
|
+
}
|