@rango-dev/provider-ledger 0.34.2-next.1 → 0.34.2-next.2

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/mod.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as n,m as T}from"./chunk-CVKDPNYM.js";import{ProviderBuilder as St}from"@hub3js/core";import{CAIP_ETHEREUM_CHAIN_ID as B,isEvmNamespace as at}from"@hub3js/evm";import{isSolanaNamespace as it}from"@hub3js/solana";import{getChainIdFromCaip2ChainId as st}from"@hub3js/std/utils";import{DefaultSignerFactory as ot,TransactionType as H}from"rango-types";import{DEFAULT_ETHEREUM_RPC_URL as K}from"@rango-dev/signer-evm";import{JsonRpcProvider as J,Transaction as R}from"ethers";import{SignerError as Q,SignerErrorCode as Y}from"rango-types";var D="";function A(t){D=t}n(A,"setDerivationPath");function s(){return D}n(s,"getDerivationPath");import{EVM_NAMESPACE as j,SOLANA_NAMESPACE as W}from"@hub3js/namespaces";import{CAIP_SOLANA_CHAIN_ID as C}from"@hub3js/solana";import X from"bs58";function _(){let t=new Map;return t.set(j,{chainId:h}),t.set(W,{chainId:C}),t}n(_,"ledger");var b={21781:"The device is locked",25871:"Related application is not ready on your device",27013:"Action denied by user"};function q(t){return b[t]?b[t]:T(t)?T(t):`Ledger device unknown error 0x${t.toString(x)}`}n(q,"getLedgerErrorMessage");function d(t){return t?.statusCode?new Error(q(t.statusCode)):t?.code==="INSUFFICIENT_FUNDS"?new Error("Insufficient funds for transaction"):t}n(d,"getLedgerError");function E(t,r){throw d(r)}n(E,"standardizeAndThrowLedgerError");async function M(){try{let t=await m(),r=(await import("./Eth-XBNRFZ6U.js")).default,e=new r(t),a=s(),o=[],i=await e.getAddress(a,!1,!0);return o.push(i.address),{accounts:o,chainId:h,derivationPath:a}}catch(t){throw d(t)}finally{await l()}}n(M,"getEthereumAccounts");async function N(){try{let t=await m(),r=(await import("./Solana-UB4SGWQ3.js")).default,e=new r(t),a=s(),o=[],i=await e.getAddress(a);return o.push(X.encode(i.address)),{accounts:o,chainId:C,derivationPath:a}}catch(t){throw d(t)}finally{await l()}}n(N,"getSolanaAccounts");var f=null;async function m(){return f=await(await import("./TransportWebHID-GCHW4O3P.js")).default.create(),f}n(m,"transportConnect");async function l(){f&&(await f.close(),f=null)}n(l,"transportDisconnect");var S=class{static{n(this,"EthereumSigner")}async signMessage(r){try{let e=await m(),a=(await import("./Eth-XBNRFZ6U.js")).default,i=await new a(e).signPersonalMessage(s(),Buffer.from(r).toString("hex")),c=(i.v-27).toString(16);return c.length<2&&(c="0"+c),"0x"+i.r+i.s+c}catch(e){throw new Q(Y.SIGN_TX_ERROR,void 0,e)}}async signAndSendTx(r,e,a){try{let o=new J(K),i=await o.getTransactionCount(e),c={to:r.to,gasPrice:r.gasPrice,gasLimit:r.gasLimit,nonce:i,chainId:a,data:r.data,value:r.value,maxPriorityFeePerGas:r.maxPriorityFeePerGas,maxFeePerGas:r.maxFeePerGas},u=R.from(c).unsignedSerialized.substring(2),g=await m(),w=await import("./Eth-XBNRFZ6U.js"),y=w.default,L=new y(g),O=await w.ledgerService.resolveTransaction(u,{},{}),P=await L.signTransaction(s(),u,O),$=R.from({...c,signature:{r:"0x"+P.r,s:"0x"+P.s,v:parseInt(P.v)}}).serialized;return{hash:(await o.broadcastTransaction($)).hash}}catch(o){throw d(o)}finally{await l()}}};import{generalSolanaTransactionExecutor as Z}from"@rango-dev/signer-solana";import{PublicKey as tt}from"@solana/web3.js";import{SignerError as rt,SignerErrorCode as et}from"rango-types";function nt(t){return"version"in t}n(nt,"isVersionedTransaction");var v=class{static{n(this,"SolanaSigner")}async signMessage(r){try{let e=await m(),a=(await import("./Solana-UB4SGWQ3.js")).default;return(await new a(e).signOffchainMessage(s(),Buffer.from(r))).signature.toString()}catch(e){throw new rt(et.SIGN_TX_ERROR,void 0,e)}}async signAndSendTx(r){try{return{hash:await Z(r,n(async o=>{let i=await m(),c=(await import("./Solana-UB4SGWQ3.js")).default,u=new c(i),g;nt(o)?g=await u.signTransaction(s(),o.message.serialize()):g=await u.signTransaction(s(),o.serialize());let w=await u.getAddress(s()),y=new tt(w.address);return o.addSignature(y,Buffer.from(g.signature)),o.serialize()},"DefaultSolanaSigner"))}}catch(e){throw d(e)}finally{await l()}}};async function I(){let t=new ot;return t.registerSigner(H.EVM,new S),t.registerSigner(H.SOLANA,new v),t}n(I,"getSigners");var x=16,p="ledger",h=`0x${Number(B).toString(x)}`,F={name:"Ledger",icon:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg",extensions:{homepage:"https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true"},properties:[{name:"namespaces",value:{selection:"single",data:[{label:"Ethereum",value:"EVM",id:"ETH",isChainSupported:t=>at(t)&&st(t)===B},{label:"Solana",value:"Solana",id:"SOLANA",isChainSupported:it}]}},{name:"derivationPath",value:{data:[{id:"metamask",label:"Metamask (m/44'/60'/0'/0/index)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/0'/0/${t}`},{id:"ledgerLive",label:"LedgerLive (m/44'/60'/index'/0/0)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/${t}'/0/0`},{id:"legacy",label:"Legacy (m/44'/60'/0'/index)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/0'/${t}`},{id:"(m/44'/501'/index')",label:"(m/44'/501'/index')",namespace:"Solana",generateDerivationPath:t=>`44'/501'/${t}'`},{id:"(m/44'/501'/0'/index)",label:"(m/44'/501'/0'/index)",namespace:"Solana",generateDerivationPath:t=>`44'/501'/0'/${t}`}]}},{name:"signers",value:{getSigners:async()=>I()}}]};import{NamespaceBuilder as ct}from"@hub3js/core";import{builders as k,CAIP_NAMESPACE as mt}from"@hub3js/evm";import*as V from"@hub3js/std/builders";import{AccountId as dt}from"caip";var pt=k.connect().action(async function(t,r,e){if(!e?.derivationPath)throw new Error("Derivation Path can not be empty.");A(e.derivationPath);let a=await M();return{accounts:a.accounts.map(i=>dt.format({address:i,chainId:{namespace:mt,reference:a.chainId}})),network:a.chainId}}).or(E).build(),ut=V.disconnect().build(),lt=k.getChainId().action(()=>h).build(),z=new ct("EVM",p).action(pt).action(ut).action(lt).build();import{NamespaceBuilder as gt}from"@hub3js/core";import{builders as ft,CAIP_NAMESPACE as ht}from"@hub3js/solana";import*as G from"@hub3js/std/builders";import{AccountId as wt}from"caip";var At=ft.connect().action(async function(t,r){if(!r?.derivationPath)throw new Error("Derivation Path can not be empty.");A(r.derivationPath);let e=await N();return e.accounts.map(o=>wt.format({address:o,chainId:{namespace:ht,reference:e.chainId}}))}).or(E).build(),Et=G.disconnect().build(),U=new gt("Solana",p).action(At).action(Et).build();var vt=n(()=>new St(p).init(function(t){let[,r]=t.state();_()&&r("installed",!0)}).config("metadata",F).add("solana",U).add("evm",z).build(),"buildProvider");export{p as WALLET_ID,vt as buildProvider};
1
+ import{a as n,m as b}from"./chunk-CVKDPNYM.js";import{ProviderBuilder as Ft}from"@hub3js/core";import{CAIP_ETHEREUM_CHAIN_ID as B,isEvmNamespace as lt}from"@hub3js/evm";import{isSolanaNamespace as gt}from"@hub3js/solana";import{getChainIdFromCaip2ChainId as ft}from"@hub3js/std/utils";import{DefaultSignerFactory as ut,TransactionType as k}from"rango-types";import{DEFAULT_ETHEREUM_RPC_URL as et}from"@rango-dev/signer-evm";import{JsonRpcProvider as rt,Transaction as H}from"ethers";import{SignerError as nt,SignerErrorCode as at}from"rango-types";var _="";function w(t){_=t}n(w,"setDerivationPath");function s(){return _}n(s,"getDerivationPath");import{EVM_NAMESPACE as q,SOLANA_NAMESPACE as K}from"@hub3js/namespaces";import{CAIP_SOLANA_CHAIN_ID as F}from"@hub3js/solana";import{DEFAULT_ETHEREUM_RPC_URL as Q}from"@rango-dev/signer-evm";import Y from"bs58";import{JsonRpcProvider as Z}from"ethers";var I;function L(){return I||(I=new Z(Q)),I}n(L,"getEvmRpcProvider");function M(){let t=new Map;return t.set(q,{chainId:h}),t.set(K,{chainId:F}),t}n(M,"ledger");var R={21781:"The device is locked",25871:"Related application is not ready on your device",27013:"Action denied by user"};function tt(t){return R[t]?R[t]:b(t)?b(t):`Ledger device unknown error 0x${t.toString(D)}`}n(tt,"getLedgerErrorMessage");function p(t){return t?.statusCode?new Error(tt(t.statusCode)):t?.code==="INSUFFICIENT_FUNDS"?new Error("Insufficient funds for transaction"):t}n(p,"getLedgerError");function E(t,e){throw p(e)}n(E,"standardizeAndThrowLedgerError");async function G(){try{let t=await m(),e=(await import("./Eth-XBNRFZ6U.js")).default,r=new e(t),o=s(),a=[],i=await r.getAddress(o,!1,!0);return a.push(i.address),{accounts:a,chainId:h,derivationPath:o}}catch(t){throw p(t)}finally{await g()}}n(G,"getEthereumAccounts");async function N(){try{let t=await m(),e=(await import("./Solana-UB4SGWQ3.js")).default,r=new e(t),o=s(),a=[],i=await r.getAddress(o);return a.push(Y.encode(i.address)),{accounts:a,chainId:F,derivationPath:o}}catch(t){throw p(t)}finally{await g()}}n(N,"getSolanaAccounts");var f=null;async function m(){return f=await(await import("./TransportWebHID-GCHW4O3P.js")).default.create(),f}n(m,"transportConnect");async function g(){f&&(await f.close(),f=null)}n(g,"transportDisconnect");function ot(t){return!!t.gasPrice||!!t.maxFeePerGas&&!!t.maxPriorityFeePerGas}n(ot,"hasGasPricing");function it(t){return t.maxFeePerGas&&t.maxPriorityFeePerGas?{gasPrice:null,maxFeePerGas:t.maxFeePerGas.toString(),maxPriorityFeePerGas:t.maxPriorityFeePerGas.toString()}:{gasPrice:t.gasPrice?.toString()??null,maxFeePerGas:null,maxPriorityFeePerGas:null}}n(it,"pricingFromFeeData");var A=class{static{n(this,"EthereumSigner")}async signMessage(e){try{let r=await m(),o=(await import("./Eth-XBNRFZ6U.js")).default,i=await new o(r).signPersonalMessage(s(),Buffer.from(e).toString("hex")),c=(i.v-27).toString(16);return c.length<2&&(c="0"+c),"0x"+i.r+i.s+c}catch(r){throw new nt(at.SIGN_TX_ERROR,void 0,r)}}async signAndSendTx(e,r,o){try{let a=new rt(et),i=await a.getTransactionCount(r),c=e.gasLimit??(await a.estimateGas({from:r,to:e.to,data:e.data??void 0,value:e.value??void 0})).toString(),d=ot(e)?{gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas}:it(await a.getFeeData()),l={to:e.to,gasPrice:d.gasPrice,gasLimit:c,nonce:i,chainId:o,data:e.data,value:e.value,maxPriorityFeePerGas:d.maxPriorityFeePerGas,maxFeePerGas:d.maxFeePerGas},P=H.from(l).unsignedSerialized.substring(2),y=await m(),x=await import("./Eth-XBNRFZ6U.js"),j=x.default,W=new j(y),J=await x.ledgerService.resolveTransaction(P,{},{}),T=await W.signTransaction(s(),P,J),X=H.from({...l,signature:{r:"0x"+T.r,s:"0x"+T.s,v:parseInt(T.v)}}).serialized;return{hash:(await a.broadcastTransaction(X)).hash}}catch(a){throw p(a)}finally{await g()}}};import{generalSolanaTransactionExecutor as st}from"@rango-dev/signer-solana";import{PublicKey as ct}from"@solana/web3.js";import{SignerError as mt,SignerErrorCode as dt}from"rango-types";function pt(t){return"version"in t}n(pt,"isVersionedTransaction");var v=class{static{n(this,"SolanaSigner")}async signMessage(e){try{let r=await m(),o=(await import("./Solana-UB4SGWQ3.js")).default;return(await new o(r).signOffchainMessage(s(),Buffer.from(e))).signature.toString()}catch(r){throw new mt(dt.SIGN_TX_ERROR,void 0,r)}}async signAndSendTx(e){try{return{hash:await st(e,n(async a=>{let i=await m(),c=(await import("./Solana-UB4SGWQ3.js")).default,d=new c(i),l;pt(a)?l=await d.signTransaction(s(),a.message.serialize()):l=await d.signTransaction(s(),a.serialize());let P=await d.getAddress(s()),y=new ct(P.address);return a.addSignature(y,Buffer.from(l.signature)),a.serialize()},"DefaultSolanaSigner"))}}catch(r){throw p(r)}finally{await g()}}};async function C(){let t=new ut;return t.registerSigner(k.EVM,new A),t.registerSigner(k.SOLANA,new v),t}n(C,"getSigners");var D=16,u="ledger",h=`0x${Number(B).toString(D)}`,U={name:"Ledger",icon:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg",extensions:{homepage:"https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true"},properties:[{name:"namespaces",value:{selection:"single",data:[{label:"Ethereum",value:"EVM",id:"ETH",isChainSupported:t=>lt(t)&&ft(t)===B},{label:"Solana",value:"Solana",id:"SOLANA",isChainSupported:gt}]}},{name:"derivationPath",value:{data:[{id:"metamask",label:"Metamask (m/44'/60'/0'/0/index)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/0'/0/${t}`},{id:"ledgerLive",label:"LedgerLive (m/44'/60'/index'/0/0)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/${t}'/0/0`},{id:"legacy",label:"Legacy (m/44'/60'/0'/index)",namespace:"EVM",generateDerivationPath:t=>`44'/60'/0'/${t}`},{id:"(m/44'/501'/index')",label:"(m/44'/501'/index')",namespace:"Solana",generateDerivationPath:t=>`44'/501'/${t}'`},{id:"(m/44'/501'/0'/index)",label:"(m/44'/501'/0'/index)",namespace:"Solana",generateDerivationPath:t=>`44'/501'/0'/${t}`}]}},{name:"signers",value:{getSigners:async()=>C()}}]};import{NamespaceBuilder as ht}from"@hub3js/core";import{builders as S,CAIP_NAMESPACE as Pt}from"@hub3js/evm";import*as V from"@hub3js/std/builders";import{AccountId as wt}from"caip";import{Contract as Et,toBeHex as At}from"ethers";var vt=["function allowance(address owner, address spender) view returns (uint256)"],St=S.connect().action(async function(t,e,r){if(!r?.derivationPath)throw new Error("Derivation Path can not be empty.");w(r.derivationPath);let o=await G();return{accounts:o.accounts.map(i=>wt.format({address:i,chainId:{namespace:Pt,reference:o.chainId}})),network:o.chainId}}).or(E).build(),yt=V.disconnect().build(),xt=S.getChainId().action(()=>h).build(),Tt=S.getAllowance().action(async(t,e)=>(await new Et(e.token,vt,L()).allowance(e.owner,e.spender)).toString()).build(),bt=S.getTransactionReceipt().action(async(t,e)=>{let r=await L().getTransactionReceipt(e);return r?{status:r.status===1?"0x1":"0x0",transactionHash:r.hash,blockNumber:At(r.blockNumber)}:null}).build(),z=new ht("EVM",u).action(St).action(yt).action(xt).action(Tt).action(bt).build();import{NamespaceBuilder as It}from"@hub3js/core";import{builders as Lt,CAIP_NAMESPACE as Dt}from"@hub3js/solana";import*as O from"@hub3js/std/builders";import{AccountId as Ct}from"caip";var _t=Lt.connect().action(async function(t,e){if(!e?.derivationPath)throw new Error("Derivation Path can not be empty.");w(e.derivationPath);let r=await N();return r.accounts.map(a=>Ct.format({address:a,chainId:{namespace:Dt,reference:r.chainId}}))}).or(E).build(),Rt=O.disconnect().build(),$=new It("Solana",u).action(_t).action(Rt).build();var Mt=n(()=>new Ft(u).init(function(t){let[,e]=t.state();M()&&e("installed",!0)}).config("metadata",U).add("solana",$).add("evm",z).build(),"buildProvider");export{u as WALLET_ID,Mt as buildProvider};
2
2
  //# sourceMappingURL=mod.js.map
