@swapkit/wallets 3.0.0-beta.21 → 3.0.0-beta.23
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/{chunk-x5hgx9x9.js → chunk-0qaxr89s.js} +2 -2
- package/dist/{chunk-x5hgx9x9.js.map → chunk-0qaxr89s.js.map} +1 -1
- package/dist/chunk-bexr8da2.js +4 -0
- package/dist/chunk-bexr8da2.js.map +10 -0
- package/dist/chunk-dcj9twam.js +3 -0
- package/dist/chunk-dcj9twam.js.map +10 -0
- package/dist/{chunk-38ztynv0.js → chunk-qwd1kp32.js} +2 -2
- package/dist/{chunk-38ztynv0.js.map → chunk-qwd1kp32.js.map} +1 -1
- package/dist/chunk-sn6pgje5.js +3 -0
- package/dist/chunk-sn6pgje5.js.map +10 -0
- package/dist/chunk-wfattb4a.js +3 -0
- package/dist/chunk-wfattb4a.js.map +10 -0
- package/dist/{chunk-ebfkk1jn.js → chunk-zfnkndsr.js} +3 -3
- package/dist/{chunk-ebfkk1jn.js.map → chunk-zfnkndsr.js.map} +1 -1
- package/dist/src/bitget/index.js +2 -2
- package/dist/src/bitget/index.js.map +1 -1
- package/dist/src/coinbase/index.js +2 -2
- package/dist/src/coinbase/index.js.map +1 -1
- package/dist/src/cosmostation/index.js +2 -2
- package/dist/src/cosmostation/index.js.map +1 -1
- package/dist/src/ctrl/index.cjs +2 -2
- package/dist/src/ctrl/index.cjs.map +4 -4
- package/dist/src/ctrl/index.js +2 -2
- package/dist/src/ctrl/index.js.map +4 -4
- package/dist/src/evm-extensions/index.js +2 -2
- package/dist/src/evm-extensions/index.js.map +1 -1
- package/dist/src/exodus/index.js +2 -2
- package/dist/src/exodus/index.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/keepkey/index.js +2 -2
- package/dist/src/keepkey/index.js.map +1 -1
- package/dist/src/keepkey-bex/index.js +2 -2
- package/dist/src/keepkey-bex/index.js.map +1 -1
- package/dist/src/keplr/index.js +2 -2
- package/dist/src/keplr/index.js.map +1 -1
- package/dist/src/keystore/index.cjs +2 -2
- package/dist/src/keystore/index.cjs.map +3 -3
- package/dist/src/keystore/index.js +2 -2
- package/dist/src/keystore/index.js.map +3 -3
- package/dist/src/ledger/index.cjs +3 -3
- package/dist/src/ledger/index.cjs.map +7 -6
- package/dist/src/ledger/index.js +3 -3
- package/dist/src/ledger/index.js.map +7 -6
- package/dist/src/okx/index.cjs +2 -2
- package/dist/src/okx/index.cjs.map +4 -4
- package/dist/src/okx/index.js +2 -2
- package/dist/src/okx/index.js.map +4 -4
- package/dist/src/onekey/index.js +2 -2
- package/dist/src/onekey/index.js.map +1 -1
- package/dist/src/phantom/index.js +2 -2
- package/dist/src/phantom/index.js.map +2 -2
- package/dist/src/polkadotjs/index.js +2 -2
- package/dist/src/polkadotjs/index.js.map +1 -1
- package/dist/src/radix/index.js +2 -2
- package/dist/src/radix/index.js.map +1 -1
- package/dist/src/talisman/index.js +2 -2
- package/dist/src/talisman/index.js.map +1 -1
- package/dist/src/trezor/index.js +2 -2
- package/dist/src/trezor/index.js.map +1 -1
- package/dist/src/walletconnect/index.cjs +2 -2
- package/dist/src/walletconnect/index.cjs.map +5 -6
- package/dist/src/walletconnect/index.js +2 -2
- package/dist/src/walletconnect/index.js.map +5 -6
- package/package.json +5 -3
- package/src/ctrl/index.ts +83 -0
- package/src/ctrl/walletHelpers.ts +16 -0
- package/src/helpers/near-browser-provider.d.ts +286 -0
- package/src/helpers/near.ts +206 -0
- package/src/keystore/index.ts +1 -0
- package/src/ledger/clients/near.ts +86 -0
- package/src/ledger/helpers/getLedgerAddress.ts +5 -0
- package/src/ledger/helpers/getLedgerClient.ts +7 -0
- package/src/ledger/index.ts +10 -0
- package/src/okx/helpers.ts +16 -0
- package/src/okx/index.ts +1 -0
- package/src/types.ts +11 -0
- package/src/walletconnect/constants.ts +2 -0
- package/src/walletconnect/helpers.ts +9 -2
- package/src/walletconnect/index.ts +68 -0
- /package/dist/{chunk-k9q04afa.js → chunk-ad832c7c.js} +0 -0
- /package/dist/{chunk-k9q04afa.js.map → chunk-ad832c7c.js.map} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as U5,b as g,c as A,d as N,e as P,f as s,g as d,h as C,i as l,j as h,k as I,l as t,m as e,n as c,o as V5,p as z5,q as H,r as i,s as T,t as FL,u as a,v as n,w as L5,x as O5,y as j5,z as F5}from"../../chunk-bexr8da2.js";import{A as X5}from"../../chunk-zfnkndsr.js";import{C as Z,D as y}from"../../chunk-qwd1kp32.js";import{Chain as j,ChainId as D5,SKConfig as Q5,SwapKitError as G,WalletOption as m,createWallet as R5,filterSupportedChains as B5}from"@swapkit/helpers";import{SwapKitError as E,WalletOption as k5}from"@swapkit/helpers";import{AbstractSigner as u5}from"ethers";import{Chain as Q,SKConfig as b5}from"@swapkit/helpers";var W=(L,O)=>{return(O.find((V)=>V.startsWith(v(L)))||"")?.split(":")?.[2]||""},v=(L)=>{switch(L){case Q.Avalanche:return N;case Q.Base:return t;case Q.BinanceSmartChain:return A;case Q.Ethereum:return g;case Q.THORChain:return P;case Q.Arbitrum:return l;case Q.Optimism:return h;case Q.Polygon:return I;case Q.Maya:return C;case Q.Cosmos:return s;case Q.Kujira:return d;case Q.Near:{let{isStagenet:O}=b5.get("envs");return O?c:e}default:return""}};class S extends u5{address;chain;walletconnect;provider;constructor({chain:L,provider:O,walletconnect:F}){super(O);this.chain=L,this.walletconnect=F,this.provider=O,this.address=""}getAddress=async()=>{if(!this.walletconnect)throw new E("wallet_walletconnect_connection_not_established");if(!this.address)this.address=W(this.chain,this.walletconnect.accounts);return this.address};signMessage=async(L)=>{let O=await this.walletconnect?.client.request({chainId:v(this.chain),topic:this.walletconnect.session.topic,request:{method:"eth_sign",params:[L]}});return O.startsWith("0x")?O:`0x${O}`};signTransaction=()=>{throw new E("wallet_walletconnect_method_not_supported",{method:"signTransaction"})};signTypedData=()=>{throw new E("wallet_walletconnect_method_not_supported",{method:"signTypedData"})};sendTransaction=async({from:L,to:O,value:F,data:p})=>{let{toHexString:V}=await import("@swapkit/toolboxes/evm"),z={from:L,to:O,value:V(BigInt(F||0)),data:p};return await this.walletconnect?.client.request({chainId:v(this.chain),topic:this.walletconnect.session.topic,request:{method:"eth_sendTransaction",params:[z]}})};connect=(L)=>{if(!L)throw new E({errorKey:"wallet_provider_not_found",info:{wallet:k5.WALLETCONNECT,chain:this.chain}});return new S({chain:this.chain,walletconnect:this.walletconnect,provider:L})}}var o=async({chain:L,walletconnect:O,provider:F})=>new S({chain:L,walletconnect:O,provider:F});import{SwapKitError as p5}from"@swapkit/helpers";var W5=(L)=>{let O=[];for(let F of L){let[p]=F.split(":");if(p&&!O.includes(p))O.push(p)}return O},E5=(L)=>{switch(L){case"eip155":return Object.values(H);case"cosmos":return Object.values(T);case"solana":return Object.values(a);case"polkadot":return Object.values(L5);case"near":return Object.values(j5);default:throw new p5({errorKey:"wallet_walletconnect_namespace_not_supported",info:{namespace:L}})}},_5=(L)=>{switch(L){case"eip155":return Object.values(i);case"cosmos":return[];case"solana":return Object.values(n);case"polkadot":return Object.values(O5);case"near":return Object.values(F5);default:throw new p5({errorKey:"wallet_walletconnect_namespace_not_supported",info:{namespace:L}})}},f5=(L)=>{let O=W5(L);return Object.fromEntries(O.map((F)=>[F,{methods:E5(F),chains:L.filter((p)=>p.startsWith(F)),events:_5(F)}]))};var w5=R5({name:"connectWalletconnect",walletType:m.WALLETCONNECT,supportedChains:[j.Arbitrum,j.Avalanche,j.Base,j.BinanceSmartChain,j.Cosmos,j.Ethereum,j.Kujira,j.Maya,j.Near,j.Optimism,j.Polygon,j.THORChain],connect:({addChain:L,supportedChains:O,walletType:F})=>async function p(V,z){let f=B5({chains:V,supportedChains:O,walletType:F}),{walletConnectProjectId:X}=Q5.get("apiKeys");if(!X)throw new G("wallet_walletconnect_project_id_not_specified");let U=await S5(f,X,z);if(!U)throw new G("wallet_walletconnect_connection_not_established");let{session:$,accounts:Y}=U;return await Promise.all(f.map(async(q)=>{let r=W(q,Y),_=await H5({session:$,address:r,chain:q,walletconnect:U});L({..._,address:r,chain:q,disconnect:U.disconnect,walletType:m.WALLETCONNECT})})),!0}}),n5=X5(w5);async function H5({chain:L,walletconnect:O,address:F,session:p}){switch(L){case j.Arbitrum:case j.Avalanche:case j.Base:case j.BinanceSmartChain:case j.Ethereum:case j.Optimism:case j.Polygon:{let{getProvider:V,getEvmToolbox:z}=await import("@swapkit/toolboxes/evm"),f=await V(L),X=await o({walletconnect:O,chain:L,provider:f});return await z(L,{provider:f,signer:X})}case j.THORChain:{let{SignMode:V}=await import("cosmjs-types/cosmos/tx/signing/v1beta1/signing.js"),{TxRaw:z}=await import("cosmjs-types/cosmos/tx/v1beta1/tx.js"),{encodePubkey:f,makeAuthInfoBytes:X}=(await import("@cosmjs/proto-signing")).default,{makeSignDoc:U}=(await import("@cosmjs/amino")).default,{getCosmosToolbox:$,buildAminoMsg:Y,buildEncodedTxBody:q,createStargateClient:r,fromBase64:_,getDefaultChainFee:Z5,parseAminoMessageForDirectSigning:y5}=await import("@swapkit/toolboxes/cosmos"),D=await $(j.THORChain);async function G5(J){let k=await D.getAccount(J);if(L!==j.THORChain)return k;let[{address:K,algo:B,pubkey:u}]=await O?.client.request({chainId:P,topic:p.topic,request:{method:"cosmos_getAccounts",params:{}}});return{...k,address:K,pubkey:{type:B,value:u}}}let R=Z5(L),J5=(J)=>O?.client.request({chainId:P,topic:p.topic,request:{method:"cosmos_signAmino",params:{signerAddress:F,signDoc:J}}});async function x({assetValue:J,memo:b,...k}){let K=await D.getAccount(F);if(!K)throw new G({errorKey:"wallet_missing_params",info:{account:K}});if(!K.pubkey)throw new G({errorKey:"wallet_missing_params",info:{account:K,pubkey:K?.pubkey}});let{accountNumber:B,sequence:u=0}=K,M=[Y({assetValue:J,memo:b,sender:F,...k})],K5=D5.THORChain,$5=U(M,R,K5,b,B?.toString(),u?.toString()||"0"),w=await J5($5),q5=await q({chain:j.THORChain,msgs:M.map(y5),memo:b||""}),v5=f(K.pubkey),Y5=X([{pubkey:v5,sequence:u}],R.amount,Number.parseInt(R.gas),void 0,void 0,V.SIGN_MODE_LEGACY_AMINO_JSON),r5=z.fromPartial({bodyBytes:q5,authInfoBytes:Y5,signatures:[_(typeof w.signature==="string"?w.signature:w.signature.signature)]}),P5=z.encode(r5).finish();return(await(await r(Q5.get("rpcUrls")[j.THORChain])).broadcastTx(P5)).transactionHash}return{...D,transfer:(J)=>x(J),deposit:(J)=>x(J),getAccount:G5}}case j.Near:{let{getNearToolbox:V}=await import("@swapkit/toolboxes/near"),{DEFAULT_NEAR_METHODS:z}=await import("../../chunk-bexr8da2.js");return await V({signer:{getPublicKey(){return Promise.reject(new G("wallet_walletconnect_method_not_supported",{method:"getPublicKey"}))},signNep413Message(U,$,Y,q,r){return Promise.reject(new G("wallet_walletconnect_method_not_supported",{method:"signNep413Message"}))},async signTransaction(U){if(!O)throw new G("wallet_walletconnect_connection_not_established");let $=await O.client.request({topic:p.topic,chainId:v(j.Near),request:{method:z.NEAR_SIGN_AND_SEND_TRANSACTION,params:{transaction:U}}});return[new Uint8Array(32),$]},signDelegateAction(U){return Promise.reject(new G("wallet_walletconnect_method_not_supported",{method:"signDelegateAction"}))},getAddress(){return Promise.resolve(F)}}})}default:throw new G({errorKey:"wallet_chain_not_supported",info:{chain:L,wallet:m.WALLETCONNECT}})}}async function S5(L,O,F){let p;try{if(!O)throw new G("wallet_walletconnect_project_id_not_specified");let V=f5(L.map(v)),{WalletConnectModalSign:z}=await import("@walletconnect/modal-sign-html"),f=new z({logger:V5,relayUrl:U5,projectId:O,metadata:F?.metadata||z5,...F?.core}),X=await f.getSession();if(X)await f.disconnect({topic:X.topic,reason:{code:0,message:"Resetting session"}});let U=await f.connect({requiredNamespaces:V}),$=Object.values(U.namespaces).flatMap((q)=>q.accounts);return{session:U,accounts:$,client:f,disconnect:async()=>{await f.disconnect({topic:U.topic,reason:{code:0,message:"User disconnected"}})}}}catch(V){}finally{if(p)p.closeModal()}return}export{w5 as walletconnectWallet,n5 as WC_SUPPORTED_CHAINS,P as THORCHAIN_MAINNET_ID,I as POLYGON_MAINNET_ID,h as OPTIMISM_MAINNET_ID,c as NEAR_TESTNET_ID,e as NEAR_MAINNET_ID,C as MAYACHAIN_MAINNET_ID,d as KUJIRA_MAINNET_ID,g as ETHEREUM_MAINNET_ID,a as DEFAULT_SOLANA_METHODS,n as DEFAULT_SOLANA_EVENTS,U5 as DEFAULT_RELAY_URL,L5 as DEFAULT_POLKADOT_METHODS,O5 as DEFAULT_POLKADOT_EVENTS,j5 as DEFAULT_NEAR_METHODS,F5 as DEFAULT_NEAR_EVENTS,V5 as DEFAULT_LOGGER,i as DEFAULT_EIP_155_EVENTS,H as DEFAULT_EIP155_METHODS,T as DEFAULT_COSMOS_METHODS,FL as DEFAULT_COSMOS_EVENTS,z5 as DEFAULT_APP_METADATA,s as COSMOS_HUB_MAINNET_ID,A as BSC_MAINNET_ID,t as BASE_MAINNET_ID,N as AVALANCHE_MAINNET_ID,l as ARBITRUM_ONE_MAINNET_ID};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=2E19DE3633C3931E64756E2164756E21
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/walletconnect/index.ts", "../src/walletconnect/
|
|
3
|
+
"sources": ["../src/walletconnect/index.ts", "../src/walletconnect/evmSigner.ts", "../src/walletconnect/helpers.ts", "../src/walletconnect/namespaces.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { StdSignDoc } from \"@cosmjs/amino\";\nimport {\n Chain,\n ChainId,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n WalletOption,\n createWallet,\n filterSupportedChains,\n} from \"@swapkit/helpers\";\nimport type { ThorchainDepositParams, createThorchainToolbox } from \"@swapkit/toolboxes/cosmos\";\nimport type { WalletConnectModalSign } from \"@walletconnect/modal-sign-html\";\nimport type { SessionTypes, SignClientTypes } from \"@walletconnect/types\";\n\nimport { getWalletSupportedChains } from \"../utils\";\nimport {\n DEFAULT_APP_METADATA,\n DEFAULT_COSMOS_METHODS,\n DEFAULT_LOGGER,\n DEFAULT_RELAY_URL,\n THORCHAIN_MAINNET_ID,\n} from \"./constants\";\nimport { getEVMSigner } from \"./evmSigner\";\nimport { chainToChainId, getAddressByChain } from \"./helpers\";\nimport { getRequiredNamespaces } from \"./namespaces\";\n\nexport * from \"./constants\";\nexport * from \"./types\";\n\nexport const walletconnectWallet = createWallet({\n name: \"connectWalletconnect\",\n walletType: WalletOption.WALLETCONNECT,\n supportedChains: [\n Chain.Arbitrum,\n Chain.Avalanche,\n Chain.Base,\n Chain.BinanceSmartChain,\n Chain.Cosmos,\n Chain.Ethereum,\n Chain.Kujira,\n Chain.Maya,\n Chain.Optimism,\n Chain.Polygon,\n Chain.THORChain,\n ],\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectWalletconnect(\n chains: Chain[],\n walletconnectOptions?: SignClientTypes.Options,\n ) {\n const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });\n const { walletConnectProjectId } = SKConfig.get(\"apiKeys\");\n\n if (!walletConnectProjectId) {\n throw new SwapKitError(\"wallet_walletconnect_project_id_not_specified\");\n }\n\n const walletconnect = await getWalletconnect(\n filteredChains,\n walletConnectProjectId,\n walletconnectOptions,\n );\n\n if (!walletconnect) {\n throw new SwapKitError(\"wallet_walletconnect_connection_not_established\");\n }\n\n const { session, accounts } = walletconnect;\n\n await Promise.all(\n filteredChains.map(async (chain) => {\n const address = getAddressByChain(chain, accounts);\n const toolbox = await getToolbox({ session, address, chain, walletconnect });\n\n addChain({\n ...toolbox,\n address,\n chain,\n disconnect: walletconnect.disconnect,\n walletType: WalletOption.WALLETCONNECT,\n });\n }),\n );\n\n return true;\n },\n});\n\nexport const WC_SUPPORTED_CHAINS = getWalletSupportedChains(walletconnectWallet);\nexport type Walletconnect = Awaited<ReturnType<typeof getWalletconnect>>;\n\nasync function getToolbox<T extends (typeof WC_SUPPORTED_CHAINS)[number]>({\n chain,\n walletconnect,\n address,\n session,\n}: {\n walletconnect: Walletconnect;\n session: SessionTypes.Struct;\n chain: T;\n address: string;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Optimism:\n case Chain.Polygon: {\n const { getProvider, getEvmToolbox } = await import(\"@swapkit/toolboxes/evm\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ walletconnect, chain, provider });\n const toolbox = await getEvmToolbox(chain, { provider, signer });\n\n return toolbox;\n }\n\n case Chain.THORChain: {\n const { SignMode } = await import(\"cosmjs-types/cosmos/tx/signing/v1beta1/signing.js\");\n const { TxRaw } = await import(\"cosmjs-types/cosmos/tx/v1beta1/tx.js\");\n const { encodePubkey, makeAuthInfoBytes } = (await import(\"@cosmjs/proto-signing\")).default;\n const { makeSignDoc } = (await import(\"@cosmjs/amino\")).default;\n const {\n getCosmosToolbox,\n buildAminoMsg,\n buildEncodedTxBody,\n createStargateClient,\n fromBase64,\n getDefaultChainFee,\n parseAminoMessageForDirectSigning,\n } = await import(\"@swapkit/toolboxes/cosmos\");\n const toolbox = await getCosmosToolbox(Chain.THORChain);\n\n async function getAccount(accountAddress: string) {\n const cosmosToolbox = toolbox;\n const account = await (\n cosmosToolbox as Awaited<ReturnType<typeof createThorchainToolbox>>\n ).getAccount(accountAddress);\n\n if (chain !== Chain.THORChain) {\n return account;\n }\n\n const [{ address, algo, pubkey }] = (await walletconnect?.client.request({\n chainId: THORCHAIN_MAINNET_ID,\n topic: session.topic,\n request: {\n method: DEFAULT_COSMOS_METHODS.COSMOS_GET_ACCOUNTS,\n params: {},\n },\n })) as [{ address: string; algo: string; pubkey: string }];\n\n return { ...account, address, pubkey: { type: algo, value: pubkey } };\n }\n\n const fee = getDefaultChainFee(chain);\n\n const signRequest = (signDoc: StdSignDoc) =>\n walletconnect?.client.request({\n chainId: THORCHAIN_MAINNET_ID,\n topic: session.topic,\n request: {\n method: DEFAULT_COSMOS_METHODS.COSMOS_SIGN_AMINO,\n params: { signerAddress: address, signDoc },\n },\n });\n\n async function thorchainTransfer({\n assetValue,\n memo,\n ...rest\n }: GenericTransferParams | ThorchainDepositParams) {\n const account = await toolbox.getAccount(address);\n if (!account) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { account } });\n }\n\n if (!account.pubkey) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { account, pubkey: account?.pubkey },\n });\n }\n\n const { accountNumber, sequence = 0 } = account;\n\n const msgs = [buildAminoMsg({ assetValue, memo, sender: address, ...rest })];\n\n const chainId = ChainId.THORChain;\n\n const signDoc = makeSignDoc(\n msgs,\n fee,\n chainId,\n memo,\n accountNumber?.toString(),\n sequence?.toString() || \"0\",\n );\n\n const signature: any = await signRequest(signDoc);\n\n const bodyBytes = await buildEncodedTxBody({\n chain: Chain.THORChain,\n msgs: msgs.map(parseAminoMessageForDirectSigning),\n memo: memo || \"\",\n });\n const pubkey = encodePubkey(account.pubkey);\n const authInfoBytes = makeAuthInfoBytes(\n [{ pubkey, sequence }],\n fee.amount,\n Number.parseInt(fee.gas),\n undefined,\n undefined,\n SignMode.SIGN_MODE_LEGACY_AMINO_JSON,\n );\n\n const txRaw = TxRaw.fromPartial({\n bodyBytes,\n authInfoBytes,\n signatures: [\n fromBase64(\n typeof signature.signature === \"string\"\n ? signature.signature\n : signature.signature.signature,\n ),\n ],\n });\n const txBytes = TxRaw.encode(txRaw).finish();\n\n const broadcaster = await createStargateClient(SKConfig.get(\"rpcUrls\")[Chain.THORChain]);\n const result = await broadcaster.broadcastTx(txBytes);\n return result.transactionHash;\n }\n\n return {\n ...toolbox,\n transfer: (params: GenericTransferParams) => thorchainTransfer(params),\n deposit: (params: ThorchainDepositParams) => thorchainTransfer(params),\n getAccount,\n };\n }\n default:\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.WALLETCONNECT },\n });\n }\n}\n\nasync function getWalletconnect(\n chains: Chain[],\n walletConnectProjectId?: string,\n walletconnectOptions?: SignClientTypes.Options,\n) {\n let modal: WalletConnectModalSign | undefined;\n try {\n if (!walletConnectProjectId) {\n throw new SwapKitError(\"wallet_walletconnect_project_id_not_specified\");\n }\n const requiredNamespaces = getRequiredNamespaces(chains.map(chainToChainId));\n\n const { WalletConnectModalSign } = await import(\"@walletconnect/modal-sign-html\");\n\n const client = new WalletConnectModalSign({\n logger: DEFAULT_LOGGER,\n relayUrl: DEFAULT_RELAY_URL,\n projectId: walletConnectProjectId,\n metadata: walletconnectOptions?.metadata || DEFAULT_APP_METADATA,\n ...walletconnectOptions?.core,\n });\n\n const oldSession = await client.getSession();\n\n // disconnect old Session cause we can't handle using it with current ui\n if (oldSession) {\n await client.disconnect({\n topic: oldSession.topic,\n reason: { code: 0, message: \"Resetting session\" },\n });\n }\n\n const session = await client.connect({ requiredNamespaces });\n\n const accounts = Object.values(session.namespaces).flatMap(\n (namespace: any) => namespace.accounts,\n );\n\n const disconnect = async () => {\n await client.disconnect({\n topic: session.topic,\n reason: { code: 0, message: \"User disconnected\" },\n });\n };\n\n return { session, accounts, client, disconnect };\n } catch (_e) {\n // Errors are handled by returning undefined\n } finally {\n if (modal) {\n // @ts-expect-error wrong typing\n modal.closeModal();\n }\n }\n return undefined;\n}\n",
|
|
6
|
-
"import type { ClientMetadata } from \"./types\";\n\nexport const DEFAULT_RELAY_URL = \"wss://relay.walletconnect.com\";\n\nexport const ETHEREUM_MAINNET_ID = \"eip155:1\";\nexport const BSC_MAINNET_ID = \"eip155:56\";\nexport const AVALANCHE_MAINNET_ID = \"eip155:43114\";\nexport const THORCHAIN_MAINNET_ID = \"cosmos:thorchain\";\nexport const COSMOS_HUB_MAINNET_ID = \"cosmos:cosmoshub-4\";\nexport const KUJIRA_MAINNET_ID = \"cosmos:kaiyo-1\";\nexport const MAYACHAIN_MAINNET_ID = \"cosmos:mayachain-mainnet-v1\";\nexport const ARBITRUM_ONE_MAINNET_ID = \"eip155:42161\";\nexport const OPTIMISM_MAINNET_ID = \"eip155:10\";\nexport const POLYGON_MAINNET_ID = \"eip155:137\";\nexport const BASE_MAINNET_ID = \"eip155:8453\";\n\nexport const DEFAULT_LOGGER = \"debug\";\n\nexport const DEFAULT_APP_METADATA: ClientMetadata = {\n name: \"THORSwap\",\n description: \"THORSwap multi-chain dex aggregator powered by THORChain\",\n url: \"https://app.thorswap.finance/\",\n icons: [\"https://static.thorswap.net/logo.png\"],\n};\n\n/**\n * EIP155\n */\nexport enum DEFAULT_EIP155_METHODS {\n ETH_SEND_TRANSACTION = \"eth_sendTransaction\",\n // not supported by most WC wallets\n // ETH_SIGN_TRANSACTION = 'eth_signTransaction',\n ETH_SIGN = \"eth_sign\",\n PERSONAL_SIGN = \"personal_sign\",\n ETH_SIGN_TYPED_DATA = \"eth_signTypedData\",\n}\n\nexport enum DEFAULT_EIP_155_EVENTS {\n ETH_CHAIN_CHANGED = \"chainChanged\",\n ETH_ACCOUNTS_CHANGED = \"accountsChanged\",\n}\n\n/**\n * COSMOS\n */\nexport enum DEFAULT_COSMOS_METHODS {\n COSMOS_SIGN_DIRECT = \"cosmos_signDirect\",\n COSMOS_SIGN_AMINO = \"cosmos_signAmino\",\n COSMOS_GET_ACCOUNTS = \"cosmos_getAccounts\",\n}\n\nexport enum DEFAULT_COSMOS_EVENTS {}\n\n/**\n * SOLANA\n */\nexport enum DEFAULT_SOLANA_METHODS {\n SOL_SIGN_TRANSACTION = \"solana_signTransaction\",\n SOL_SIGN_MESSAGE = \"solana_signMessage\",\n}\n\nexport enum DEFAULT_SOLANA_EVENTS {}\n\n/**\n * POLKADOT\n */\nexport enum DEFAULT_POLKADOT_METHODS {\n POLKADOT_SIGN_TRANSACTION = \"polkadot_signTransaction\",\n POLKADOT_SIGN_MESSAGE = \"polkadot_signMessage\",\n}\n\nexport enum DEFAULT_POLKADOT_EVENTS {}\n\n/**\n * NEAR\n */\nexport enum DEFAULT_NEAR_METHODS {\n NEAR_SIGN_IN = \"near_signIn\",\n NEAR_SIGN_OUT = \"near_signOut\",\n NEAR_GET_ACCOUNTS = \"near_getAccounts\",\n NEAR_SIGN_AND_SEND_TRANSACTION = \"near_signAndSendTransaction\",\n NEAR_SIGN_AND_SEND_TRANSACTIONS = \"near_signAndSendTransactions\",\n}\n\nexport enum DEFAULT_NEAR_EVENTS {}\n",
|
|
5
|
+
"import type { StdSignDoc } from \"@cosmjs/amino\";\nimport {\n Chain,\n ChainId,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n WalletOption,\n createWallet,\n filterSupportedChains,\n} from \"@swapkit/helpers\";\nimport type { ThorchainDepositParams, createThorchainToolbox } from \"@swapkit/toolboxes/cosmos\";\nimport type { NearSigner } from \"@swapkit/toolboxes/near\";\nimport type { WalletConnectModalSign } from \"@walletconnect/modal-sign-html\";\nimport type { SessionTypes, SignClientTypes } from \"@walletconnect/types\";\nimport type { Transaction } from \"near-api-js/lib/transaction\";\n\nimport { getWalletSupportedChains } from \"../utils\";\nimport {\n DEFAULT_APP_METADATA,\n DEFAULT_COSMOS_METHODS,\n DEFAULT_LOGGER,\n DEFAULT_RELAY_URL,\n THORCHAIN_MAINNET_ID,\n} from \"./constants\";\nimport { getEVMSigner } from \"./evmSigner\";\nimport { chainToChainId, getAddressByChain } from \"./helpers\";\nimport { getRequiredNamespaces } from \"./namespaces\";\n\nexport * from \"./constants\";\nexport * from \"./types\";\n\nexport const walletconnectWallet = createWallet({\n name: \"connectWalletconnect\",\n walletType: WalletOption.WALLETCONNECT,\n supportedChains: [\n Chain.Arbitrum,\n Chain.Avalanche,\n Chain.Base,\n Chain.BinanceSmartChain,\n Chain.Cosmos,\n Chain.Ethereum,\n Chain.Kujira,\n Chain.Maya,\n Chain.Near,\n Chain.Optimism,\n Chain.Polygon,\n Chain.THORChain,\n ],\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectWalletconnect(\n chains: Chain[],\n walletconnectOptions?: SignClientTypes.Options,\n ) {\n const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });\n const { walletConnectProjectId } = SKConfig.get(\"apiKeys\");\n\n if (!walletConnectProjectId) {\n throw new SwapKitError(\"wallet_walletconnect_project_id_not_specified\");\n }\n\n const walletconnect = await getWalletconnect(\n filteredChains,\n walletConnectProjectId,\n walletconnectOptions,\n );\n\n if (!walletconnect) {\n throw new SwapKitError(\"wallet_walletconnect_connection_not_established\");\n }\n\n const { session, accounts } = walletconnect;\n\n await Promise.all(\n filteredChains.map(async (chain) => {\n const address = getAddressByChain(chain, accounts);\n const toolbox = await getToolbox({ session, address, chain, walletconnect });\n\n addChain({\n ...toolbox,\n address,\n chain,\n disconnect: walletconnect.disconnect,\n walletType: WalletOption.WALLETCONNECT,\n });\n }),\n );\n\n return true;\n },\n});\n\nexport const WC_SUPPORTED_CHAINS = getWalletSupportedChains(walletconnectWallet);\nexport type Walletconnect = Awaited<ReturnType<typeof getWalletconnect>>;\n\nasync function getToolbox<T extends (typeof WC_SUPPORTED_CHAINS)[number]>({\n chain,\n walletconnect,\n address,\n session,\n}: {\n walletconnect: Walletconnect;\n session: SessionTypes.Struct;\n chain: T;\n address: string;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Optimism:\n case Chain.Polygon: {\n const { getProvider, getEvmToolbox } = await import(\"@swapkit/toolboxes/evm\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ walletconnect, chain, provider });\n const toolbox = await getEvmToolbox(chain, { provider, signer });\n\n return toolbox;\n }\n\n case Chain.THORChain: {\n const { SignMode } = await import(\"cosmjs-types/cosmos/tx/signing/v1beta1/signing.js\");\n const { TxRaw } = await import(\"cosmjs-types/cosmos/tx/v1beta1/tx.js\");\n const { encodePubkey, makeAuthInfoBytes } = (await import(\"@cosmjs/proto-signing\")).default;\n const { makeSignDoc } = (await import(\"@cosmjs/amino\")).default;\n const {\n getCosmosToolbox,\n buildAminoMsg,\n buildEncodedTxBody,\n createStargateClient,\n fromBase64,\n getDefaultChainFee,\n parseAminoMessageForDirectSigning,\n } = await import(\"@swapkit/toolboxes/cosmos\");\n const toolbox = await getCosmosToolbox(Chain.THORChain);\n\n async function getAccount(accountAddress: string) {\n const cosmosToolbox = toolbox;\n const account = await (\n cosmosToolbox as Awaited<ReturnType<typeof createThorchainToolbox>>\n ).getAccount(accountAddress);\n\n if (chain !== Chain.THORChain) {\n return account;\n }\n\n const [{ address, algo, pubkey }] = (await walletconnect?.client.request({\n chainId: THORCHAIN_MAINNET_ID,\n topic: session.topic,\n request: {\n method: DEFAULT_COSMOS_METHODS.COSMOS_GET_ACCOUNTS,\n params: {},\n },\n })) as [{ address: string; algo: string; pubkey: string }];\n\n return { ...account, address, pubkey: { type: algo, value: pubkey } };\n }\n\n const fee = getDefaultChainFee(chain);\n\n const signRequest = (signDoc: StdSignDoc) =>\n walletconnect?.client.request({\n chainId: THORCHAIN_MAINNET_ID,\n topic: session.topic,\n request: {\n method: DEFAULT_COSMOS_METHODS.COSMOS_SIGN_AMINO,\n params: { signerAddress: address, signDoc },\n },\n });\n\n async function thorchainTransfer({\n assetValue,\n memo,\n ...rest\n }: GenericTransferParams | ThorchainDepositParams) {\n const account = await toolbox.getAccount(address);\n if (!account) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { account } });\n }\n\n if (!account.pubkey) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { account, pubkey: account?.pubkey },\n });\n }\n\n const { accountNumber, sequence = 0 } = account;\n\n const msgs = [buildAminoMsg({ assetValue, memo, sender: address, ...rest })];\n\n const chainId = ChainId.THORChain;\n\n const signDoc = makeSignDoc(\n msgs,\n fee,\n chainId,\n memo,\n accountNumber?.toString(),\n sequence?.toString() || \"0\",\n );\n\n const signature: any = await signRequest(signDoc);\n\n const bodyBytes = await buildEncodedTxBody({\n chain: Chain.THORChain,\n msgs: msgs.map(parseAminoMessageForDirectSigning),\n memo: memo || \"\",\n });\n const pubkey = encodePubkey(account.pubkey);\n const authInfoBytes = makeAuthInfoBytes(\n [{ pubkey, sequence }],\n fee.amount,\n Number.parseInt(fee.gas),\n undefined,\n undefined,\n SignMode.SIGN_MODE_LEGACY_AMINO_JSON,\n );\n\n const txRaw = TxRaw.fromPartial({\n bodyBytes,\n authInfoBytes,\n signatures: [\n fromBase64(\n typeof signature.signature === \"string\"\n ? signature.signature\n : signature.signature.signature,\n ),\n ],\n });\n const txBytes = TxRaw.encode(txRaw).finish();\n\n const broadcaster = await createStargateClient(SKConfig.get(\"rpcUrls\")[Chain.THORChain]);\n const result = await broadcaster.broadcastTx(txBytes);\n return result.transactionHash;\n }\n\n return {\n ...toolbox,\n transfer: (params: GenericTransferParams) => thorchainTransfer(params),\n deposit: (params: ThorchainDepositParams) => thorchainTransfer(params),\n getAccount,\n };\n }\n\n case Chain.Near: {\n const { getNearToolbox } = await import(\"@swapkit/toolboxes/near\");\n const { DEFAULT_NEAR_METHODS } = await import(\"./constants\");\n\n // Create a NEAR signer that uses WalletConnect\n const signer = {\n getPublicKey() {\n // WalletConnect NEAR doesn't expose public key directly\n return Promise.reject(\n new SwapKitError(\"wallet_walletconnect_method_not_supported\", {\n method: \"getPublicKey\",\n }),\n );\n },\n\n signNep413Message(\n _message: string,\n _accountId: string,\n _recipient: string,\n _nonce: Uint8Array,\n _callbackUrl?: string,\n ) {\n // WalletConnect NEAR spec doesn't include NEP-413 message signing\n return Promise.reject(\n new SwapKitError(\"wallet_walletconnect_method_not_supported\", {\n method: \"signNep413Message\",\n }),\n );\n },\n\n async signTransaction(transaction: Transaction) {\n if (!walletconnect) {\n throw new SwapKitError(\"wallet_walletconnect_connection_not_established\");\n }\n // WalletConnect signs and sends in one operation\n const result = await walletconnect.client.request({\n topic: session.topic,\n chainId: chainToChainId(Chain.Near),\n request: {\n method: DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTION,\n params: { transaction },\n },\n });\n // Return dummy hash and result\n return [new Uint8Array(32), result];\n },\n\n signDelegateAction(_delegateAction: any) {\n return Promise.reject(\n new SwapKitError(\"wallet_walletconnect_method_not_supported\", {\n method: \"signDelegateAction\",\n }),\n );\n },\n\n getAddress() {\n return Promise.resolve(address);\n },\n } as NearSigner;\n\n const toolbox = await getNearToolbox({ signer });\n return toolbox;\n }\n\n default:\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.WALLETCONNECT },\n });\n }\n}\n\nasync function getWalletconnect(\n chains: Chain[],\n walletConnectProjectId?: string,\n walletconnectOptions?: SignClientTypes.Options,\n) {\n let modal: WalletConnectModalSign | undefined;\n try {\n if (!walletConnectProjectId) {\n throw new SwapKitError(\"wallet_walletconnect_project_id_not_specified\");\n }\n const requiredNamespaces = getRequiredNamespaces(chains.map(chainToChainId));\n\n const { WalletConnectModalSign } = await import(\"@walletconnect/modal-sign-html\");\n\n const client = new WalletConnectModalSign({\n logger: DEFAULT_LOGGER,\n relayUrl: DEFAULT_RELAY_URL,\n projectId: walletConnectProjectId,\n metadata: walletconnectOptions?.metadata || DEFAULT_APP_METADATA,\n ...walletconnectOptions?.core,\n });\n\n const oldSession = await client.getSession();\n\n // disconnect old Session cause we can't handle using it with current ui\n if (oldSession) {\n await client.disconnect({\n topic: oldSession.topic,\n reason: { code: 0, message: \"Resetting session\" },\n });\n }\n\n const session = await client.connect({ requiredNamespaces });\n\n const accounts = Object.values(session.namespaces).flatMap(\n (namespace: any) => namespace.accounts,\n );\n\n const disconnect = async () => {\n await client.disconnect({\n topic: session.topic,\n reason: { code: 0, message: \"User disconnected\" },\n });\n };\n\n return { session, accounts, client, disconnect };\n } catch (_e) {\n // Errors are handled by returning undefined\n } finally {\n if (modal) {\n // @ts-expect-error wrong typing\n modal.closeModal();\n }\n }\n return undefined;\n}\n",
|
|
7
6
|
"import { type EVMChain, SwapKitError, WalletOption } from \"@swapkit/helpers\";\nimport type { JsonRpcProvider, Provider, TransactionRequest, TransactionResponse } from \"ethers\";\nimport { AbstractSigner } from \"ethers\";\n\nimport { DEFAULT_EIP155_METHODS } from \"./constants\";\nimport { chainToChainId, getAddressByChain } from \"./helpers\";\nimport type { Walletconnect } from \"./index\";\n\ninterface WalletconnectEVMSignerParams {\n chain: EVMChain;\n walletconnect: Walletconnect;\n provider: Provider | JsonRpcProvider;\n}\n\nclass WalletconnectSigner extends AbstractSigner {\n address: string;\n\n private chain: EVMChain;\n private walletconnect: Walletconnect;\n readonly provider: Provider | JsonRpcProvider;\n\n constructor({ chain, provider, walletconnect }: WalletconnectEVMSignerParams) {\n super(provider);\n this.chain = chain;\n this.walletconnect = walletconnect;\n this.provider = provider;\n this.address = \"\";\n }\n\n // biome-ignore lint/suspicious/useAwait: fulfil implementation type\n getAddress = async () => {\n if (!this.walletconnect) {\n throw new SwapKitError(\"wallet_walletconnect_connection_not_established\");\n }\n if (!this.address) {\n this.address = getAddressByChain(this.chain, this.walletconnect.accounts);\n }\n\n return this.address;\n };\n\n signMessage = async (message: string) => {\n // this is probably broken\n const txHash = (await this.walletconnect?.client.request({\n chainId: chainToChainId(this.chain),\n topic: this.walletconnect.session.topic,\n request: {\n method: DEFAULT_EIP155_METHODS.ETH_SIGN,\n params: [message],\n },\n })) as string;\n\n return txHash.startsWith(\"0x\") ? txHash : `0x${txHash}`;\n };\n\n signTransaction = () => {\n throw new SwapKitError(\"wallet_walletconnect_method_not_supported\", {\n method: \"signTransaction\",\n });\n\n // const baseTx = {\n // from,\n // to,\n // value: BigNumber.from(value || 0).toHexString(),\n // data,\n // };\n\n // const txHash = (await this.walletconnect?.client.request({\n // chainId: chainToChainId(this.chain),\n // topic: this.walletconnect.session.topic,\n // request: {\n // method: DEFAULT_EIP155_METHODS.ETH_SIGN_TRANSACTION,\n // params: [baseTx],\n // },\n // })) as string;\n\n // return txHash.startsWith('0x') ? txHash : `0x${txHash}`;\n };\n\n // ANCHOR (@Towan) - Implement in future\n signTypedData = () => {\n throw new SwapKitError(\"wallet_walletconnect_method_not_supported\", {\n method: \"signTypedData\",\n });\n\n // const { toHexString } = await import('@swapkit/toolboxes/evm');\n\n // const baseTx = {\n // from,\n // to,\n // value: toHexString(value || 0n),\n // data,\n // };\n\n // const txHash = (await this.walletconnect?.client.request({\n // chainId: chainToChainId(this.chain),\n // topic: this.walletconnect.session.topic,\n // request: {\n // method: DEFAULT_EIP155_METHODS.ETH_SIGN_TYPED_DATA,\n // params: [baseTx],\n // },\n // })) as string;\n\n // return txHash.startsWith('0x') ? txHash : `0x${txHash}`;\n };\n\n sendTransaction = async ({ from, to, value, data }: TransactionRequest) => {\n const { toHexString } = await import(\"@swapkit/toolboxes/evm\");\n\n const baseTx = {\n from,\n to,\n value: toHexString(BigInt(value || 0)),\n data,\n };\n const response = await this.walletconnect?.client.request({\n chainId: chainToChainId(this.chain),\n topic: this.walletconnect.session.topic,\n request: {\n method: DEFAULT_EIP155_METHODS.ETH_SEND_TRANSACTION,\n params: [baseTx],\n },\n });\n\n return response as TransactionResponse;\n };\n\n connect = (provider: Provider | null) => {\n if (!provider) {\n throw new SwapKitError({\n errorKey: \"wallet_provider_not_found\",\n info: { wallet: WalletOption.WALLETCONNECT, chain: this.chain },\n });\n }\n\n return new WalletconnectSigner({\n chain: this.chain,\n walletconnect: this.walletconnect,\n provider,\n });\n };\n}\nexport const getEVMSigner = async ({\n chain,\n walletconnect,\n provider,\n}: WalletconnectEVMSignerParams) => new WalletconnectSigner({ chain, walletconnect, provider });\n",
|
|
8
|
-
"import { Chain, type EVMChain } from \"@swapkit/helpers\";\n\nimport {\n ARBITRUM_ONE_MAINNET_ID,\n AVALANCHE_MAINNET_ID,\n BASE_MAINNET_ID,\n BSC_MAINNET_ID,\n COSMOS_HUB_MAINNET_ID,\n ETHEREUM_MAINNET_ID,\n KUJIRA_MAINNET_ID,\n MAYACHAIN_MAINNET_ID,\n OPTIMISM_MAINNET_ID,\n POLYGON_MAINNET_ID,\n THORCHAIN_MAINNET_ID,\n} from \"./constants\";\n\nexport const getAddressByChain = (\n chain: EVMChain | Chain.THORChain | Chain.Maya | Chain.Kujira | Chain.Cosmos,\n accounts: string[],\n) => {\n const account = accounts.find((account) => account.startsWith(chainToChainId(chain))) || \"\";\n const address = account?.split(\":\")?.[2];\n\n return address || \"\";\n};\n\nexport const chainToChainId = (chain: Chain) => {\n switch (chain) {\n case Chain.Avalanche:\n return AVALANCHE_MAINNET_ID;\n case Chain.Base:\n return BASE_MAINNET_ID;\n case Chain.BinanceSmartChain:\n return BSC_MAINNET_ID;\n case Chain.Ethereum:\n return ETHEREUM_MAINNET_ID;\n case Chain.THORChain:\n return THORCHAIN_MAINNET_ID;\n case Chain.Arbitrum:\n return ARBITRUM_ONE_MAINNET_ID;\n case Chain.Optimism:\n return OPTIMISM_MAINNET_ID;\n case Chain.Polygon:\n return POLYGON_MAINNET_ID;\n case Chain.Maya:\n return MAYACHAIN_MAINNET_ID;\n case Chain.Cosmos:\n return COSMOS_HUB_MAINNET_ID;\n case Chain.Kujira:\n return KUJIRA_MAINNET_ID;\n default:\n return \"\";\n }\n};\n",
|
|
7
|
+
"import { Chain, type EVMChain, SKConfig } from \"@swapkit/helpers\";\n\nimport {\n ARBITRUM_ONE_MAINNET_ID,\n AVALANCHE_MAINNET_ID,\n BASE_MAINNET_ID,\n BSC_MAINNET_ID,\n COSMOS_HUB_MAINNET_ID,\n ETHEREUM_MAINNET_ID,\n KUJIRA_MAINNET_ID,\n MAYACHAIN_MAINNET_ID,\n NEAR_MAINNET_ID,\n NEAR_TESTNET_ID,\n OPTIMISM_MAINNET_ID,\n POLYGON_MAINNET_ID,\n THORCHAIN_MAINNET_ID,\n} from \"./constants\";\n\nexport const getAddressByChain = (\n chain: EVMChain | Chain.THORChain | Chain.Maya | Chain.Kujira | Chain.Cosmos | Chain.Near,\n accounts: string[],\n) => {\n const account = accounts.find((account) => account.startsWith(chainToChainId(chain))) || \"\";\n const address = account?.split(\":\")?.[2];\n\n return address || \"\";\n};\n\nexport const chainToChainId = (chain: Chain) => {\n switch (chain) {\n case Chain.Avalanche:\n return AVALANCHE_MAINNET_ID;\n case Chain.Base:\n return BASE_MAINNET_ID;\n case Chain.BinanceSmartChain:\n return BSC_MAINNET_ID;\n case Chain.Ethereum:\n return ETHEREUM_MAINNET_ID;\n case Chain.THORChain:\n return THORCHAIN_MAINNET_ID;\n case Chain.Arbitrum:\n return ARBITRUM_ONE_MAINNET_ID;\n case Chain.Optimism:\n return OPTIMISM_MAINNET_ID;\n case Chain.Polygon:\n return POLYGON_MAINNET_ID;\n case Chain.Maya:\n return MAYACHAIN_MAINNET_ID;\n case Chain.Cosmos:\n return COSMOS_HUB_MAINNET_ID;\n case Chain.Kujira:\n return KUJIRA_MAINNET_ID;\n case Chain.Near: {\n // Use testnet if stagenet is enabled\n const { isStagenet } = SKConfig.get(\"envs\");\n return isStagenet ? NEAR_TESTNET_ID : NEAR_MAINNET_ID;\n }\n default:\n return \"\";\n }\n};\n",
|
|
9
8
|
"import type { ProposalTypes } from \"@walletconnect/types\";\n\nimport { SwapKitError } from \"@swapkit/helpers\";\nimport {\n DEFAULT_COSMOS_METHODS,\n DEFAULT_EIP155_METHODS,\n DEFAULT_EIP_155_EVENTS,\n DEFAULT_NEAR_EVENTS,\n DEFAULT_NEAR_METHODS,\n DEFAULT_POLKADOT_EVENTS,\n DEFAULT_POLKADOT_METHODS,\n DEFAULT_SOLANA_EVENTS,\n DEFAULT_SOLANA_METHODS,\n} from \"./constants\";\n\nexport const getNamespacesFromChains = (chains: string[]) => {\n const supportedNamespaces: string[] = [];\n for (const chainId of chains) {\n const [namespace] = chainId.split(\":\");\n if (namespace && !supportedNamespaces.includes(namespace)) {\n supportedNamespaces.push(namespace);\n }\n }\n\n return supportedNamespaces;\n};\n\nexport const getSupportedMethodsByNamespace = (namespace: string) => {\n switch (namespace) {\n case \"eip155\":\n return Object.values(DEFAULT_EIP155_METHODS);\n case \"cosmos\":\n return Object.values(DEFAULT_COSMOS_METHODS);\n case \"solana\":\n return Object.values(DEFAULT_SOLANA_METHODS);\n case \"polkadot\":\n return Object.values(DEFAULT_POLKADOT_METHODS);\n case \"near\":\n return Object.values(DEFAULT_NEAR_METHODS);\n default:\n throw new SwapKitError({\n errorKey: \"wallet_walletconnect_namespace_not_supported\",\n info: { namespace },\n });\n }\n};\n\nexport const getSupportedEventsByNamespace = (namespace: string) => {\n switch (namespace) {\n case \"eip155\":\n return Object.values(DEFAULT_EIP_155_EVENTS);\n case \"cosmos\":\n return [];\n case \"solana\":\n return Object.values(DEFAULT_SOLANA_EVENTS);\n case \"polkadot\":\n return Object.values(DEFAULT_POLKADOT_EVENTS);\n case \"near\":\n return Object.values(DEFAULT_NEAR_EVENTS);\n default:\n throw new SwapKitError({\n errorKey: \"wallet_walletconnect_namespace_not_supported\",\n info: { namespace },\n });\n }\n};\n\nexport const getRequiredNamespaces = (chains: string[]): ProposalTypes.RequiredNamespaces => {\n const selectedNamespaces = getNamespacesFromChains(chains);\n\n return Object.fromEntries(\n selectedNamespaces.map((namespace) => [\n namespace,\n {\n methods: getSupportedMethodsByNamespace(namespace),\n chains: chains.filter((chain) => chain.startsWith(namespace)),\n events: getSupportedEventsByNamespace(namespace) as any[],\n },\n ]),\n );\n};\n"
|
|
10
9
|
],
|
|
11
|
-
"mappings": "
|
|
12
|
-
"debugId": "
|
|
10
|
+
"mappings": "uUACA,cACE,WACA,eAEA,mBACA,kBACA,kBACA,4BACA,0BCTF,uBAAwB,kBAAc,0BAEtC,yBAAS,gBCFT,gBAAS,cAAsB,0BAkBxB,IAAM,EAAoB,CAC/B,EACA,IACG,CAIH,OAHgB,EAAS,KAAK,CAAC,IAAY,EAAQ,WAAW,EAAe,CAAK,CAAC,CAAC,GAAK,KAChE,MAAM,GAAG,IAAI,IAEpB,IAGP,EAAiB,CAAC,IAAiB,CAC9C,OAAQ,QACD,EAAM,UACT,OAAO,OACJ,EAAM,KACT,OAAO,OACJ,EAAM,kBACT,OAAO,OACJ,EAAM,SACT,OAAO,OACJ,EAAM,UACT,OAAO,OACJ,EAAM,SACT,OAAO,OACJ,EAAM,SACT,OAAO,OACJ,EAAM,QACT,OAAO,OACJ,EAAM,KACT,OAAO,OACJ,EAAM,OACT,OAAO,OACJ,EAAM,OACT,OAAO,OACJ,EAAM,KAAM,CAEf,IAAQ,cAAe,GAAS,IAAI,MAAM,EAC1C,OAAO,EAAa,EAAkB,CACxC,SAEE,MAAO,KD5Cb,MAAM,UAA4B,EAAe,CAC/C,QAEQ,MACA,cACC,SAET,WAAW,EAAG,QAAO,WAAU,iBAA+C,CAC5E,MAAM,CAAQ,EACd,KAAK,MAAQ,EACb,KAAK,cAAgB,EACrB,KAAK,SAAW,EAChB,KAAK,QAAU,GAIjB,WAAa,SAAY,CACvB,IAAK,KAAK,cACR,MAAM,IAAI,EAAa,iDAAiD,EAE1E,IAAK,KAAK,QACR,KAAK,QAAU,EAAkB,KAAK,MAAO,KAAK,cAAc,QAAQ,EAG1E,OAAO,KAAK,SAGd,YAAc,MAAO,IAAoB,CAEvC,IAAM,EAAU,MAAM,KAAK,eAAe,OAAO,QAAQ,CACvD,QAAS,EAAe,KAAK,KAAK,EAClC,MAAO,KAAK,cAAc,QAAQ,MAClC,QAAS,CACP,kBACA,OAAQ,CAAC,CAAO,CAClB,CACF,CAAC,EAED,OAAO,EAAO,WAAW,IAAI,EAAI,EAAS,KAAK,KAGjD,gBAAkB,IAAM,CACtB,MAAM,IAAI,EAAa,4CAA6C,CAClE,OAAQ,iBACV,CAAC,GAsBH,cAAgB,IAAM,CACpB,MAAM,IAAI,EAAa,4CAA6C,CAClE,OAAQ,eACV,CAAC,GAuBH,gBAAkB,OAAS,OAAM,KAAI,QAAO,UAA+B,CACzE,IAAQ,eAAgB,KAAa,kCAE/B,EAAS,CACb,OACA,KACA,MAAO,EAAY,OAAO,GAAS,CAAC,CAAC,EACrC,MACF,EAUA,OATiB,MAAM,KAAK,eAAe,OAAO,QAAQ,CACxD,QAAS,EAAe,KAAK,KAAK,EAClC,MAAO,KAAK,cAAc,QAAQ,MAClC,QAAS,CACP,6BACA,OAAQ,CAAC,CAAM,CACjB,CACF,CAAC,GAKH,QAAU,CAAC,IAA8B,CACvC,IAAK,EACH,MAAM,IAAI,EAAa,CACrB,SAAU,4BACV,KAAM,CAAE,OAAQ,GAAa,cAAe,MAAO,KAAK,KAAM,CAChE,CAAC,EAGH,OAAO,IAAI,EAAoB,CAC7B,MAAO,KAAK,MACZ,cAAe,KAAK,cACpB,UACF,CAAC,EAEL,CACO,IAAM,EAAe,OAC1B,QACA,gBACA,cACkC,IAAI,EAAoB,CAAE,QAAO,gBAAe,UAAS,CAAC,EEhJ9F,uBAAS,0BAaF,IAAM,GAA0B,CAAC,IAAqB,CAC3D,IAAM,EAAgC,CAAC,EACvC,QAAW,KAAW,EAAQ,CAC5B,IAAO,GAAa,EAAQ,MAAM,GAAG,EACrC,GAAI,IAAc,EAAoB,SAAS,CAAS,EACtD,EAAoB,KAAK,CAAS,EAItC,OAAO,GAGI,GAAiC,CAAC,IAAsB,CACnE,OAAQ,OACD,SACH,OAAO,OAAO,OAAO,CAAsB,MACxC,SACH,OAAO,OAAO,OAAO,CAAsB,MACxC,SACH,OAAO,OAAO,OAAO,CAAsB,MACxC,WACH,OAAO,OAAO,OAAO,EAAwB,MAC1C,OACH,OAAO,OAAO,OAAO,EAAoB,UAEzC,MAAM,IAAI,GAAa,CACrB,SAAU,+CACV,KAAM,CAAE,WAAU,CACpB,CAAC,IAIM,GAAgC,CAAC,IAAsB,CAClE,OAAQ,OACD,SACH,OAAO,OAAO,OAAO,CAAsB,MACxC,SACH,MAAO,CAAC,MACL,SACH,OAAO,OAAO,OAAO,CAAqB,MACvC,WACH,OAAO,OAAO,OAAO,EAAuB,MACzC,OACH,OAAO,OAAO,OAAO,EAAmB,UAExC,MAAM,IAAI,GAAa,CACrB,SAAU,+CACV,KAAM,CAAE,WAAU,CACpB,CAAC,IAIM,GAAwB,CAAC,IAAuD,CAC3F,IAAM,EAAqB,GAAwB,CAAM,EAEzD,OAAO,OAAO,YACZ,EAAmB,IAAI,CAAC,IAAc,CACpC,EACA,CACE,QAAS,GAA+B,CAAS,EACjD,OAAQ,EAAO,OAAO,CAAC,IAAU,EAAM,WAAW,CAAS,CAAC,EAC5D,OAAQ,GAA8B,CAAS,CACjD,CACF,CAAC,CACH,GH/CK,IAAM,GAAsB,GAAa,CAC9C,KAAM,uBACN,WAAY,EAAa,cACzB,gBAAiB,CACf,EAAM,SACN,EAAM,UACN,EAAM,KACN,EAAM,kBACN,EAAM,OACN,EAAM,SACN,EAAM,OACN,EAAM,KACN,EAAM,KACN,EAAM,SACN,EAAM,QACN,EAAM,SACR,EACA,QAAS,EAAG,WAAU,kBAAiB,gBACrC,eAAe,CAAoB,CACjC,EACA,EACA,CACA,IAAM,EAAiB,GAAsB,CAAE,SAAQ,kBAAiB,YAAW,CAAC,GAC5E,0BAA2B,GAAS,IAAI,SAAS,EAEzD,IAAK,EACH,MAAM,IAAI,EAAa,+CAA+C,EAGxE,IAAM,EAAgB,MAAM,GAC1B,EACA,EACA,CACF,EAEA,IAAK,EACH,MAAM,IAAI,EAAa,iDAAiD,EAG1E,IAAQ,UAAS,YAAa,EAiB9B,OAfA,MAAM,QAAQ,IACZ,EAAe,IAAI,MAAO,IAAU,CAClC,IAAM,EAAU,EAAkB,EAAO,CAAQ,EAC3C,EAAU,MAAM,GAAW,CAAE,UAAS,UAAS,QAAO,eAAc,CAAC,EAE3E,EAAS,IACJ,EACH,UACA,QACA,WAAY,EAAc,WAC1B,WAAY,EAAa,aAC3B,CAAC,EACF,CACH,EAEO,GAEb,CAAC,EAEY,GAAsB,GAAyB,EAAmB,EAG/E,eAAe,EAA0D,EACvE,QACA,gBACA,UACA,WAMC,CACD,OAAQ,QACD,EAAM,cACN,EAAM,eACN,EAAM,UACN,EAAM,uBACN,EAAM,cACN,EAAM,cACN,EAAM,QAAS,CAClB,IAAQ,cAAa,iBAAkB,KAAa,kCAE9C,EAAW,MAAM,EAAY,CAAK,EAClC,EAAS,MAAM,EAAa,CAAE,gBAAe,QAAO,UAAS,CAAC,EAGpE,OAFgB,MAAM,EAAc,EAAO,CAAE,WAAU,QAAO,CAAC,CAGjE,MAEK,EAAM,UAAW,CACpB,IAAQ,YAAa,KAAa,8DAC1B,SAAU,KAAa,iDACvB,eAAc,sBAAuB,KAAa,kCAA0B,SAC5E,gBAAiB,KAAa,0BAAkB,SAEtD,mBACA,gBACA,qBACA,uBACA,aACA,sBACA,sCACE,KAAa,qCACX,EAAU,MAAM,EAAiB,EAAM,SAAS,EAEtD,eAAe,EAAU,CAAC,EAAwB,CAEhD,IAAM,EAAU,MADM,EAGpB,WAAW,CAAc,EAE3B,GAAI,IAAU,EAAM,UAClB,OAAO,EAGT,KAAS,UAAS,OAAM,WAAa,MAAM,GAAe,OAAO,QAAQ,CACvE,QAAS,EACT,MAAO,EAAQ,MACf,QAAS,CACP,4BACA,OAAQ,CAAC,CACX,CACF,CAAC,EAED,MAAO,IAAK,EAAS,UAAS,OAAQ,CAAE,KAAM,EAAM,MAAO,CAAO,CAAE,EAGtE,IAAM,EAAM,GAAmB,CAAK,EAE9B,GAAc,CAAC,IACnB,GAAe,OAAO,QAAQ,CAC5B,QAAS,EACT,MAAO,EAAQ,MACf,QAAS,CACP,0BACA,OAAQ,CAAE,cAAe,EAAS,SAAQ,CAC5C,CACF,CAAC,EAEH,eAAe,CAAiB,EAC9B,aACA,UACG,GAC8C,CACjD,IAAM,EAAU,MAAM,EAAQ,WAAW,CAAO,EAChD,IAAK,EACH,MAAM,IAAI,EAAa,CAAE,SAAU,wBAAyB,KAAM,CAAE,SAAQ,CAAE,CAAC,EAGjF,IAAK,EAAQ,OACX,MAAM,IAAI,EAAa,CACrB,SAAU,wBACV,KAAM,CAAE,UAAS,OAAQ,GAAS,MAAO,CAC3C,CAAC,EAGH,IAAQ,gBAAe,WAAW,GAAM,EAElC,EAAO,CAAC,EAAc,CAAE,aAAY,OAAM,OAAQ,KAAY,CAAK,CAAC,CAAC,EAErE,GAAU,GAAQ,UAElB,GAAU,EACd,EACA,EACA,GACA,EACA,GAAe,SAAS,EACxB,GAAU,SAAS,GAAK,GAC1B,EAEM,EAAiB,MAAM,GAAY,EAAO,EAE1C,GAAY,MAAM,EAAmB,CACzC,MAAO,EAAM,UACb,KAAM,EAAK,IAAI,EAAiC,EAChD,KAAM,GAAQ,EAChB,CAAC,EACK,GAAS,EAAa,EAAQ,MAAM,EACpC,GAAgB,EACpB,CAAC,CAAE,UAAQ,UAAS,CAAC,EACrB,EAAI,OACJ,OAAO,SAAS,EAAI,GAAG,EACvB,OACA,OACA,EAAS,2BACX,EAEM,GAAQ,EAAM,YAAY,CAC9B,aACA,iBACA,WAAY,CACV,EACE,OAAO,EAAU,YAAc,SAC3B,EAAU,UACV,EAAU,UAAU,SAC1B,CACF,CACF,CAAC,EACK,GAAU,EAAM,OAAO,EAAK,EAAE,OAAO,EAI3C,OADe,MADK,MAAM,EAAqB,GAAS,IAAI,SAAS,EAAE,EAAM,UAAU,GACtD,YAAY,EAAO,GACtC,gBAGhB,MAAO,IACF,EACH,SAAU,CAAC,IAAkC,EAAkB,CAAM,EACrE,QAAS,CAAC,IAAmC,EAAkB,CAAM,EACrE,aACF,CACF,MAEK,EAAM,KAAM,CACf,IAAQ,kBAAmB,KAAa,oCAChC,wBAAyB,KAAa,mCA2D9C,OADgB,MAAM,EAAe,CAAE,OAvDxB,CACb,YAAY,EAAG,CAEb,OAAO,QAAQ,OACb,IAAI,EAAa,4CAA6C,CAC5D,OAAQ,cACV,CAAC,CACH,GAGF,iBAAiB,CACf,EACA,EACA,EACA,EACA,EACA,CAEA,OAAO,QAAQ,OACb,IAAI,EAAa,4CAA6C,CAC5D,OAAQ,mBACV,CAAC,CACH,QAGI,gBAAe,CAAC,EAA0B,CAC9C,IAAK,EACH,MAAM,IAAI,EAAa,iDAAiD,EAG1E,IAAM,EAAS,MAAM,EAAc,OAAO,QAAQ,CAChD,MAAO,EAAQ,MACf,QAAS,EAAe,EAAM,IAAI,EAClC,QAAS,CACP,OAAQ,EAAqB,+BAC7B,OAAQ,CAAE,aAAY,CACxB,CACF,CAAC,EAED,MAAO,CAAC,IAAI,WAAW,EAAE,EAAG,CAAM,GAGpC,kBAAkB,CAAC,EAAsB,CACvC,OAAO,QAAQ,OACb,IAAI,EAAa,4CAA6C,CAC5D,OAAQ,oBACV,CAAC,CACH,GAGF,UAAU,EAAG,CACX,OAAO,QAAQ,QAAQ,CAAO,EAElC,CAE8C,CAAC,CAEjD,SAGE,MAAM,IAAI,EAAa,CACrB,SAAU,6BACV,KAAM,CAAE,QAAO,OAAQ,EAAa,aAAc,CACpD,CAAC,GAIP,eAAe,EAAgB,CAC7B,EACA,EACA,EACA,CACA,IAAI,EACJ,GAAI,CACF,IAAK,EACH,MAAM,IAAI,EAAa,+CAA+C,EAExE,IAAM,EAAqB,GAAsB,EAAO,IAAI,CAAc,CAAC,GAEnE,0BAA2B,KAAa,0CAE1C,EAAS,IAAI,EAAuB,CACxC,OAAQ,GACR,SAAU,GACV,UAAW,EACX,SAAU,GAAsB,UAAY,MACzC,GAAsB,IAC3B,CAAC,EAEK,EAAa,MAAM,EAAO,WAAW,EAG3C,GAAI,EACF,MAAM,EAAO,WAAW,CACtB,MAAO,EAAW,MAClB,OAAQ,CAAE,KAAM,EAAG,QAAS,mBAAoB,CAClD,CAAC,EAGH,IAAM,EAAU,MAAM,EAAO,QAAQ,CAAE,oBAAmB,CAAC,EAErD,EAAW,OAAO,OAAO,EAAQ,UAAU,EAAE,QACjD,CAAC,IAAmB,EAAU,QAChC,EASA,MAAO,CAAE,UAAS,WAAU,SAAQ,WAPjB,SAAY,CAC7B,MAAM,EAAO,WAAW,CACtB,MAAO,EAAQ,MACf,OAAQ,CAAE,KAAM,EAAG,QAAS,mBAAoB,CAClD,CAAC,EAG4C,EAC/C,MAAO,EAAI,SAEX,CACA,GAAI,EAEF,EAAM,WAAW,EAGrB",
|
|
11
|
+
"debugId": "2E19DE3633C3931E64756E2164756E21",
|
|
13
12
|
"names": []
|
|
14
13
|
}
|
package/package.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"@ledgerhq/hw-app-btc": "10.9.2",
|
|
12
12
|
"@ledgerhq/hw-app-cosmos": "6.32.2",
|
|
13
13
|
"@ledgerhq/hw-app-eth": "6.45.6",
|
|
14
|
+
"@ledgerhq/hw-app-near": "6.31.2",
|
|
14
15
|
"@ledgerhq/hw-app-xrp": "6.31.2",
|
|
15
16
|
"@ledgerhq/hw-transport": "6.31.6",
|
|
16
17
|
"@ledgerhq/hw-transport-webusb": "6.29.6",
|
|
@@ -22,13 +23,14 @@
|
|
|
22
23
|
"@scure/base": "1.2.6",
|
|
23
24
|
"@scure/bip39": "1.6.0",
|
|
24
25
|
"@solana/web3.js": "1.98.2",
|
|
25
|
-
"@swapkit/helpers": "3.0.0-beta.
|
|
26
|
-
"@swapkit/toolboxes": "1.0.0-beta.
|
|
26
|
+
"@swapkit/helpers": "3.0.0-beta.15",
|
|
27
|
+
"@swapkit/toolboxes": "1.0.0-beta.20",
|
|
27
28
|
"@trezor/connect-web": "9.6.0",
|
|
28
29
|
"@walletconnect/modal-sign-html": "2.7.0",
|
|
29
30
|
"bitcoinjs-lib": "6.1.7",
|
|
30
31
|
"blakejs": "1.2.1",
|
|
31
32
|
"cosmjs-types": "0.9.0",
|
|
33
|
+
"near-api-js": "^6.1.0",
|
|
32
34
|
"ripple-binary-codec": "2.4.0",
|
|
33
35
|
"sats-connect": "3.5.0",
|
|
34
36
|
"ts-pattern": "5.7.1"
|
|
@@ -159,5 +161,5 @@
|
|
|
159
161
|
"type-check:go": "tsgo"
|
|
160
162
|
},
|
|
161
163
|
"type": "module",
|
|
162
|
-
"version": "3.0.0-beta.
|
|
164
|
+
"version": "3.0.0-beta.23"
|
|
163
165
|
}
|
package/src/ctrl/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
filterSupportedChains,
|
|
9
9
|
} from "@swapkit/helpers";
|
|
10
10
|
|
|
11
|
+
import type { NearCreateTransactionParams } from "@swapkit/toolboxes/near";
|
|
11
12
|
import { getWalletSupportedChains } from "../utils";
|
|
12
13
|
import { getCtrlAddress, getCtrlMethods, getCtrlProvider, walletTransfer } from "./walletHelpers";
|
|
13
14
|
|
|
@@ -27,6 +28,7 @@ export const ctrlWallet = createWallet({
|
|
|
27
28
|
Chain.Kujira,
|
|
28
29
|
Chain.Litecoin,
|
|
29
30
|
Chain.Maya,
|
|
31
|
+
Chain.Near,
|
|
30
32
|
Chain.Optimism,
|
|
31
33
|
Chain.Polygon,
|
|
32
34
|
Chain.Solana,
|
|
@@ -153,6 +155,87 @@ async function getWalletMethods(chain: (typeof CTRL_SUPPORTED_CHAINS)[number]) {
|
|
|
153
155
|
});
|
|
154
156
|
}
|
|
155
157
|
|
|
158
|
+
case Chain.Near: {
|
|
159
|
+
if (!window.xfi?.near) {
|
|
160
|
+
throw new SwapKitError("wallet_ctrl_not_found", { chain: Chain.Near });
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const { createNearSignerFromProvider } = await import("../helpers/near");
|
|
164
|
+
const { getNearToolbox } = await import("@swapkit/toolboxes/near");
|
|
165
|
+
|
|
166
|
+
const provider = window.xfi.near;
|
|
167
|
+
const signer = await createNearSignerFromProvider(provider, "CTRL");
|
|
168
|
+
const accountId = await signer.getAddress();
|
|
169
|
+
const toolbox = await getNearToolbox({ signer });
|
|
170
|
+
|
|
171
|
+
// Override transfer method to use CTRL's direct API
|
|
172
|
+
const transfer = async (params: GenericTransferParams) => {
|
|
173
|
+
const { transfer: transferAction } = await import("near-api-js/lib/transaction");
|
|
174
|
+
|
|
175
|
+
// Convert AssetValue to NEAR amount (yoctoNEAR)
|
|
176
|
+
const amountInYocto = params.assetValue.getBaseValue("string");
|
|
177
|
+
|
|
178
|
+
// Create transfer action
|
|
179
|
+
const action = transferAction(BigInt(amountInYocto));
|
|
180
|
+
|
|
181
|
+
// Create transaction object for CTRL
|
|
182
|
+
const transaction = {
|
|
183
|
+
signerId: accountId,
|
|
184
|
+
receiverId: params.recipient,
|
|
185
|
+
actions: [action],
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const txHash: string = await provider.request({
|
|
189
|
+
method: "signAndSendTransaction",
|
|
190
|
+
params: {
|
|
191
|
+
transaction,
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
return txHash;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Override createTransaction to build NEAR transactions for CTRL
|
|
199
|
+
const createTransaction = async (params: NearCreateTransactionParams) => {
|
|
200
|
+
const { functionCall, transfer: transferAction } = await import(
|
|
201
|
+
"near-api-js/lib/transaction"
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
if (params.functionCall) {
|
|
205
|
+
// Function call transaction
|
|
206
|
+
const { methodName, args, attachedDeposit } = params.functionCall;
|
|
207
|
+
const action = functionCall(
|
|
208
|
+
methodName,
|
|
209
|
+
args,
|
|
210
|
+
BigInt("30000000000000"), // 30 TGas default
|
|
211
|
+
BigInt(attachedDeposit || "0"),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
signerId: accountId,
|
|
216
|
+
receiverId: params.recipient,
|
|
217
|
+
actions: [action],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Simple transfer transaction
|
|
222
|
+
const amountInYocto = params.assetValue.getBaseValue("string");
|
|
223
|
+
const action = transferAction(BigInt(amountInYocto));
|
|
224
|
+
|
|
225
|
+
return {
|
|
226
|
+
signerId: accountId,
|
|
227
|
+
receiverId: params.recipient,
|
|
228
|
+
actions: [action],
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
...toolbox,
|
|
234
|
+
transfer,
|
|
235
|
+
createTransaction,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
156
239
|
default:
|
|
157
240
|
return null;
|
|
158
241
|
}
|
|
@@ -92,6 +92,7 @@ async function transaction({
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>
|
|
95
96
|
export async function getCtrlAddress(chain: Chain) {
|
|
96
97
|
try {
|
|
97
98
|
const eipProvider = (await getCtrlProvider(chain)) as Eip1193Provider;
|
|
@@ -146,6 +147,21 @@ export async function getCtrlAddress(chain: Chain) {
|
|
|
146
147
|
return accounts.publicKey.toString();
|
|
147
148
|
}
|
|
148
149
|
|
|
150
|
+
if (chain === Chain.Near) {
|
|
151
|
+
if (!window.xfi?.near) {
|
|
152
|
+
throw new SwapKitError("wallet_ctrl_not_found", { chain: Chain.Near });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (!window.xfi.near.isSignedIn?.()) {
|
|
156
|
+
const result = await window.xfi.near.request<string[]>?.({
|
|
157
|
+
method: "connect",
|
|
158
|
+
});
|
|
159
|
+
return result?.[0] || "";
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return window.xfi.near.getAccountId?.() || "";
|
|
163
|
+
}
|
|
164
|
+
|
|
149
165
|
const accounts = await eipProvider.request({ method: "request_accounts", params: [] });
|
|
150
166
|
return accounts[0];
|
|
151
167
|
} catch (_error) {
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEAR Browser Wallet Provider Interface Definitions
|
|
3
|
+
*
|
|
4
|
+
* This file contains the standard TypeScript interface definitions for NEAR browser wallet providers
|
|
5
|
+
* that inject themselves into the window object (e.g., OKX, XDEFI/CTRL, etc.)
|
|
6
|
+
*
|
|
7
|
+
* Based on:
|
|
8
|
+
* - NEAR Protocol wallet-selector library
|
|
9
|
+
* - Common patterns from OKX, XDEFI/CTRL, and other NEAR wallet implementations
|
|
10
|
+
* - NEAR API JS types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { PublicKey } from "near-api-js/lib/utils";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transaction action types supported by NEAR
|
|
17
|
+
*/
|
|
18
|
+
export interface NearAction {
|
|
19
|
+
type: "FunctionCall" | "Transfer" | "Stake" | "AddKey" | "DeleteKey" | "DeleteAccount";
|
|
20
|
+
params?: {
|
|
21
|
+
methodName?: string;
|
|
22
|
+
args?: object;
|
|
23
|
+
gas?: string;
|
|
24
|
+
deposit?: string;
|
|
25
|
+
publicKey?: string;
|
|
26
|
+
beneficiaryId?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Transaction structure for NEAR
|
|
32
|
+
*/
|
|
33
|
+
export interface NearTransaction {
|
|
34
|
+
receiverId: string;
|
|
35
|
+
actions: NearAction[];
|
|
36
|
+
// Optional fields
|
|
37
|
+
signerId?: string;
|
|
38
|
+
publicKey?: string;
|
|
39
|
+
nonce?: number;
|
|
40
|
+
recentBlockHash?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Message signing parameters
|
|
45
|
+
*/
|
|
46
|
+
export interface NearSignMessageParams {
|
|
47
|
+
message: string;
|
|
48
|
+
recipient: string;
|
|
49
|
+
nonce: Buffer | Uint8Array;
|
|
50
|
+
callbackUrl?: string;
|
|
51
|
+
state?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Signed message response
|
|
56
|
+
*/
|
|
57
|
+
export interface NearSignedMessage {
|
|
58
|
+
accountId: string;
|
|
59
|
+
publicKey: string;
|
|
60
|
+
signature: string;
|
|
61
|
+
// Optional callback data
|
|
62
|
+
callbackUrl?: string;
|
|
63
|
+
state?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Sign-in request parameters
|
|
68
|
+
*/
|
|
69
|
+
export interface NearSignInParams {
|
|
70
|
+
contractId?: string;
|
|
71
|
+
methodNames?: string[];
|
|
72
|
+
// Success and failure URLs for browser wallets
|
|
73
|
+
successUrl?: string;
|
|
74
|
+
failureUrl?: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Account information
|
|
79
|
+
*/
|
|
80
|
+
export interface NearAccount {
|
|
81
|
+
accountId: string;
|
|
82
|
+
publicKey?: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Access key information
|
|
87
|
+
*/
|
|
88
|
+
export interface NearAccessKey {
|
|
89
|
+
publicKey: PublicKey;
|
|
90
|
+
accessKey: {
|
|
91
|
+
nonce: number;
|
|
92
|
+
permission:
|
|
93
|
+
| "FullAccess"
|
|
94
|
+
| {
|
|
95
|
+
FunctionCall: {
|
|
96
|
+
allowance?: string;
|
|
97
|
+
receiverId: string;
|
|
98
|
+
methodNames: string[];
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Transaction execution result
|
|
106
|
+
*/
|
|
107
|
+
export interface NearFinalExecutionOutcome {
|
|
108
|
+
status: object;
|
|
109
|
+
transaction: object;
|
|
110
|
+
transaction_outcome: object;
|
|
111
|
+
receipts_outcome: object[];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Standard NEAR browser wallet provider interface
|
|
116
|
+
*
|
|
117
|
+
* This interface represents the common API surface that NEAR browser wallets
|
|
118
|
+
* expose when they inject themselves into the window object.
|
|
119
|
+
*/
|
|
120
|
+
export interface NearBrowserWalletProvider {
|
|
121
|
+
// Connection Management
|
|
122
|
+
/**
|
|
123
|
+
* Request connection to the wallet
|
|
124
|
+
* Returns array of account IDs that were connected
|
|
125
|
+
*/
|
|
126
|
+
connect(): Promise<string[]>;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Alternative connection method used by some wallets
|
|
130
|
+
*/
|
|
131
|
+
request?(params: { method: "connect"; params?: any }): Promise<string[]>;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Disconnect from the wallet
|
|
135
|
+
*/
|
|
136
|
+
disconnect(): Promise<void>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Sign out from the wallet (some wallets use this instead of disconnect)
|
|
140
|
+
*/
|
|
141
|
+
signOut?(): void;
|
|
142
|
+
|
|
143
|
+
// Account Management
|
|
144
|
+
/**
|
|
145
|
+
* Check if user is signed in
|
|
146
|
+
*/
|
|
147
|
+
isSignedIn?(): boolean;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Get the current account ID
|
|
151
|
+
*/
|
|
152
|
+
getAccountId(): string | Promise<string>;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get list of accounts (some wallets support multiple accounts)
|
|
156
|
+
*/
|
|
157
|
+
getAccounts?(): Promise<NearAccount[]>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Get the public key for the current account
|
|
161
|
+
*/
|
|
162
|
+
getPublicKey?(): Promise<string>;
|
|
163
|
+
|
|
164
|
+
// Legacy sign-in methods (used by some wallets)
|
|
165
|
+
/**
|
|
166
|
+
* Request sign in (legacy method)
|
|
167
|
+
*/
|
|
168
|
+
requestSignIn?(params: NearSignInParams): Promise<NearAccount>;
|
|
169
|
+
|
|
170
|
+
// Signing Operations
|
|
171
|
+
/**
|
|
172
|
+
* Sign a message
|
|
173
|
+
*/
|
|
174
|
+
signMessage(params: NearSignMessageParams): Promise<NearSignedMessage>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Sign and send a single transaction
|
|
178
|
+
*/
|
|
179
|
+
signAndSendTransaction(params: {
|
|
180
|
+
receiverId: string;
|
|
181
|
+
actions: NearAction[];
|
|
182
|
+
// Optional parameters
|
|
183
|
+
signerId?: string;
|
|
184
|
+
publicKey?: string;
|
|
185
|
+
nonce?: number;
|
|
186
|
+
recentBlockHash?: string;
|
|
187
|
+
}): Promise<NearFinalExecutionOutcome>;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Sign and send multiple transactions
|
|
191
|
+
*/
|
|
192
|
+
signAndSendTransactions(params: {
|
|
193
|
+
transactions: NearTransaction[];
|
|
194
|
+
}): Promise<NearFinalExecutionOutcome[]>;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Request signing of transactions (alternative method used by some wallets)
|
|
198
|
+
*/
|
|
199
|
+
requestSignTransactions?(params: {
|
|
200
|
+
transactions: NearTransaction[];
|
|
201
|
+
}): Promise<any>;
|
|
202
|
+
|
|
203
|
+
// Verification
|
|
204
|
+
/**
|
|
205
|
+
* Verify ownership of an account
|
|
206
|
+
*/
|
|
207
|
+
verifyOwner?(params: {
|
|
208
|
+
message: string;
|
|
209
|
+
// Additional parameters may vary by wallet
|
|
210
|
+
}): Promise<{
|
|
211
|
+
accountId: string;
|
|
212
|
+
publicKey: string;
|
|
213
|
+
signature: string;
|
|
214
|
+
// Additional fields may be returned
|
|
215
|
+
}>;
|
|
216
|
+
|
|
217
|
+
// Network Information
|
|
218
|
+
/**
|
|
219
|
+
* Get the current network (mainnet, testnet, etc.)
|
|
220
|
+
*/
|
|
221
|
+
getNetwork?(): string | Promise<string>;
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Check if wallet is connected to mainnet
|
|
225
|
+
*/
|
|
226
|
+
isMainnet?(): boolean;
|
|
227
|
+
|
|
228
|
+
// Wallet Metadata
|
|
229
|
+
/**
|
|
230
|
+
* Wallet name or identifier
|
|
231
|
+
*/
|
|
232
|
+
name?: string;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Wallet version
|
|
236
|
+
*/
|
|
237
|
+
version?: string;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Check if this is a specific wallet (used for wallet detection)
|
|
241
|
+
*/
|
|
242
|
+
isOKX?: boolean;
|
|
243
|
+
isXDEFI?: boolean;
|
|
244
|
+
isCTRL?: boolean;
|
|
245
|
+
|
|
246
|
+
// Event Handling (not all wallets support events)
|
|
247
|
+
on?(event: "accountsChanged" | "networkChanged" | "disconnect", handler: Function): void;
|
|
248
|
+
off?(event: string, handler: Function): void;
|
|
249
|
+
removeListener?(event: string, handler: Function): void;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Extended window interface for NEAR wallets
|
|
254
|
+
*/
|
|
255
|
+
declare global {
|
|
256
|
+
interface Window {
|
|
257
|
+
// Generic NEAR provider (if wallet uses this pattern)
|
|
258
|
+
near?: NearBrowserWalletProvider;
|
|
259
|
+
|
|
260
|
+
// Specific wallet providers
|
|
261
|
+
okxwallet?: {
|
|
262
|
+
near: NearBrowserWalletProvider;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
xfi?: {
|
|
266
|
+
near: NearBrowserWalletProvider;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// Add other wallet-specific providers as needed
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Helper type for wallet detection
|
|
275
|
+
*/
|
|
276
|
+
export type NearWalletType = "okx" | "xdefi" | "ctrl" | "generic";
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Configuration for NEAR network
|
|
280
|
+
*/
|
|
281
|
+
export interface NearNetworkConfig {
|
|
282
|
+
networkId: "mainnet" | "testnet" | "betanet";
|
|
283
|
+
nodeUrl: string;
|
|
284
|
+
walletUrl?: string;
|
|
285
|
+
helperUrl?: string;
|
|
286
|
+
}
|