package/dist/mod.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/provider.ts", "../src/constants.ts", "../src/signer.ts", "../src/signers/ethereum.ts", "../src/state.ts", "../src/utils.ts", "../src/signers/solana.ts", "../src/namespaces/evm.ts", "../src/namespaces/solana.ts"],
4
- "sourcesContent": ["import { ProviderBuilder } from '@hub3js/core';\n\nimport { metadata, WALLET_ID } from './constants.js';\nimport { evm } from './namespaces/evm.js';\nimport { solana } from './namespaces/solana.js';\nimport { ledger as ledgerInstance } from './utils.js';\n\nconst buildProvider = () =>\n new ProviderBuilder(WALLET_ID)\n .init(function (context) {\n const [, setState] = context.state();\n\n if (ledgerInstance()) {\n setState('installed', true);\n }\n })\n .config('metadata', metadata)\n .add('solana', solana)\n .add('evm', evm)\n .build();\n\nexport { buildProvider };\n", "import type { ProviderMetadata } from '@hub3js/core';\n\nimport { CAIP_ETHEREUM_CHAIN_ID, isEvmNamespace } from '@hub3js/evm';\nimport { isSolanaNamespace } from '@hub3js/solana';\nimport { getChainIdFromCaip2ChainId } from '@hub3js/std/utils';\n\nimport getSigners from './signer.js';\n\nexport const HEXADECIMAL_BASE = 16;\nexport const WALLET_ID = 'ledger';\n\nexport const ETHEREUM_CHAIN_ID = `0x${Number(CAIP_ETHEREUM_CHAIN_ID).toString(\n HEXADECIMAL_BASE\n)}`;\n\nexport const metadata: ProviderMetadata = {\n name: 'Ledger',\n icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg',\n extensions: {\n homepage:\n 'https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true',\n },\n properties: [\n {\n name: 'namespaces',\n value: {\n selection: 'single',\n data: [\n {\n label: 'Ethereum',\n value: 'EVM',\n id: 'ETH',\n isChainSupported: (chainId: string) =>\n isEvmNamespace(chainId) &&\n getChainIdFromCaip2ChainId(chainId) === CAIP_ETHEREUM_CHAIN_ID,\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n isChainSupported: isSolanaNamespace,\n },\n ],\n },\n },\n {\n name: 'derivationPath',\n value: {\n data: [\n {\n id: 'metamask',\n label: `Metamask (m/44'/60'/0'/0/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/0/${index}`,\n },\n {\n id: 'ledgerLive',\n label: `LedgerLive (m/44'/60'/index'/0/0)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/${index}'/0/0`,\n },\n {\n id: 'legacy',\n label: `Legacy (m/44'/60'/0'/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/${index}`,\n },\n {\n id: `(m/44'/501'/index')`,\n label: `(m/44'/501'/index')`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/${index}'`,\n },\n {\n id: `(m/44'/501'/0'/index)`,\n label: `(m/44'/501'/0'/index)`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/0'/${index}`,\n },\n ],\n },\n },\n {\n name: 'signers',\n value: { getSigners: async () => getSigners() },\n },\n ],\n};\n", "import type { SignerFactory } from 'rango-types';\n\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nimport { EthereumSigner } from './signers/ethereum';\nimport { SolanaSigner } from './signers/solana';\n\nexport default async function getSigners(): Promise<SignerFactory> {\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.EVM, new EthereumSigner());\n signers.registerSigner(TxType.SOLANA, new SolanaSigner());\n return signers;\n}\n", "import type { TransactionLike } from 'ethers';\nimport type { GenericSigner } from 'rango-types';\nimport type { EvmTransaction } from 'rango-types/mainApi';\n\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/signer-evm';\nimport { JsonRpcProvider, Transaction } from 'ethers';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { getDerivationPath } from '../state.js';\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../utils.js';\n\nexport class EthereumSigner implements GenericSigner<EvmTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n const LedgerAppEth = (await import('@ledgerhq/hw-app-eth')).default;\n const eth = new LedgerAppEth(transport);\n\n const result = await eth.signPersonalMessage(\n getDerivationPath(),\n Buffer.from(msg).toString('hex')\n );\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n let v = (result['v'] - 27).toString(16);\n if (v.length < 2) {\n v = '0' + v;\n }\n return '0x' + result['r'] + result['s'] + v;\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n fromAddress: string,\n chainId: string | null\n ): Promise<{ hash: string }> {\n try {\n const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction\n\n const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce\n\n const transaction: TransactionLike<string> = {\n to: tx.to,\n gasPrice: tx.gasPrice,\n gasLimit: tx.gasLimit,\n nonce: transactionCount,\n chainId: chainId,\n data: tx.data,\n value: tx.value,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas,\n maxFeePerGas: tx.maxFeePerGas,\n };\n\n const unsignedTx =\n Transaction.from(transaction).unsignedSerialized.substring(2); // Create unsigned transaction\n\n const transport = await transportConnect();\n const LedgerHqAppEth = await import('@ledgerhq/hw-app-eth');\n\n const LedgerAppEth = LedgerHqAppEth.default;\n const eth = new LedgerAppEth(transport);\n\n const resolution = await LedgerHqAppEth.ledgerService.resolveTransaction(\n unsignedTx,\n {},\n {}\n ); // metadata necessary to allow the device to clear sign information\n const signature = await eth.signTransaction(\n getDerivationPath(),\n unsignedTx,\n resolution\n );\n\n const signedTx = Transaction.from({\n ...transaction,\n signature: {\n r: '0x' + signature.r,\n s: '0x' + signature.s,\n v: parseInt(signature.v),\n },\n }).serialized;\n\n const broadcastResult = await provider.broadcastTransaction(signedTx);\n\n return { hash: broadcastResult.hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n", "// We keep derivationPath here because we need to maintain it for signing transactions after it is set in connect method\nlet derivationPath = '';\n\nexport function setDerivationPath(path: string) {\n derivationPath = path;\n}\n\nexport function getDerivationPath() {\n return derivationPath;\n}\n", "import type Transport from '@ledgerhq/hw-transport';\n\nimport { EVM_NAMESPACE, SOLANA_NAMESPACE } from '@hub3js/namespaces';\nimport { CAIP_SOLANA_CHAIN_ID } from '@hub3js/solana';\nimport { getAltStatusMessage } from '@ledgerhq/errors';\nimport bs58 from 'bs58';\n\nimport { ETHEREUM_CHAIN_ID, HEXADECIMAL_BASE } from './constants.js';\nimport { getDerivationPath } from './state.js';\n\nexport type Provider = Map<string, unknown>;\n\ntype DeviceAccounts = {\n accounts: string[];\n chainId: string;\n derivationPath: string;\n};\n\nexport function ledger(): Provider | null {\n /*\n * Instances have a required property which is `chainId` and is using in swap execution.\n * Here we are setting it as Ethereum always since we are supporting only eth for now.\n */\n const instances = new Map();\n\n instances.set(EVM_NAMESPACE, { chainId: ETHEREUM_CHAIN_ID });\n instances.set(SOLANA_NAMESPACE, { chainId: CAIP_SOLANA_CHAIN_ID });\n\n return instances;\n}\n\nconst ledgerFrequentErrorMessages: { [statusCode: number]: string } = {\n 0x5515: 'The device is locked',\n 0x650f: 'Related application is not ready on your device',\n 0x6985: 'Action denied by user',\n};\n\nfunction getLedgerErrorMessage(statusCode: number): string {\n if (ledgerFrequentErrorMessages[statusCode]) {\n return ledgerFrequentErrorMessages[statusCode];\n } else if (getAltStatusMessage(statusCode)) {\n return getAltStatusMessage(statusCode) as string;\n }\n\n return `Ledger device unknown error 0x${statusCode.toString(\n HEXADECIMAL_BASE\n )}`; // Hexadecimal numbers are more commonly recognized and utilized for representing ledger error codes\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getLedgerError(error: any) {\n if (error?.statusCode) {\n return new Error(getLedgerErrorMessage(error.statusCode));\n }\n\n if (error?.code === 'INSUFFICIENT_FUNDS') {\n return new Error('Insufficient funds for transaction');\n }\n return error;\n}\n\nexport function standardizeAndThrowLedgerError(_: unknown, error: unknown) {\n throw getLedgerError(error);\n}\n\nexport async function getEthereumAccounts(): Promise<DeviceAccounts> {\n try {\n const transport = await transportConnect();\n const LedgerAppEth = (await import('@ledgerhq/hw-app-eth')).default;\n const eth = new LedgerAppEth(transport);\n const derivationPath = getDerivationPath();\n\n const accounts: string[] = [];\n\n const result = await eth.getAddress(derivationPath, false, true);\n accounts.push(result.address);\n\n return {\n accounts: accounts,\n chainId: ETHEREUM_CHAIN_ID,\n derivationPath,\n };\n } catch (error: unknown) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nexport async function getSolanaAccounts(): Promise<DeviceAccounts> {\n try {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana')).default;\n const solana = new LedgerAppSolana(transport);\n const derivationPath = getDerivationPath();\n\n const accounts: string[] = [];\n\n const result = await solana.getAddress(derivationPath);\n accounts.push(bs58.encode(result.address));\n\n return {\n accounts: accounts,\n chainId: CAIP_SOLANA_CHAIN_ID,\n derivationPath,\n };\n } catch (error: unknown) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nlet transportConnection: Transport | null = null;\n\nexport async function transportConnect() {\n const TransportWebHID = (await import('@ledgerhq/hw-transport-webhid'))\n .default;\n\n transportConnection = await TransportWebHID.create();\n\n return transportConnection;\n}\n\nexport async function transportDisconnect() {\n if (transportConnection) {\n await transportConnection.close();\n transportConnection = null;\n }\n}\n", "import type { SolanaWeb3Signer } from '@rango-dev/signer-solana';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { GenericSigner, SolanaTransaction } from 'rango-types';\n\nimport { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';\nimport { PublicKey } from '@solana/web3.js';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { getDerivationPath } from '../state.js';\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../utils.js';\n\nexport function isVersionedTransaction(\n transaction: Transaction | VersionedTransaction\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nexport class SolanaSigner implements GenericSigner<SolanaTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana')).default;\n const solana = new LedgerAppSolana(transport);\n\n const result = await solana.signOffchainMessage(\n getDerivationPath(),\n Buffer.from(msg)\n );\n return result.signature.toString();\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(tx: SolanaTransaction): Promise<{ hash: string }> {\n try {\n const DefaultSolanaSigner: SolanaWeb3Signer = async (\n solanaWeb3Transaction: Transaction | VersionedTransaction\n ) => {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana'))\n .default;\n const solana = new LedgerAppSolana(transport);\n\n let signResult;\n if (isVersionedTransaction(solanaWeb3Transaction)) {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.message.serialize() as Buffer\n );\n } else {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.serialize()\n );\n }\n\n const addressResult = await solana.getAddress(getDerivationPath());\n\n const publicKey = new PublicKey(addressResult.address);\n\n solanaWeb3Transaction.addSignature(\n publicKey,\n Buffer.from(signResult.signature)\n );\n\n const serializedTx = solanaWeb3Transaction.serialize();\n\n return serializedTx;\n };\n const hash = await generalSolanaTransactionExecutor(\n tx,\n DefaultSolanaSigner\n );\n return { hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n", "import type { EvmActions } from '@hub3js/evm';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { NamespaceBuilder } from '@hub3js/core';\nimport { builders, CAIP_NAMESPACE } from '@hub3js/evm';\nimport * as commonBuilders from '@hub3js/std/builders';\nimport { AccountId } from 'caip';\n\nimport { ETHEREUM_CHAIN_ID, WALLET_ID } from '../constants.js';\nimport { setDerivationPath } from '../state.js';\nimport {\n getEthereumAccounts,\n standardizeAndThrowLedgerError,\n} from '../utils.js';\n\nconst connect = builders\n .connect()\n .action(async function (_context, _chain, options) {\n if (!options?.derivationPath) {\n throw new Error('Derivation Path can not be empty.');\n }\n\n setDerivationPath(options.derivationPath);\n\n const result = await getEthereumAccounts();\n\n const formatAccounts = result.accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: result.chainId,\n },\n }) as CaipAccount\n );\n\n return {\n accounts: formatAccounts,\n network: result.chainId,\n };\n })\n .or(standardizeAndThrowLedgerError)\n .build();\n\nconst disconnect = commonBuilders.disconnect<EvmActions>().build();\n\nconst getChainId = builders\n .getChainId()\n .action(() => ETHEREUM_CHAIN_ID)\n .build();\n\nconst evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .action(getChainId)\n .build();\n\nexport { evm };\n", "import type { SolanaActions } from '@hub3js/solana';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { NamespaceBuilder } from '@hub3js/core';\nimport { builders, CAIP_NAMESPACE } from '@hub3js/solana';\nimport * as commonBuilders from '@hub3js/std/builders';\nimport { AccountId } from 'caip';\n\nimport { WALLET_ID } from '../constants.js';\nimport { setDerivationPath } from '../state.js';\nimport { getSolanaAccounts, standardizeAndThrowLedgerError } from '../utils.js';\n\nconst connect = builders\n .connect()\n .action(async function (_context, options) {\n if (!options?.derivationPath) {\n throw new Error('Derivation Path can not be empty.');\n }\n\n setDerivationPath(options.derivationPath);\n\n const result = await getSolanaAccounts();\n\n const formatAccounts = result.accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: result.chainId,\n },\n }) as CaipAccount\n );\n\n return formatAccounts;\n })\n .or(standardizeAndThrowLedgerError)\n .build();\n\nconst disconnect = commonBuilders.disconnect<SolanaActions>().build();\n\nconst solana = new NamespaceBuilder<SolanaActions>('Solana', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { solana };\n"],
5
- "mappings": "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",
6
- "names": ["ProviderBuilder", "CAIP_ETHEREUM_CHAIN_ID", "isEvmNamespace", "isSolanaNamespace", "getChainIdFromCaip2ChainId", "DefaultSignerFactory", "TxType", "DEFAULT_ETHEREUM_RPC_URL", "JsonRpcProvider", "Transaction", "SignerError", "SignerErrorCode", "derivationPath", "setDerivationPath", "path", "__name", "getDerivationPath", "EVM_NAMESPACE", "SOLANA_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "bs58", "ledger", "instances", "EVM_NAMESPACE", "ETHEREUM_CHAIN_ID", "SOLANA_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "__name", "ledgerFrequentErrorMessages", "getLedgerErrorMessage", "statusCode", "getAltStatusMessage", "HEXADECIMAL_BASE", "getLedgerError", "error", "standardizeAndThrowLedgerError", "_", "getEthereumAccounts", "transport", "transportConnect", "LedgerAppEth", "eth", "derivationPath", "getDerivationPath", "accounts", "result", "transportDisconnect", "getSolanaAccounts", "LedgerAppSolana", "solana", "bs58", "transportConnection", "EthereumSigner", "__name", "msg", "transport", "transportConnect", "LedgerAppEth", "result", "getDerivationPath", "v", "error", "SignerError", "SignerErrorCode", "tx", "fromAddress", "chainId", "provider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "transactionCount", "transaction", "unsignedTx", "Transaction", "LedgerHqAppEth", "eth", "resolution", "signature", "signedTx", "getLedgerError", "transportDisconnect", "generalSolanaTransactionExecutor", "PublicKey", "SignerError", "SignerErrorCode", "isVersionedTransaction", "transaction", "__name", "SolanaSigner", "msg", "transport", "transportConnect", "LedgerAppSolana", "getDerivationPath", "error", "SignerError", "SignerErrorCode", "tx", "generalSolanaTransactionExecutor", "solanaWeb3Transaction", "solana", "signResult", "addressResult", "publicKey", "PublicKey", "getLedgerError", "transportDisconnect", "getSigners", "signers", "DefaultSignerFactory", "TxType", "EthereumSigner", "SolanaSigner", "__name", "HEXADECIMAL_BASE", "WALLET_ID", "ETHEREUM_CHAIN_ID", "CAIP_ETHEREUM_CHAIN_ID", "metadata", "chainId", "isEvmNamespace", "getChainIdFromCaip2ChainId", "isSolanaNamespace", "index", "getSigners", "NamespaceBuilder", "builders", "CAIP_NAMESPACE", "commonBuilders", "AccountId", "connect", "builders", "_context", "_chain", "options", "setDerivationPath", "result", "getEthereumAccounts", "account", "AccountId", "CAIP_NAMESPACE", "standardizeAndThrowLedgerError", "disconnect", "getChainId", "ETHEREUM_CHAIN_ID", "evm", "NamespaceBuilder", "WALLET_ID", "NamespaceBuilder", "builders", "CAIP_NAMESPACE", "commonBuilders", "AccountId", "connect", "builders", "_context", "options", "setDerivationPath", "result", "getSolanaAccounts", "account", "AccountId", "CAIP_NAMESPACE", "standardizeAndThrowLedgerError", "disconnect", "solana", "NamespaceBuilder", "WALLET_ID", "buildProvider", "__name", "ProviderBuilder", "WALLET_ID", "context", "setState", "ledger", "metadata", "solana", "evm"]
4
+ "sourcesContent": ["import { ProviderBuilder } from '@hub3js/core';\n\nimport { metadata, WALLET_ID } from './constants.js';\nimport { evm } from './namespaces/evm.js';\nimport { solana } from './namespaces/solana.js';\nimport { ledger as ledgerInstance } from './utils.js';\n\nconst buildProvider = () =>\n new ProviderBuilder(WALLET_ID)\n .init(function (context) {\n const [, setState] = context.state();\n\n if (ledgerInstance()) {\n setState('installed', true);\n }\n })\n .config('metadata', metadata)\n .add('solana', solana)\n .add('evm', evm)\n .build();\n\nexport { buildProvider };\n", "import type { ProviderMetadata } from '@hub3js/core';\n\nimport { CAIP_ETHEREUM_CHAIN_ID, isEvmNamespace } from '@hub3js/evm';\nimport { isSolanaNamespace } from '@hub3js/solana';\nimport { getChainIdFromCaip2ChainId } from '@hub3js/std/utils';\n\nimport getSigners from './signer.js';\n\nexport const HEXADECIMAL_BASE = 16;\nexport const WALLET_ID = 'ledger';\n\nexport const ETHEREUM_CHAIN_ID = `0x${Number(CAIP_ETHEREUM_CHAIN_ID).toString(\n HEXADECIMAL_BASE\n)}`;\n\nexport const metadata: ProviderMetadata = {\n name: 'Ledger',\n icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/ledger/icon.svg',\n extensions: {\n homepage:\n 'https://support.ledger.com/hc/en-us/articles/4404389606417-Download-and-install-Ledger-Live?docs=true',\n },\n properties: [\n {\n name: 'namespaces',\n value: {\n selection: 'single',\n data: [\n {\n label: 'Ethereum',\n value: 'EVM',\n id: 'ETH',\n isChainSupported: (chainId: string) =>\n isEvmNamespace(chainId) &&\n getChainIdFromCaip2ChainId(chainId) === CAIP_ETHEREUM_CHAIN_ID,\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n isChainSupported: isSolanaNamespace,\n },\n ],\n },\n },\n {\n name: 'derivationPath',\n value: {\n data: [\n {\n id: 'metamask',\n label: `Metamask (m/44'/60'/0'/0/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/0/${index}`,\n },\n {\n id: 'ledgerLive',\n label: `LedgerLive (m/44'/60'/index'/0/0)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/${index}'/0/0`,\n },\n {\n id: 'legacy',\n label: `Legacy (m/44'/60'/0'/index)`,\n namespace: 'EVM',\n generateDerivationPath: (index: string) => `44'/60'/0'/${index}`,\n },\n {\n id: `(m/44'/501'/index')`,\n label: `(m/44'/501'/index')`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/${index}'`,\n },\n {\n id: `(m/44'/501'/0'/index)`,\n label: `(m/44'/501'/0'/index)`,\n namespace: 'Solana',\n generateDerivationPath: (index: string) => `44'/501'/0'/${index}`,\n },\n ],\n },\n },\n {\n name: 'signers',\n value: { getSigners: async () => getSigners() },\n },\n ],\n};\n", "import type { SignerFactory } from 'rango-types';\n\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nimport { EthereumSigner } from './signers/ethereum';\nimport { SolanaSigner } from './signers/solana';\n\nexport default async function getSigners(): Promise<SignerFactory> {\n const signers = new DefaultSignerFactory();\n signers.registerSigner(TxType.EVM, new EthereumSigner());\n signers.registerSigner(TxType.SOLANA, new SolanaSigner());\n return signers;\n}\n", "import type { FeeData, TransactionLike } from 'ethers';\nimport type { GenericSigner } from 'rango-types';\nimport type { EvmTransaction } from 'rango-types/mainApi';\n\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/signer-evm';\nimport { JsonRpcProvider, Transaction } from 'ethers';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { getDerivationPath } from '../state.js';\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../utils.js';\n\n/** Whether a transaction already prices itself under either scheme. */\nfunction hasGasPricing(tx: EvmTransaction): boolean {\n return !!tx.gasPrice || (!!tx.maxFeePerGas && !!tx.maxPriorityFeePerGas);\n}\n\n/**\n * Picks one pricing scheme from what the node quotes. The two are mutually\n * exclusive in a signed transaction, so EIP-1559 is used wherever the chain\n * quotes it and a legacy price is the fallback.\n */\nfunction pricingFromFeeData(fees: FeeData) {\n if (fees.maxFeePerGas && fees.maxPriorityFeePerGas) {\n return {\n gasPrice: null,\n maxFeePerGas: fees.maxFeePerGas.toString(),\n maxPriorityFeePerGas: fees.maxPriorityFeePerGas.toString(),\n };\n }\n\n return {\n gasPrice: fees.gasPrice?.toString() ?? null,\n maxFeePerGas: null,\n maxPriorityFeePerGas: null,\n };\n}\n\nexport class EthereumSigner implements GenericSigner<EvmTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n const LedgerAppEth = (await import('@ledgerhq/hw-app-eth')).default;\n const eth = new LedgerAppEth(transport);\n\n const result = await eth.signPersonalMessage(\n getDerivationPath(),\n Buffer.from(msg).toString('hex')\n );\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n let v = (result['v'] - 27).toString(16);\n if (v.length < 2) {\n v = '0' + v;\n }\n return '0x' + result['r'] + result['s'] + v;\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n fromAddress: string,\n chainId: string | null\n ): Promise<{ hash: string }> {\n try {\n const provider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL); // Provider to broadcast transaction\n\n const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce\n\n /*\n * Ledger signs a raw transaction on-device and does not estimate gas, so\n * a limit has to be present. Server-built transactions arrive with one;\n * client-built ones - approve prerequisites among them - do not, so it is\n * estimated here. Everything else is taken as the transaction sends it.\n */\n const gasLimit =\n tx.gasLimit ??\n (\n await provider.estimateGas({\n from: fromAddress,\n to: tx.to,\n data: tx.data ?? undefined,\n value: tx.value ?? undefined,\n })\n ).toString();\n\n /*\n * Whatever pricing the transaction came with wins - a server-built one\n * always carries it, and it is signed with exactly what it was created\n * with. Only a client-built transaction, which leaves both schemes null,\n * is priced from the node.\n */\n const pricing = hasGasPricing(tx)\n ? {\n gasPrice: tx.gasPrice,\n maxFeePerGas: tx.maxFeePerGas,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas,\n }\n : pricingFromFeeData(await provider.getFeeData());\n\n const transaction: TransactionLike<string> = {\n to: tx.to,\n gasPrice: pricing.gasPrice,\n gasLimit,\n nonce: transactionCount,\n chainId: chainId,\n data: tx.data,\n value: tx.value,\n maxPriorityFeePerGas: pricing.maxPriorityFeePerGas,\n maxFeePerGas: pricing.maxFeePerGas,\n };\n\n const unsignedTx =\n Transaction.from(transaction).unsignedSerialized.substring(2); // Create unsigned transaction\n\n const transport = await transportConnect();\n const LedgerHqAppEth = await import('@ledgerhq/hw-app-eth');\n\n const LedgerAppEth = LedgerHqAppEth.default;\n const eth = new LedgerAppEth(transport);\n\n const resolution = await LedgerHqAppEth.ledgerService.resolveTransaction(\n unsignedTx,\n {},\n {}\n ); // metadata necessary to allow the device to clear sign information\n const signature = await eth.signTransaction(\n getDerivationPath(),\n unsignedTx,\n resolution\n );\n\n const signedTx = Transaction.from({\n ...transaction,\n signature: {\n r: '0x' + signature.r,\n s: '0x' + signature.s,\n v: parseInt(signature.v),\n },\n }).serialized;\n\n const broadcastResult = await provider.broadcastTransaction(signedTx);\n\n return { hash: broadcastResult.hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n", "// We keep derivationPath here because we need to maintain it for signing transactions after it is set in connect method\nlet derivationPath = '';\n\nexport function setDerivationPath(path: string) {\n derivationPath = path;\n}\n\nexport function getDerivationPath() {\n return derivationPath;\n}\n", "import type Transport from '@ledgerhq/hw-transport';\n\nimport { EVM_NAMESPACE, SOLANA_NAMESPACE } from '@hub3js/namespaces';\nimport { CAIP_SOLANA_CHAIN_ID } from '@hub3js/solana';\nimport { getAltStatusMessage } from '@ledgerhq/errors';\nimport { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/signer-evm';\nimport bs58 from 'bs58';\nimport { JsonRpcProvider } from 'ethers';\n\nimport { ETHEREUM_CHAIN_ID, HEXADECIMAL_BASE } from './constants.js';\nimport { getDerivationPath } from './state.js';\n\nexport type Provider = Map<string, unknown>;\n\n/**\n * Ledger EVM is Ethereum-only today and has no injected provider, so a single\n * JSON-RPC provider over the Ethereum endpoint serves both the signer (nonce +\n * broadcast) and the read-only namespace actions (allowance, receipt).\n *\n * NOTE: If Ledger EVM support ever expands beyond Ethereum, this must select\n * the RPC per chain instead of the single Ethereum endpoint.\n */\nlet evmRpcProvider: JsonRpcProvider | undefined;\nexport function getEvmRpcProvider(): JsonRpcProvider {\n if (!evmRpcProvider) {\n evmRpcProvider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL);\n }\n return evmRpcProvider;\n}\n\ntype DeviceAccounts = {\n accounts: string[];\n chainId: string;\n derivationPath: string;\n};\n\nexport function ledger(): Provider | null {\n /*\n * Instances have a required property which is `chainId` and is using in swap execution.\n * Here we are setting it as Ethereum always since we are supporting only eth for now.\n */\n const instances = new Map();\n\n instances.set(EVM_NAMESPACE, { chainId: ETHEREUM_CHAIN_ID });\n instances.set(SOLANA_NAMESPACE, { chainId: CAIP_SOLANA_CHAIN_ID });\n\n return instances;\n}\n\nconst ledgerFrequentErrorMessages: { [statusCode: number]: string } = {\n 0x5515: 'The device is locked',\n 0x650f: 'Related application is not ready on your device',\n 0x6985: 'Action denied by user',\n};\n\nfunction getLedgerErrorMessage(statusCode: number): string {\n if (ledgerFrequentErrorMessages[statusCode]) {\n return ledgerFrequentErrorMessages[statusCode];\n } else if (getAltStatusMessage(statusCode)) {\n return getAltStatusMessage(statusCode) as string;\n }\n\n return `Ledger device unknown error 0x${statusCode.toString(\n HEXADECIMAL_BASE\n )}`; // Hexadecimal numbers are more commonly recognized and utilized for representing ledger error codes\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getLedgerError(error: any) {\n if (error?.statusCode) {\n return new Error(getLedgerErrorMessage(error.statusCode));\n }\n\n if (error?.code === 'INSUFFICIENT_FUNDS') {\n return new Error('Insufficient funds for transaction');\n }\n return error;\n}\n\nexport function standardizeAndThrowLedgerError(_: unknown, error: unknown) {\n throw getLedgerError(error);\n}\n\nexport async function getEthereumAccounts(): Promise<DeviceAccounts> {\n try {\n const transport = await transportConnect();\n const LedgerAppEth = (await import('@ledgerhq/hw-app-eth')).default;\n const eth = new LedgerAppEth(transport);\n const derivationPath = getDerivationPath();\n\n const accounts: string[] = [];\n\n const result = await eth.getAddress(derivationPath, false, true);\n accounts.push(result.address);\n\n return {\n accounts: accounts,\n chainId: ETHEREUM_CHAIN_ID,\n derivationPath,\n };\n } catch (error: unknown) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nexport async function getSolanaAccounts(): Promise<DeviceAccounts> {\n try {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana')).default;\n const solana = new LedgerAppSolana(transport);\n const derivationPath = getDerivationPath();\n\n const accounts: string[] = [];\n\n const result = await solana.getAddress(derivationPath);\n accounts.push(bs58.encode(result.address));\n\n return {\n accounts: accounts,\n chainId: CAIP_SOLANA_CHAIN_ID,\n derivationPath,\n };\n } catch (error: unknown) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n}\n\nlet transportConnection: Transport | null = null;\n\nexport async function transportConnect() {\n const TransportWebHID = (await import('@ledgerhq/hw-transport-webhid'))\n .default;\n\n transportConnection = await TransportWebHID.create();\n\n return transportConnection;\n}\n\nexport async function transportDisconnect() {\n if (transportConnection) {\n await transportConnection.close();\n transportConnection = null;\n }\n}\n", "import type { SolanaWeb3Signer } from '@rango-dev/signer-solana';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { GenericSigner, SolanaTransaction } from 'rango-types';\n\nimport { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';\nimport { PublicKey } from '@solana/web3.js';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { getDerivationPath } from '../state.js';\nimport {\n getLedgerError,\n transportConnect,\n transportDisconnect,\n} from '../utils.js';\n\nexport function isVersionedTransaction(\n transaction: Transaction | VersionedTransaction\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nexport class SolanaSigner implements GenericSigner<SolanaTransaction> {\n async signMessage(msg: string): Promise<string> {\n try {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana')).default;\n const solana = new LedgerAppSolana(transport);\n\n const result = await solana.signOffchainMessage(\n getDerivationPath(),\n Buffer.from(msg)\n );\n return result.signature.toString();\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(tx: SolanaTransaction): Promise<{ hash: string }> {\n try {\n const DefaultSolanaSigner: SolanaWeb3Signer = async (\n solanaWeb3Transaction: Transaction | VersionedTransaction\n ) => {\n const transport = await transportConnect();\n const LedgerAppSolana = (await import('@ledgerhq/hw-app-solana'))\n .default;\n const solana = new LedgerAppSolana(transport);\n\n let signResult;\n if (isVersionedTransaction(solanaWeb3Transaction)) {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.message.serialize() as Buffer\n );\n } else {\n signResult = await solana.signTransaction(\n getDerivationPath(),\n solanaWeb3Transaction.serialize()\n );\n }\n\n const addressResult = await solana.getAddress(getDerivationPath());\n\n const publicKey = new PublicKey(addressResult.address);\n\n solanaWeb3Transaction.addSignature(\n publicKey,\n Buffer.from(signResult.signature)\n );\n\n const serializedTx = solanaWeb3Transaction.serialize();\n\n return serializedTx;\n };\n const hash = await generalSolanaTransactionExecutor(\n tx,\n DefaultSolanaSigner\n );\n return { hash };\n } catch (error) {\n throw getLedgerError(error);\n } finally {\n await transportDisconnect();\n }\n }\n}\n", "import type { Context } from '@hub3js/core';\nimport type {\n AllowanceParams,\n EvmActions,\n EvmTransactionReceipt,\n} from '@hub3js/evm';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { NamespaceBuilder } from '@hub3js/core';\nimport { builders, CAIP_NAMESPACE } from '@hub3js/evm';\nimport * as commonBuilders from '@hub3js/std/builders';\nimport { AccountId } from 'caip';\nimport { Contract, toBeHex } from 'ethers';\n\nimport { ETHEREUM_CHAIN_ID, WALLET_ID } from '../constants.js';\nimport { setDerivationPath } from '../state.js';\nimport {\n getEthereumAccounts,\n getEvmRpcProvider,\n standardizeAndThrowLedgerError,\n} from '../utils.js';\n\nconst ERC20_ALLOWANCE_ABI = [\n 'function allowance(address owner, address spender) view returns (uint256)',\n];\n\nconst connect = builders\n .connect()\n .action(async function (_context, _chain, options) {\n if (!options?.derivationPath) {\n throw new Error('Derivation Path can not be empty.');\n }\n\n setDerivationPath(options.derivationPath);\n\n const result = await getEthereumAccounts();\n\n const formatAccounts = result.accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: result.chainId,\n },\n }) as CaipAccount\n );\n\n return {\n accounts: formatAccounts,\n network: result.chainId,\n };\n })\n .or(standardizeAndThrowLedgerError)\n .build();\n\nconst disconnect = commonBuilders.disconnect<EvmActions>().build();\n\nconst getChainId = builders\n .getChainId()\n .action(() => ETHEREUM_CHAIN_ID)\n .build();\n\n/*\n * Ledger injects no EIP-1193 provider, so these read actions talk to the shared\n * JSON-RPC provider directly rather than through the default hub3js/evm actions.\n */\nconst getAllowance = builders\n .getAllowance()\n .action(\n async (\n _context: Context<EvmActions>,\n params: AllowanceParams\n ): Promise<string> => {\n const token = new Contract(\n params.token,\n ERC20_ALLOWANCE_ABI,\n getEvmRpcProvider()\n );\n const currentAllowance: bigint = await token.allowance(\n params.owner,\n params.spender\n );\n return currentAllowance.toString();\n }\n )\n .build();\n\nconst getTransactionReceipt = builders\n .getTransactionReceipt()\n .action(\n async (\n _context: Context<EvmActions>,\n transactionHash: `0x${string}`\n ): Promise<EvmTransactionReceipt | null> => {\n const receipt = await getEvmRpcProvider().getTransactionReceipt(\n transactionHash\n );\n if (!receipt) {\n return null;\n }\n return {\n status: receipt.status === 1 ? '0x1' : '0x0',\n transactionHash: receipt.hash,\n blockNumber: toBeHex(receipt.blockNumber),\n };\n }\n )\n .build();\n\nconst evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .action(getChainId)\n .action(getAllowance)\n .action(getTransactionReceipt)\n .build();\n\nexport { evm };\n", "import type { SolanaActions } from '@hub3js/solana';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { NamespaceBuilder } from '@hub3js/core';\nimport { builders, CAIP_NAMESPACE } from '@hub3js/solana';\nimport * as commonBuilders from '@hub3js/std/builders';\nimport { AccountId } from 'caip';\n\nimport { WALLET_ID } from '../constants.js';\nimport { setDerivationPath } from '../state.js';\nimport { getSolanaAccounts, standardizeAndThrowLedgerError } from '../utils.js';\n\nconst connect = builders\n .connect()\n .action(async function (_context, options) {\n if (!options?.derivationPath) {\n throw new Error('Derivation Path can not be empty.');\n }\n\n setDerivationPath(options.derivationPath);\n\n const result = await getSolanaAccounts();\n\n const formatAccounts = result.accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: result.chainId,\n },\n }) as CaipAccount\n );\n\n return formatAccounts;\n })\n .or(standardizeAndThrowLedgerError)\n .build();\n\nconst disconnect = commonBuilders.disconnect<SolanaActions>().build();\n\nconst solana = new NamespaceBuilder<SolanaActions>('Solana', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .build();\n\nexport { solana };\n"],
5
+ "mappings": "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",
6
+ "names": ["ProviderBuilder", "CAIP_ETHEREUM_CHAIN_ID", "isEvmNamespace", "isSolanaNamespace", "getChainIdFromCaip2ChainId", "DefaultSignerFactory", "TxType", "DEFAULT_ETHEREUM_RPC_URL", "JsonRpcProvider", "Transaction", "SignerError", "SignerErrorCode", "derivationPath", "setDerivationPath", "path", "__name", "getDerivationPath", "EVM_NAMESPACE", "SOLANA_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "DEFAULT_ETHEREUM_RPC_URL", "bs58", "JsonRpcProvider", "evmRpcProvider", "getEvmRpcProvider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "__name", "ledger", "instances", "EVM_NAMESPACE", "ETHEREUM_CHAIN_ID", "SOLANA_NAMESPACE", "CAIP_SOLANA_CHAIN_ID", "ledgerFrequentErrorMessages", "getLedgerErrorMessage", "statusCode", "getAltStatusMessage", "HEXADECIMAL_BASE", "getLedgerError", "error", "standardizeAndThrowLedgerError", "_", "getEthereumAccounts", "transport", "transportConnect", "LedgerAppEth", "eth", "derivationPath", "getDerivationPath", "accounts", "result", "transportDisconnect", "getSolanaAccounts", "LedgerAppSolana", "solana", "bs58", "transportConnection", "hasGasPricing", "tx", "__name", "pricingFromFeeData", "fees", "EthereumSigner", "msg", "transport", "transportConnect", "LedgerAppEth", "result", "getDerivationPath", "v", "error", "SignerError", "SignerErrorCode", "fromAddress", "chainId", "provider", "JsonRpcProvider", "DEFAULT_ETHEREUM_RPC_URL", "transactionCount", "gasLimit", "pricing", "transaction", "unsignedTx", "Transaction", "LedgerHqAppEth", "eth", "resolution", "signature", "signedTx", "getLedgerError", "transportDisconnect", "generalSolanaTransactionExecutor", "PublicKey", "SignerError", "SignerErrorCode", "isVersionedTransaction", "transaction", "__name", "SolanaSigner", "msg", "transport", "transportConnect", "LedgerAppSolana", "getDerivationPath", "error", "SignerError", "SignerErrorCode", "tx", "generalSolanaTransactionExecutor", "solanaWeb3Transaction", "solana", "signResult", "addressResult", "publicKey", "PublicKey", "getLedgerError", "transportDisconnect", "getSigners", "signers", "DefaultSignerFactory", "TxType", "EthereumSigner", "SolanaSigner", "__name", "HEXADECIMAL_BASE", "WALLET_ID", "ETHEREUM_CHAIN_ID", "CAIP_ETHEREUM_CHAIN_ID", "metadata", "chainId", "isEvmNamespace", "getChainIdFromCaip2ChainId", "isSolanaNamespace", "index", "getSigners", "NamespaceBuilder", "builders", "CAIP_NAMESPACE", "commonBuilders", "AccountId", "Contract", "toBeHex", "ERC20_ALLOWANCE_ABI", "connect", "builders", "_context", "_chain", "options", "setDerivationPath", "result", "getEthereumAccounts", "account", "AccountId", "CAIP_NAMESPACE", "standardizeAndThrowLedgerError", "disconnect", "getChainId", "ETHEREUM_CHAIN_ID", "getAllowance", "params", "Contract", "getEvmRpcProvider", "getTransactionReceipt", "transactionHash", "receipt", "toBeHex", "evm", "NamespaceBuilder", "WALLET_ID", "NamespaceBuilder", "builders", "CAIP_NAMESPACE", "commonBuilders", "AccountId", "connect", "builders", "_context", "options", "setDerivationPath", "result", "getSolanaAccounts", "account", "AccountId", "CAIP_NAMESPACE", "standardizeAndThrowLedgerError", "disconnect", "solana", "NamespaceBuilder", "WALLET_ID", "buildProvider", "__name", "ProviderBuilder", "WALLET_ID", "context", "setState", "ledger", "metadata", "solana", "evm"]
7
7
  }
package/dist/utils.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import type Transport from '@ledgerhq/hw-transport';
2
+ import { JsonRpcProvider } from 'ethers';
2
3
  export type Provider = Map<string, unknown>;
4
+ export declare function getEvmRpcProvider(): JsonRpcProvider;
3
5
  type DeviceAccounts = {
4
6
  accounts: string[];
5
7
  chainId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rango-dev/provider-ledger",
3
- "version": "0.34.2-next.1",
3
+ "version": "0.34.2-next.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "source": "./src/mod.ts",
@@ -22,26 +22,26 @@
22
22
  "lint": "eslint \"**/*.{ts,tsx}\""
23
23
  },
24
24
  "dependencies": {
25
- "@hub3js/core": "^0.62.0",
26
- "@hub3js/evm": "^0.5.0",
27
- "@hub3js/namespaces": "^0.5.1",
28
- "@hub3js/solana": "^0.5.0",
29
- "@hub3js/std": "^0.4.0",
25
+ "@hub3js/core": "^0.63.0",
26
+ "@hub3js/evm": "^0.6.0",
27
+ "@hub3js/namespaces": "^0.6.0",
28
+ "@hub3js/solana": "^0.6.0",
29
+ "@hub3js/std": "^0.5.0",
30
30
  "@ledgerhq/errors": "^6.16.4",
31
31
  "@ledgerhq/hw-app-eth": "^6.36.0",
32
32
  "@ledgerhq/hw-app-solana": "^7.1.6",
33
33
  "@ledgerhq/hw-transport-webhid": "^6.28.6",
34
34
  "@ledgerhq/types-cryptoassets": "^7.11.0",
35
35
  "@ledgerhq/types-devices": "^6.24.0",
36
- "@rango-dev/signer-evm": "^0.46.2-next.0",
37
- "@rango-dev/signer-solana": "^0.50.1-next.0",
38
- "@rango-dev/wallets-core": "^0.62.2-next.0",
36
+ "@rango-dev/signer-evm": "^0.46.2-next.1",
37
+ "@rango-dev/signer-solana": "^0.50.1-next.1",
38
+ "@rango-dev/wallets-core": "^0.62.2-next.1",
39
39
  "@solana/web3.js": "^1.91.4",
40
40
  "@types/w3c-web-hid": "^1.0.2",
41
41
  "bs58": "^5.0.0",
42
42
  "caip": "^1.1.1",
43
43
  "ethers": "^6.13.2",
44
- "rango-types": "^0.5.0"
44
+ "rango-types": "^0.6.0"
45
45
  },
46
46
  "publishConfig": {
47
47
  "access": "public"
@@ -1,18 +1,29 @@
1
- import type { EvmActions } from '@hub3js/evm';
1
+ import type { Context } from '@hub3js/core';
2
+ import type {
3
+ AllowanceParams,
4
+ EvmActions,
5
+ EvmTransactionReceipt,
6
+ } from '@hub3js/evm';
2
7
  import type { CaipAccount } from '@hub3js/std/types';
3
8
 
4
9
  import { NamespaceBuilder } from '@hub3js/core';
5
10
  import { builders, CAIP_NAMESPACE } from '@hub3js/evm';
6
11
  import * as commonBuilders from '@hub3js/std/builders';
7
12
  import { AccountId } from 'caip';
13
+ import { Contract, toBeHex } from 'ethers';
8
14
 
9
15
  import { ETHEREUM_CHAIN_ID, WALLET_ID } from '../constants.js';
10
16
  import { setDerivationPath } from '../state.js';
11
17
  import {
12
18
  getEthereumAccounts,
19
+ getEvmRpcProvider,
13
20
  standardizeAndThrowLedgerError,
14
21
  } from '../utils.js';
15
22
 
23
+ const ERC20_ALLOWANCE_ABI = [
24
+ 'function allowance(address owner, address spender) view returns (uint256)',
25
+ ];
26
+
16
27
  const connect = builders
17
28
  .connect()
18
29
  .action(async function (_context, _chain, options) {
@@ -50,10 +61,59 @@ const getChainId = builders
50
61
  .action(() => ETHEREUM_CHAIN_ID)
51
62
  .build();
52
63
 
64
+ /*
65
+ * Ledger injects no EIP-1193 provider, so these read actions talk to the shared
66
+ * JSON-RPC provider directly rather than through the default hub3js/evm actions.
67
+ */
68
+ const getAllowance = builders
69
+ .getAllowance()
70
+ .action(
71
+ async (
72
+ _context: Context<EvmActions>,
73
+ params: AllowanceParams
74
+ ): Promise<string> => {
75
+ const token = new Contract(
76
+ params.token,
77
+ ERC20_ALLOWANCE_ABI,
78
+ getEvmRpcProvider()
79
+ );
80
+ const currentAllowance: bigint = await token.allowance(
81
+ params.owner,
82
+ params.spender
83
+ );
84
+ return currentAllowance.toString();
85
+ }
86
+ )
87
+ .build();
88
+
89
+ const getTransactionReceipt = builders
90
+ .getTransactionReceipt()
91
+ .action(
92
+ async (
93
+ _context: Context<EvmActions>,
94
+ transactionHash: `0x${string}`
95
+ ): Promise<EvmTransactionReceipt | null> => {
96
+ const receipt = await getEvmRpcProvider().getTransactionReceipt(
97
+ transactionHash
98
+ );
99
+ if (!receipt) {
100
+ return null;
101
+ }
102
+ return {
103
+ status: receipt.status === 1 ? '0x1' : '0x0',
104
+ transactionHash: receipt.hash,
105
+ blockNumber: toBeHex(receipt.blockNumber),
106
+ };
107
+ }
108
+ )
109
+ .build();
110
+
53
111
  const evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)
54
112
  .action(connect)
55
113
  .action(disconnect)
56
114
  .action(getChainId)
115
+ .action(getAllowance)
116
+ .action(getTransactionReceipt)
57
117
  .build();
58
118
 
59
119
  export { evm };
@@ -1,4 +1,4 @@
1
- import type { TransactionLike } from 'ethers';
1
+ import type { FeeData, TransactionLike } from 'ethers';
2
2
  import type { GenericSigner } from 'rango-types';
3
3
  import type { EvmTransaction } from 'rango-types/mainApi';
4
4
 
@@ -13,6 +13,32 @@ import {
13
13
  transportDisconnect,
14
14
  } from '../utils.js';
15
15
 
16
+ /** Whether a transaction already prices itself under either scheme. */
17
+ function hasGasPricing(tx: EvmTransaction): boolean {
18
+ return !!tx.gasPrice || (!!tx.maxFeePerGas && !!tx.maxPriorityFeePerGas);
19
+ }
20
+
21
+ /**
22
+ * Picks one pricing scheme from what the node quotes. The two are mutually
23
+ * exclusive in a signed transaction, so EIP-1559 is used wherever the chain
24
+ * quotes it and a legacy price is the fallback.
25
+ */
26
+ function pricingFromFeeData(fees: FeeData) {
27
+ if (fees.maxFeePerGas && fees.maxPriorityFeePerGas) {
28
+ return {
29
+ gasPrice: null,
30
+ maxFeePerGas: fees.maxFeePerGas.toString(),
31
+ maxPriorityFeePerGas: fees.maxPriorityFeePerGas.toString(),
32
+ };
33
+ }
34
+
35
+ return {
36
+ gasPrice: fees.gasPrice?.toString() ?? null,
37
+ maxFeePerGas: null,
38
+ maxPriorityFeePerGas: null,
39
+ };
40
+ }
41
+
16
42
  export class EthereumSigner implements GenericSigner<EvmTransaction> {
17
43
  async signMessage(msg: string): Promise<string> {
18
44
  try {
@@ -45,16 +71,47 @@ export class EthereumSigner implements GenericSigner<EvmTransaction> {
45
71
 
46
72
  const transactionCount = await provider.getTransactionCount(fromAddress); // Get nonce
47
73
 
74
+ /*
75
+ * Ledger signs a raw transaction on-device and does not estimate gas, so
76
+ * a limit has to be present. Server-built transactions arrive with one;
77
+ * client-built ones - approve prerequisites among them - do not, so it is
78
+ * estimated here. Everything else is taken as the transaction sends it.
79
+ */
80
+ const gasLimit =
81
+ tx.gasLimit ??
82
+ (
83
+ await provider.estimateGas({
84
+ from: fromAddress,
85
+ to: tx.to,
86
+ data: tx.data ?? undefined,
87
+ value: tx.value ?? undefined,
88
+ })
89
+ ).toString();
90
+
91
+ /*
92
+ * Whatever pricing the transaction came with wins - a server-built one
93
+ * always carries it, and it is signed with exactly what it was created
94
+ * with. Only a client-built transaction, which leaves both schemes null,
95
+ * is priced from the node.
96
+ */
97
+ const pricing = hasGasPricing(tx)
98
+ ? {
99
+ gasPrice: tx.gasPrice,
100
+ maxFeePerGas: tx.maxFeePerGas,
101
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
102
+ }
103
+ : pricingFromFeeData(await provider.getFeeData());
104
+
48
105
  const transaction: TransactionLike<string> = {
49
106
  to: tx.to,
50
- gasPrice: tx.gasPrice,
51
- gasLimit: tx.gasLimit,
107
+ gasPrice: pricing.gasPrice,
108
+ gasLimit,
52
109
  nonce: transactionCount,
53
110
  chainId: chainId,
54
111
  data: tx.data,
55
112
  value: tx.value,
56
- maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
57
- maxFeePerGas: tx.maxFeePerGas,
113
+ maxPriorityFeePerGas: pricing.maxPriorityFeePerGas,
114
+ maxFeePerGas: pricing.maxFeePerGas,
58
115
  };
59
116
 
60
117
  const unsignedTx =
package/src/utils.ts CHANGED
@@ -3,13 +3,31 @@ import type Transport from '@ledgerhq/hw-transport';
3
3
  import { EVM_NAMESPACE, SOLANA_NAMESPACE } from '@hub3js/namespaces';
4
4
  import { CAIP_SOLANA_CHAIN_ID } from '@hub3js/solana';
5
5
  import { getAltStatusMessage } from '@ledgerhq/errors';
6
+ import { DEFAULT_ETHEREUM_RPC_URL } from '@rango-dev/signer-evm';
6
7
  import bs58 from 'bs58';
8
+ import { JsonRpcProvider } from 'ethers';
7
9
 
8
10
  import { ETHEREUM_CHAIN_ID, HEXADECIMAL_BASE } from './constants.js';
9
11
  import { getDerivationPath } from './state.js';
10
12
 
11
13
  export type Provider = Map<string, unknown>;
12
14
 
15
+ /**
16
+ * Ledger EVM is Ethereum-only today and has no injected provider, so a single
17
+ * JSON-RPC provider over the Ethereum endpoint serves both the signer (nonce +
18
+ * broadcast) and the read-only namespace actions (allowance, receipt).
19
+ *
20
+ * NOTE: If Ledger EVM support ever expands beyond Ethereum, this must select
21
+ * the RPC per chain instead of the single Ethereum endpoint.
22
+ */
23
+ let evmRpcProvider: JsonRpcProvider | undefined;
24
+ export function getEvmRpcProvider(): JsonRpcProvider {
25
+ if (!evmRpcProvider) {
26
+ evmRpcProvider = new JsonRpcProvider(DEFAULT_ETHEREUM_RPC_URL);
27
+ }
28
+ return evmRpcProvider;
29
+ }
30
+
13
31
  type DeviceAccounts = {
14
32
  accounts: string[];
15
33
  chainId: string;