@swapkit/plugins 1.0.0-beta.19 → 1.0.0-beta.20

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/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- var e={};p(e,{loadPlugin:()=>o});module.exports=r(e);async function o(t){let{match:a}=await import("ts-pattern");return await a(t).with("chainflip",async()=>{let{ChainflipPlugin:i}=await import("./chainflip/index.cjs");return i}).with("thorchain",async()=>{let{ThorchainPlugin:i}=await import("./thorchain/index.cjs");return i}).with("radix",async()=>{let{RadixPlugin:i}=await import("./radix/index.cjs");return i}).with("evm",async()=>{let{EVMPlugin:i}=await import("./evm/index.cjs");return i}).with("solana",async()=>{let{SolanaPlugin:i}=await import("./solana/index.cjs");return i}).exhaustive()}
1
+ var p={};e(p,{loadPlugin:()=>o});module.exports=r(p);async function o(t){let{match:a}=await import("ts-pattern");return await a(t).with("chainflip",async()=>{let{ChainflipPlugin:i}=await import("./chainflip/index.cjs");return i}).with("thorchain",async()=>{let{ThorchainPlugin:i}=await import("./thorchain/index.cjs");return i}).with("radix",async()=>{let{RadixPlugin:i}=await import("./radix/index.cjs");return i}).with("evm",async()=>{let{EVMPlugin:i}=await import("./evm/index.cjs");return i}).with("solana",async()=>{let{SolanaPlugin:i}=await import("./solana/index.cjs");return i}).with("near",async()=>{let{NearPlugin:i}=await import("./near/index.cjs");return i}).exhaustive()}
2
2
 
3
- //# debugId=4C94610CE871A09064756E2164756E21
3
+ //# debugId=A3E8E694D24EF52A64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/utils.ts"],
4
4
  "sourcesContent": [
5
- "import type { PluginName, SKPlugins } from \"./types\";\n\nexport async function loadPlugin<P extends PluginName>(pluginName: P) {\n const { match } = await import(\"ts-pattern\");\n\n const plugin = await match(pluginName as PluginName)\n .with(\"chainflip\", async () => {\n const { ChainflipPlugin } = await import(\"./chainflip\");\n return ChainflipPlugin;\n })\n .with(\"thorchain\", async () => {\n const { ThorchainPlugin } = await import(\"./thorchain\");\n return ThorchainPlugin;\n })\n .with(\"radix\", async () => {\n const { RadixPlugin } = await import(\"./radix\");\n return RadixPlugin;\n })\n .with(\"evm\", async () => {\n const { EVMPlugin } = await import(\"./evm\");\n return EVMPlugin;\n })\n .with(\"solana\", async () => {\n const { SolanaPlugin } = await import(\"./solana\");\n return SolanaPlugin;\n })\n .exhaustive();\n\n return plugin as unknown as SKPlugins[P];\n}\n"
5
+ "import type { PluginName, SKPlugins } from \"./types\";\n\nexport async function loadPlugin<P extends PluginName>(pluginName: P) {\n const { match } = await import(\"ts-pattern\");\n\n const plugin = await match(pluginName as PluginName)\n .with(\"chainflip\", async () => {\n const { ChainflipPlugin } = await import(\"./chainflip\");\n return ChainflipPlugin;\n })\n .with(\"thorchain\", async () => {\n const { ThorchainPlugin } = await import(\"./thorchain\");\n return ThorchainPlugin;\n })\n .with(\"radix\", async () => {\n const { RadixPlugin } = await import(\"./radix\");\n return RadixPlugin;\n })\n .with(\"evm\", async () => {\n const { EVMPlugin } = await import(\"./evm\");\n return EVMPlugin;\n })\n .with(\"solana\", async () => {\n const { SolanaPlugin } = await import(\"./solana\");\n return SolanaPlugin;\n })\n .with(\"near\", async () => {\n const { NearPlugin } = await import(\"./near\");\n return NearPlugin;\n })\n .exhaustive();\n\n return plugin as unknown as SKPlugins[P];\n}\n"
6
6
  ],
7
- "mappings": "qDAEA,eAAsB,CAAgC,CAAC,EAAe,CACpE,IAAQ,SAAU,KAAa,sBAyB/B,OAvBe,MAAM,EAAM,CAAwB,EAChD,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,iCACzC,OAAO,EACR,EACA,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,iCACzC,OAAO,EACR,EACA,KAAK,QAAS,SAAY,CACzB,IAAQ,eAAgB,KAAa,6BACrC,OAAO,EACR,EACA,KAAK,MAAO,SAAY,CACvB,IAAQ,aAAc,KAAa,2BACnC,OAAO,EACR,EACA,KAAK,SAAU,SAAY,CAC1B,IAAQ,gBAAiB,KAAa,8BACtC,OAAO,EACR,EACA,WAAW",
8
- "debugId": "4C94610CE871A09064756E2164756E21",
7
+ "mappings": "qDAEA,eAAsB,CAAgC,CAAC,EAAe,CACpE,IAAQ,SAAU,KAAa,sBA6B/B,OA3Be,MAAM,EAAM,CAAwB,EAChD,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,iCACzC,OAAO,EACR,EACA,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,iCACzC,OAAO,EACR,EACA,KAAK,QAAS,SAAY,CACzB,IAAQ,eAAgB,KAAa,6BACrC,OAAO,EACR,EACA,KAAK,MAAO,SAAY,CACvB,IAAQ,aAAc,KAAa,2BACnC,OAAO,EACR,EACA,KAAK,SAAU,SAAY,CAC1B,IAAQ,gBAAiB,KAAa,8BACtC,OAAO,EACR,EACA,KAAK,OAAQ,SAAY,CACxB,IAAQ,cAAe,KAAa,4BACpC,OAAO,EACR,EACA,WAAW",
8
+ "debugId": "A3E8E694D24EF52A64756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import{a as n,b as t}from"./chunk-wfktpptf.js";async function p(a){let{match:o}=await import("ts-pattern");return await o(a).with("chainflip",async()=>{let{ChainflipPlugin:i}=await import("./chainflip/index.js");return i}).with("thorchain",async()=>{let{ThorchainPlugin:i}=await import("./thorchain/index.js");return i}).with("radix",async()=>{let{RadixPlugin:i}=await import("./radix/index.js");return i}).with("evm",async()=>{let{EVMPlugin:i}=await import("./evm/index.js");return i}).with("solana",async()=>{let{SolanaPlugin:i}=await import("./solana/index.js");return i}).exhaustive()}export{p as loadPlugin};
1
+ import{a as n,b as t}from"./chunk-wfktpptf.js";async function e(a){let{match:o}=await import("ts-pattern");return await o(a).with("chainflip",async()=>{let{ChainflipPlugin:i}=await import("./chainflip/index.js");return i}).with("thorchain",async()=>{let{ThorchainPlugin:i}=await import("./thorchain/index.js");return i}).with("radix",async()=>{let{RadixPlugin:i}=await import("./radix/index.js");return i}).with("evm",async()=>{let{EVMPlugin:i}=await import("./evm/index.js");return i}).with("solana",async()=>{let{SolanaPlugin:i}=await import("./solana/index.js");return i}).with("near",async()=>{let{NearPlugin:i}=await import("./near/index.js");return i}).exhaustive()}export{e as loadPlugin};
2
2
 
3
- //# debugId=C99230D2E92A281864756E2164756E21
3
+ //# debugId=FA0901EFAAEE532D64756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/utils.ts"],
4
4
  "sourcesContent": [
5
- "import type { PluginName, SKPlugins } from \"./types\";\n\nexport async function loadPlugin<P extends PluginName>(pluginName: P) {\n const { match } = await import(\"ts-pattern\");\n\n const plugin = await match(pluginName as PluginName)\n .with(\"chainflip\", async () => {\n const { ChainflipPlugin } = await import(\"./chainflip\");\n return ChainflipPlugin;\n })\n .with(\"thorchain\", async () => {\n const { ThorchainPlugin } = await import(\"./thorchain\");\n return ThorchainPlugin;\n })\n .with(\"radix\", async () => {\n const { RadixPlugin } = await import(\"./radix\");\n return RadixPlugin;\n })\n .with(\"evm\", async () => {\n const { EVMPlugin } = await import(\"./evm\");\n return EVMPlugin;\n })\n .with(\"solana\", async () => {\n const { SolanaPlugin } = await import(\"./solana\");\n return SolanaPlugin;\n })\n .exhaustive();\n\n return plugin as unknown as SKPlugins[P];\n}\n"
5
+ "import type { PluginName, SKPlugins } from \"./types\";\n\nexport async function loadPlugin<P extends PluginName>(pluginName: P) {\n const { match } = await import(\"ts-pattern\");\n\n const plugin = await match(pluginName as PluginName)\n .with(\"chainflip\", async () => {\n const { ChainflipPlugin } = await import(\"./chainflip\");\n return ChainflipPlugin;\n })\n .with(\"thorchain\", async () => {\n const { ThorchainPlugin } = await import(\"./thorchain\");\n return ThorchainPlugin;\n })\n .with(\"radix\", async () => {\n const { RadixPlugin } = await import(\"./radix\");\n return RadixPlugin;\n })\n .with(\"evm\", async () => {\n const { EVMPlugin } = await import(\"./evm\");\n return EVMPlugin;\n })\n .with(\"solana\", async () => {\n const { SolanaPlugin } = await import(\"./solana\");\n return SolanaPlugin;\n })\n .with(\"near\", async () => {\n const { NearPlugin } = await import(\"./near\");\n return NearPlugin;\n })\n .exhaustive();\n\n return plugin as unknown as SKPlugins[P];\n}\n"
6
6
  ],
7
- "mappings": "+CAEA,eAAsB,CAAgC,CAAC,EAAe,CACpE,IAAQ,SAAU,KAAa,sBAyB/B,OAvBe,MAAM,EAAM,CAAwB,EAChD,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,gCACzC,OAAO,EACR,EACA,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,gCACzC,OAAO,EACR,EACA,KAAK,QAAS,SAAY,CACzB,IAAQ,eAAgB,KAAa,4BACrC,OAAO,EACR,EACA,KAAK,MAAO,SAAY,CACvB,IAAQ,aAAc,KAAa,0BACnC,OAAO,EACR,EACA,KAAK,SAAU,SAAY,CAC1B,IAAQ,gBAAiB,KAAa,6BACtC,OAAO,EACR,EACA,WAAW",
8
- "debugId": "C99230D2E92A281864756E2164756E21",
7
+ "mappings": "+CAEA,eAAsB,CAAgC,CAAC,EAAe,CACpE,IAAQ,SAAU,KAAa,sBA6B/B,OA3Be,MAAM,EAAM,CAAwB,EAChD,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,gCACzC,OAAO,EACR,EACA,KAAK,YAAa,SAAY,CAC7B,IAAQ,mBAAoB,KAAa,gCACzC,OAAO,EACR,EACA,KAAK,QAAS,SAAY,CACzB,IAAQ,eAAgB,KAAa,4BACrC,OAAO,EACR,EACA,KAAK,MAAO,SAAY,CACvB,IAAQ,aAAc,KAAa,0BACnC,OAAO,EACR,EACA,KAAK,SAAU,SAAY,CAC1B,IAAQ,gBAAiB,KAAa,6BACtC,OAAO,EACR,EACA,KAAK,OAAQ,SAAY,CACxB,IAAQ,cAAe,KAAa,2BACpC,OAAO,EACR,EACA,WAAW",
8
+ "debugId": "FA0901EFAAEE532D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,3 +1,3 @@
1
- var T={};Q(T,{NearPlugin:()=>M});module.exports=O(T);var x=require("@swapkit/helpers"),C=require("@swapkit/helpers/api"),M=x.createPlugin({name:"near",properties:{supportedSwapkitProviders:[x.ProviderName.NEAR]},methods:({getWallet:D})=>({async swap({route:N,recipient:F}){let{meta:j}=N;if(!j?.nearSwapInfo)throw new x.SwapKitError("core_swap_invalid_params",{message:"Missing NEAR swap metadata"});let y=j.nearSwapInfo,q=await D(y.srcChain),G={...y,toAddress:F||await q.getAddress()},z=await C.SwapKitApi.getNearDepositChannel?.(G);if(!z)throw new x.SwapKitError("core_plugin_not_found",{info:"NEAR deposit channel API not implemented"});let B=z;if(!B.isSuccess)throw new x.SwapKitError("core_swap_invalid_params",{message:"Failed to create NEAR deposit channel"});let{channelId:H,depositAddress:J}=B.response,L=x.AssetValue.from({chain:y.srcChain,symbol:y.srcToken,value:y.amount,decimal:N.srcToken.decimals});return await q.transfer({assetValue:L,recipient:J,memo:H})}})});
1
+ var _={};T(_,{NearPlugin:()=>U});module.exports=b(_);var x=require("@swapkit/helpers"),D=require("@swapkit/helpers/api");var X=require("near-api-js/lib/utils/format"),V=2,P=64;function Z(Q){if(Q.length<V||Q.length>P)return!1;return/^[a-z0-9]+(-[a-z0-9]+)*$/.test(Q)}function y(Q){let B=Q.length,q;if(B<=2)q="50";else if(B<=3)q="20";else if(B<=4)q="5";else if(B<=5)q="1";else q="0.1";return X.parseNearAmount(q)||"0"}var U=x.createPlugin({name:"near",properties:{supportedSwapkitProviders:[x.ProviderName.NEAR]},methods:({getWallet:Q})=>({async swap({route:B,recipient:q}){let{meta:J}=B;if(!J?.nearSwapInfo)throw new x.SwapKitError("core_swap_invalid_params",{message:"Missing NEAR swap metadata"});let F=J.nearSwapInfo,Y=await Q(F.srcChain),j={...F,toAddress:q||await Y.getAddress()},$=await D.SwapKitApi.getNearDepositChannel?.(j);if(!$)throw new x.SwapKitError("core_plugin_not_found",{info:"NEAR deposit channel API not implemented"});let k=$;if(!k.isSuccess)throw new x.SwapKitError("core_swap_invalid_params",{message:"Failed to create NEAR deposit channel"});let{channelId:G,depositAddress:H}=k.response,L=x.AssetValue.from({chain:F.srcChain,symbol:F.srcToken,value:F.amount,decimal:B.srcToken.decimals});return await Y.transfer({assetValue:L,recipient:H,memo:G})},nearNames:{async resolve(B){try{let q=B.toLowerCase().replace(/\.near$/,"");if(!Z(q))throw new x.SwapKitError("plugin_near_invalid_name");let J=Q(x.Chain.Near);if(!J)throw new x.SwapKitError("plugin_near_no_connection");let F=await J.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"resolve",args_base64:Buffer.from(JSON.stringify({name:q})).toString("base64")});return JSON.parse(Buffer.from(F.result).toString())?.owner||null}catch{return null}},async isAvailable(B){return await this.resolve(B)===null},async getInfo(B){try{let q=B.toLowerCase().replace(/\.near$/,"");if(!Z(q))throw new x.SwapKitError("plugin_near_invalid_name");let J=Q(x.Chain.Near);if(!J)throw new x.SwapKitError("plugin_near_no_connection");let F=await J.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"get_info",args_base64:Buffer.from(JSON.stringify({name:q})).toString("base64")});return JSON.parse(Buffer.from(F.result).toString())||null}catch{return null}},async lookupNames(B){try{let q=Q(x.Chain.Near);if(!q)throw new x.SwapKitError("plugin_near_no_connection");let J=await q.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"get_names_by_owner",args_base64:Buffer.from(JSON.stringify({account_id:B})).toString("base64")}),F=JSON.parse(Buffer.from(J.result).toString());return Array.isArray(F)?F.map((Y)=>`${Y}.near`):[]}catch{return[]}},async register(B){let{name:q,publicKey:J}=B,F=q.toLowerCase().replace(/\.near$/,"");if(!Z(F))throw new x.SwapKitError("plugin_near_invalid_name");let Y=Q(x.Chain.Near),j=J||await Y.getPublicKey(),$=y(F);return Y.callFunction({contractId:"near",methodName:"create_account",args:{new_account_id:`${F}.near`,new_public_key:j},deposit:$})},transfer(B,q){let J=B.toLowerCase().replace(/\.near$/,"");if(!Z(J))throw new x.SwapKitError("plugin_near_invalid_name");return Q(x.Chain.Near).callFunction({contractId:"near",methodName:"transfer",args:{name:J,new_owner:q},deposit:"1"})}}})});
2
2
 
3
- //# debugId=16063BF3E8C2F12E64756E2164756E21
3
+ //# debugId=5DB17A38AECAA7AA64756E2164756E21
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/near/plugin.ts"],
3
+ "sources": ["../src/near/plugin.ts", "../src/near/nearNames.ts"],
4
4
  "sourcesContent": [
5
- "import {\n AssetValue,\n ProviderName,\n SwapKitError,\n type SwapParams,\n createPlugin,\n} from \"@swapkit/helpers\";\nimport { SwapKitApi } from \"@swapkit/helpers/api\";\nimport type { NearDepositChannelParams, NearSwapResponse, NearSwapRoute } from \"./types\";\n\nexport const NearPlugin = createPlugin({\n name: \"near\",\n properties: {\n supportedSwapkitProviders: [ProviderName.NEAR],\n },\n methods: ({ getWallet }) => ({\n async swap({\n route,\n recipient,\n }: SwapParams<{\n route: NearSwapRoute & {\n meta?: {\n nearSwapInfo?: NearDepositChannelParams;\n };\n };\n }>) {\n const { meta } = route as any;\n if (!meta?.nearSwapInfo) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Missing NEAR swap metadata\",\n });\n }\n\n const nearSwapInfo = meta.nearSwapInfo;\n const srcWallet = await getWallet(nearSwapInfo.srcChain);\n\n const nearDepositChannelParams: NearDepositChannelParams = {\n ...nearSwapInfo,\n toAddress: recipient || (await srcWallet.getAddress()),\n };\n\n // TODO: Implement getNearDepositChannel in SwapKitApi\n // This endpoint needs to be added to the API for NEAR support\n const response = await (SwapKitApi as any).getNearDepositChannel?.(nearDepositChannelParams);\n if (!response) {\n throw new SwapKitError(\"core_plugin_not_found\", {\n info: \"NEAR deposit channel API not implemented\",\n });\n }\n const nearResponse = response as NearSwapResponse;\n\n if (!nearResponse.isSuccess) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Failed to create NEAR deposit channel\",\n });\n }\n\n const { channelId, depositAddress } = nearResponse.response;\n\n const assetValue = AssetValue.from({\n chain: nearSwapInfo.srcChain,\n symbol: nearSwapInfo.srcToken,\n value: nearSwapInfo.amount,\n decimal: (route as any).srcToken.decimals,\n });\n\n const txHash = await srcWallet.transfer({\n assetValue,\n recipient: depositAddress,\n memo: channelId,\n });\n\n return txHash;\n },\n }),\n});\n"
5
+ "import {\n AssetValue,\n Chain,\n ProviderName,\n SwapKitError,\n type SwapParams,\n createPlugin,\n} from \"@swapkit/helpers\";\nimport { SwapKitApi } from \"@swapkit/helpers/api\";\nimport type { NearWallet } from \"@swapkit/toolboxes/near\";\nimport { calculateNearNameCost, validateNearName } from \"./nearNames\";\nimport type {\n NearDepositChannelParams,\n NearNameRegistrationParams,\n NearSwapResponse,\n NearSwapRoute,\n} from \"./types\";\n\nexport const NearPlugin = createPlugin({\n name: \"near\",\n properties: {\n supportedSwapkitProviders: [ProviderName.NEAR],\n },\n methods: ({ getWallet }) => ({\n async swap({\n route,\n recipient,\n }: SwapParams<{\n route: NearSwapRoute & {\n meta?: {\n nearSwapInfo?: NearDepositChannelParams;\n };\n };\n }>) {\n const { meta } = route as any;\n if (!meta?.nearSwapInfo) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Missing NEAR swap metadata\",\n });\n }\n\n const nearSwapInfo = meta.nearSwapInfo;\n const srcWallet = await getWallet(nearSwapInfo.srcChain);\n\n const nearDepositChannelParams: NearDepositChannelParams = {\n ...nearSwapInfo,\n toAddress: recipient || (await srcWallet.getAddress()),\n };\n\n // TODO: UPSTREAM getNearDepositChannel in SwapKitApi from v3 branch\n const response = await (SwapKitApi as any).getNearDepositChannel?.(nearDepositChannelParams);\n if (!response) {\n throw new SwapKitError(\"core_plugin_not_found\", {\n info: \"NEAR deposit channel API not implemented\",\n });\n }\n const nearResponse = response as NearSwapResponse;\n\n if (!nearResponse.isSuccess) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Failed to create NEAR deposit channel\",\n });\n }\n\n const { channelId, depositAddress } = nearResponse.response;\n\n const assetValue = AssetValue.from({\n chain: nearSwapInfo.srcChain,\n symbol: nearSwapInfo.srcToken,\n value: nearSwapInfo.amount,\n decimal: (route as any).srcToken.decimals,\n });\n\n const txHash = await srcWallet.transfer({\n assetValue,\n recipient: depositAddress,\n memo: channelId,\n });\n\n return txHash;\n },\n\n // NEAR Names functionality\n nearNames: {\n async resolve(name: string) {\n try {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"resolve\",\n args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return response?.owner || null;\n } catch {\n return null;\n }\n },\n\n async isAvailable(name: string) {\n const owner = await this.resolve(name);\n return owner === null;\n },\n\n async getInfo(name: string) {\n try {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"get_info\",\n args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return response || null;\n } catch {\n return null;\n }\n },\n\n async lookupNames(accountId: string) {\n try {\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"get_names_by_owner\",\n args_base64: Buffer.from(JSON.stringify({ account_id: accountId })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return Array.isArray(response) ? response.map((n) => `${n}.near`) : [];\n } catch {\n return [];\n }\n },\n\n async register(params: NearNameRegistrationParams) {\n const { name, publicKey: publicKeyOverwrite } = params;\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near) as NearWallet;\n\n const newPublicKey = publicKeyOverwrite || (await wallet.getPublicKey());\n\n const cost = calculateNearNameCost(normalizedName);\n\n return wallet.callFunction({\n contractId: \"near\",\n methodName: \"create_account\",\n args: {\n new_account_id: `${normalizedName}.near`,\n new_public_key: newPublicKey,\n },\n deposit: cost,\n });\n },\n\n transfer(name: string, newOwner: string) {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near) as NearWallet;\n\n return wallet.callFunction({\n contractId: \"near\",\n methodName: \"transfer\",\n args: {\n name: normalizedName,\n new_owner: newOwner,\n },\n deposit: \"1\",\n });\n },\n },\n }),\n});\n",
6
+ "import { parseNearAmount } from \"near-api-js/lib/utils/format\";\n\nconst MINIMUM_NAME_LENGTH = 2;\nconst MAXIMUM_NAME_LENGTH = 64;\n\nexport function validateNearName(name: string): boolean {\n if (name.length < MINIMUM_NAME_LENGTH || name.length > MAXIMUM_NAME_LENGTH) {\n return false;\n }\n\n // Only lowercase letters, numbers, and hyphens\n // Cannot start or end with hyphen\n // No consecutive hyphens\n return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);\n}\n\nexport function calculateNearNameCost(name: string): string {\n // Pricing based on name length\n // These are suggested prices, the actual minimum is ~0.00182 NEAR\n const length = name.length;\n\n let costInNear: string;\n if (length <= 2) {\n costInNear = \"50\"; // 50 NEAR for 2-char names\n } else if (length <= 3) {\n costInNear = \"20\"; // 20 NEAR for 3-char names\n } else if (length <= 4) {\n costInNear = \"5\"; // 5 NEAR for 4-char names\n } else if (length <= 5) {\n costInNear = \"1\"; // 1 NEAR for 5-char names\n } else {\n costInNear = \"0.1\"; // 0.1 NEAR for 6+ characters\n }\n\n // Convert NEAR to yoctoNEAR\n return parseNearAmount(costInNear) || \"0\";\n}\n"
6
7
  ],
7
- "mappings": "qDAMO,IANP,8BAOA,kCAGa,EAAa,eAAa,CACrC,KAAM,OACN,WAAY,CACV,0BAA2B,CAAC,eAAa,IAAI,CAC/C,EACA,QAAS,EAAG,gBAAiB,MACrB,KAAI,EACR,QACA,aAOE,CACF,IAAQ,QAAS,EACjB,IAAK,GAAM,aACT,MAAM,IAAI,eAAa,2BAA4B,CACjD,QAAS,4BACX,CAAC,EAGH,IAAM,EAAe,EAAK,aACpB,EAAY,MAAM,EAAU,EAAa,QAAQ,EAEjD,EAAqD,IACtD,EACH,UAAW,GAAc,MAAM,EAAU,WAAW,CACtD,EAIM,EAAW,MAAO,aAAmB,wBAAwB,CAAwB,EAC3F,IAAK,EACH,MAAM,IAAI,eAAa,wBAAyB,CAC9C,KAAM,0CACR,CAAC,EAEH,IAAM,EAAe,EAErB,IAAK,EAAa,UAChB,MAAM,IAAI,eAAa,2BAA4B,CACjD,QAAS,uCACX,CAAC,EAGH,IAAQ,YAAW,kBAAmB,EAAa,SAE7C,EAAa,aAAW,KAAK,CACjC,MAAO,EAAa,SACpB,OAAQ,EAAa,SACrB,MAAO,EAAa,OACpB,QAAU,EAAc,SAAS,QACnC,CAAC,EAQD,OANe,MAAM,EAAU,SAAS,CACtC,aACA,UAAW,EACX,KAAM,CACR,CAAC,EAIL,EACF,CAAC",
8
- "debugId": "16063BF3E8C2F12E64756E2164756E21",
8
+ "mappings": "qDAOO,IAPP,8BAQA,kCCRgC,IAAhC,0CAEM,EAAsB,EACtB,EAAsB,GAErB,SAAS,CAAgB,CAAC,EAAuB,CACtD,GAAI,EAAK,OAAS,GAAuB,EAAK,OAAS,EACrD,MAAO,GAMT,MAAO,2BAA2B,KAAK,CAAI,EAGtC,SAAS,CAAqB,CAAC,EAAsB,CAG1D,IAAM,EAAS,EAAK,OAEhB,EACJ,GAAI,GAAU,EACZ,EAAa,KACR,QAAI,GAAU,EACnB,EAAa,KACR,QAAI,GAAU,EACnB,EAAa,IACR,QAAI,GAAU,EACnB,EAAa,IAEb,OAAa,MAIf,OAAO,kBAAgB,CAAU,GAAK,IDjBjC,IAAM,EAAa,eAAa,CACrC,KAAM,OACN,WAAY,CACV,0BAA2B,CAAC,eAAa,IAAI,CAC/C,EACA,QAAS,EAAG,gBAAiB,MACrB,KAAI,EACR,QACA,aAOE,CACF,IAAQ,QAAS,EACjB,IAAK,GAAM,aACT,MAAM,IAAI,eAAa,2BAA4B,CACjD,QAAS,4BACX,CAAC,EAGH,IAAM,EAAe,EAAK,aACpB,EAAY,MAAM,EAAU,EAAa,QAAQ,EAEjD,EAAqD,IACtD,EACH,UAAW,GAAc,MAAM,EAAU,WAAW,CACtD,EAGM,EAAW,MAAO,aAAmB,wBAAwB,CAAwB,EAC3F,IAAK,EACH,MAAM,IAAI,eAAa,wBAAyB,CAC9C,KAAM,0CACR,CAAC,EAEH,IAAM,EAAe,EAErB,IAAK,EAAa,UAChB,MAAM,IAAI,eAAa,2BAA4B,CACjD,QAAS,uCACX,CAAC,EAGH,IAAQ,YAAW,kBAAmB,EAAa,SAE7C,EAAa,aAAW,KAAK,CACjC,MAAO,EAAa,SACpB,OAAQ,EAAa,SACrB,MAAO,EAAa,OACpB,QAAU,EAAc,SAAS,QACnC,CAAC,EAQD,OANe,MAAM,EAAU,SAAS,CACtC,aACA,UAAW,EACX,KAAM,CACR,CAAC,GAMH,UAAW,MACH,QAAO,CAAC,EAAc,CAC1B,GAAI,CACF,IAAM,EAAiB,EAAK,YAAY,EAAE,QAAQ,UAAW,EAAE,EAE/D,IAAK,EAAiB,CAAc,EAClC,MAAM,IAAI,eAAa,0BAA0B,EAGnD,IAAM,EAAS,EAAU,QAAM,IAAI,EAEnC,IAAK,EACH,MAAM,IAAI,eAAa,2BAA2B,EAGpD,IAAM,EAAS,MAAM,EAAO,SAAS,MAAM,CACzC,aAAc,gBACd,SAAU,QACV,WAAY,OACZ,YAAa,UACb,YAAa,OAAO,KAAK,KAAK,UAAU,CAAE,KAAM,CAAe,CAAC,CAAC,EAAE,SAAS,QAAQ,CACtF,CAAC,EAGD,OADiB,KAAK,MAAM,OAAO,KAAM,EAAe,MAAM,EAAE,SAAS,CAAC,GACzD,OAAS,KAC1B,KAAM,CACN,OAAO,YAIL,YAAW,CAAC,EAAc,CAE9B,OADc,MAAM,KAAK,QAAQ,CAAI,IACpB,WAGb,QAAO,CAAC,EAAc,CAC1B,GAAI,CACF,IAAM,EAAiB,EAAK,YAAY,EAAE,QAAQ,UAAW,EAAE,EAE/D,IAAK,EAAiB,CAAc,EAClC,MAAM,IAAI,eAAa,0BAA0B,EAGnD,IAAM,EAAS,EAAU,QAAM,IAAI,EAEnC,IAAK,EACH,MAAM,IAAI,eAAa,2BAA2B,EAGpD,IAAM,EAAS,MAAM,EAAO,SAAS,MAAM,CACzC,aAAc,gBACd,SAAU,QACV,WAAY,OACZ,YAAa,WACb,YAAa,OAAO,KAAK,KAAK,UAAU,CAAE,KAAM,CAAe,CAAC,CAAC,EAAE,SAAS,QAAQ,CACtF,CAAC,EAGD,OADiB,KAAK,MAAM,OAAO,KAAM,EAAe,MAAM,EAAE,SAAS,CAAC,GACvD,KACnB,KAAM,CACN,OAAO,YAIL,YAAW,CAAC,EAAmB,CACnC,GAAI,CACF,IAAM,EAAS,EAAU,QAAM,IAAI,EAEnC,IAAK,EACH,MAAM,IAAI,eAAa,2BAA2B,EAGpD,IAAM,EAAS,MAAM,EAAO,SAAS,MAAM,CACzC,aAAc,gBACd,SAAU,QACV,WAAY,OACZ,YAAa,qBACb,YAAa,OAAO,KAAK,KAAK,UAAU,CAAE,WAAY,CAAU,CAAC,CAAC,EAAE,SAAS,QAAQ,CACvF,CAAC,EAEK,EAAW,KAAK,MAAM,OAAO,KAAM,EAAe,MAAM,EAAE,SAAS,CAAC,EAC1E,OAAO,MAAM,QAAQ,CAAQ,EAAI,EAAS,IAAI,CAAC,IAAM,GAAG,QAAQ,EAAI,CAAC,EACrE,KAAM,CACN,MAAO,CAAC,SAIN,SAAQ,CAAC,EAAoC,CACjD,IAAQ,OAAM,UAAW,GAAuB,EAC1C,EAAiB,EAAK,YAAY,EAAE,QAAQ,UAAW,EAAE,EAE/D,IAAK,EAAiB,CAAc,EAClC,MAAM,IAAI,eAAa,0BAA0B,EAGnD,IAAM,EAAS,EAAU,QAAM,IAAI,EAE7B,EAAe,GAAuB,MAAM,EAAO,aAAa,EAEhE,EAAO,EAAsB,CAAc,EAEjD,OAAO,EAAO,aAAa,CACzB,WAAY,OACZ,WAAY,iBACZ,KAAM,CACJ,eAAgB,GAAG,SACnB,eAAgB,CAClB,EACA,QAAS,CACX,CAAC,GAGH,QAAQ,CAAC,EAAc,EAAkB,CACvC,IAAM,EAAiB,EAAK,YAAY,EAAE,QAAQ,UAAW,EAAE,EAE/D,IAAK,EAAiB,CAAc,EAClC,MAAM,IAAI,eAAa,0BAA0B,EAKnD,OAFe,EAAU,QAAM,IAAI,EAErB,aAAa,CACzB,WAAY,OACZ,WAAY,WACZ,KAAM,CACJ,KAAM,EACN,UAAW,CACb,EACA,QAAS,GACX,CAAC,EAEL,CACF,EACF,CAAC",
9
+ "debugId": "5DB17A38AECAA7AA64756E2164756E21",
9
10
  "names": []
10
11
  }
@@ -1,3 +1,3 @@
1
- import"../chunk-wfktpptf.js";import{AssetValue as L,ProviderName as M,SwapKitError as y,createPlugin as O}from"@swapkit/helpers";import{SwapKitApi as Q}from"@swapkit/helpers/api";var Y=O({name:"near",properties:{supportedSwapkitProviders:[M.NEAR]},methods:({getWallet:C})=>({async swap({route:N,recipient:D}){let{meta:j}=N;if(!j?.nearSwapInfo)throw new y("core_swap_invalid_params",{message:"Missing NEAR swap metadata"});let x=j.nearSwapInfo,q=await C(x.srcChain),F={...x,toAddress:D||await q.getAddress()},z=await Q.getNearDepositChannel?.(F);if(!z)throw new y("core_plugin_not_found",{info:"NEAR deposit channel API not implemented"});let B=z;if(!B.isSuccess)throw new y("core_swap_invalid_params",{message:"Failed to create NEAR deposit channel"});let{channelId:G,depositAddress:H}=B.response,J=L.from({chain:x.srcChain,symbol:x.srcToken,value:x.amount,decimal:N.srcToken.decimals});return await q.transfer({assetValue:J,recipient:H,memo:G})}})});export{Y as NearPlugin};
1
+ import"../chunk-wfktpptf.js";import{AssetValue as U,Chain as $,ProviderName as b,SwapKitError as Q,createPlugin as T}from"@swapkit/helpers";import{SwapKitApi as _}from"@swapkit/helpers/api";import{parseNearAmount as L}from"near-api-js/lib/utils/format";var V=2,P=64;function Z(J){if(J.length<V||J.length>P)return!1;return/^[a-z0-9]+(-[a-z0-9]+)*$/.test(J)}function y(J){let q=J.length,x;if(q<=2)x="50";else if(q<=3)x="20";else if(q<=4)x="5";else if(q<=5)x="1";else x="0.1";return L(x)||"0"}var R=T({name:"near",properties:{supportedSwapkitProviders:[b.NEAR]},methods:({getWallet:J})=>({async swap({route:q,recipient:x}){let{meta:F}=q;if(!F?.nearSwapInfo)throw new Q("core_swap_invalid_params",{message:"Missing NEAR swap metadata"});let B=F.nearSwapInfo,Y=await J(B.srcChain),k={...B,toAddress:x||await Y.getAddress()},j=await _.getNearDepositChannel?.(k);if(!j)throw new Q("core_plugin_not_found",{info:"NEAR deposit channel API not implemented"});let X=j;if(!X.isSuccess)throw new Q("core_swap_invalid_params",{message:"Failed to create NEAR deposit channel"});let{channelId:D,depositAddress:G}=X.response,H=U.from({chain:B.srcChain,symbol:B.srcToken,value:B.amount,decimal:q.srcToken.decimals});return await Y.transfer({assetValue:H,recipient:G,memo:D})},nearNames:{async resolve(q){try{let x=q.toLowerCase().replace(/\.near$/,"");if(!Z(x))throw new Q("plugin_near_invalid_name");let F=J($.Near);if(!F)throw new Q("plugin_near_no_connection");let B=await F.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"resolve",args_base64:Buffer.from(JSON.stringify({name:x})).toString("base64")});return JSON.parse(Buffer.from(B.result).toString())?.owner||null}catch{return null}},async isAvailable(q){return await this.resolve(q)===null},async getInfo(q){try{let x=q.toLowerCase().replace(/\.near$/,"");if(!Z(x))throw new Q("plugin_near_invalid_name");let F=J($.Near);if(!F)throw new Q("plugin_near_no_connection");let B=await F.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"get_info",args_base64:Buffer.from(JSON.stringify({name:x})).toString("base64")});return JSON.parse(Buffer.from(B.result).toString())||null}catch{return null}},async lookupNames(q){try{let x=J($.Near);if(!x)throw new Q("plugin_near_no_connection");let F=await x.provider.query({request_type:"call_function",finality:"final",account_id:"near",method_name:"get_names_by_owner",args_base64:Buffer.from(JSON.stringify({account_id:q})).toString("base64")}),B=JSON.parse(Buffer.from(F.result).toString());return Array.isArray(B)?B.map((Y)=>`${Y}.near`):[]}catch{return[]}},async register(q){let{name:x,publicKey:F}=q,B=x.toLowerCase().replace(/\.near$/,"");if(!Z(B))throw new Q("plugin_near_invalid_name");let Y=J($.Near),k=F||await Y.getPublicKey(),j=y(B);return Y.callFunction({contractId:"near",methodName:"create_account",args:{new_account_id:`${B}.near`,new_public_key:k},deposit:j})},transfer(q,x){let F=q.toLowerCase().replace(/\.near$/,"");if(!Z(F))throw new Q("plugin_near_invalid_name");return J($.Near).callFunction({contractId:"near",methodName:"transfer",args:{name:F,new_owner:x},deposit:"1"})}}})});export{R as NearPlugin};
2
2
 
3
- //# debugId=40DC44646B72361164756E2164756E21
3
+ //# debugId=D977A83716DD691F64756E2164756E21
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/near/plugin.ts"],
3
+ "sources": ["../src/near/plugin.ts", "../src/near/nearNames.ts"],
4
4
  "sourcesContent": [
5
- "import {\n AssetValue,\n ProviderName,\n SwapKitError,\n type SwapParams,\n createPlugin,\n} from \"@swapkit/helpers\";\nimport { SwapKitApi } from \"@swapkit/helpers/api\";\nimport type { NearDepositChannelParams, NearSwapResponse, NearSwapRoute } from \"./types\";\n\nexport const NearPlugin = createPlugin({\n name: \"near\",\n properties: {\n supportedSwapkitProviders: [ProviderName.NEAR],\n },\n methods: ({ getWallet }) => ({\n async swap({\n route,\n recipient,\n }: SwapParams<{\n route: NearSwapRoute & {\n meta?: {\n nearSwapInfo?: NearDepositChannelParams;\n };\n };\n }>) {\n const { meta } = route as any;\n if (!meta?.nearSwapInfo) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Missing NEAR swap metadata\",\n });\n }\n\n const nearSwapInfo = meta.nearSwapInfo;\n const srcWallet = await getWallet(nearSwapInfo.srcChain);\n\n const nearDepositChannelParams: NearDepositChannelParams = {\n ...nearSwapInfo,\n toAddress: recipient || (await srcWallet.getAddress()),\n };\n\n // TODO: Implement getNearDepositChannel in SwapKitApi\n // This endpoint needs to be added to the API for NEAR support\n const response = await (SwapKitApi as any).getNearDepositChannel?.(nearDepositChannelParams);\n if (!response) {\n throw new SwapKitError(\"core_plugin_not_found\", {\n info: \"NEAR deposit channel API not implemented\",\n });\n }\n const nearResponse = response as NearSwapResponse;\n\n if (!nearResponse.isSuccess) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Failed to create NEAR deposit channel\",\n });\n }\n\n const { channelId, depositAddress } = nearResponse.response;\n\n const assetValue = AssetValue.from({\n chain: nearSwapInfo.srcChain,\n symbol: nearSwapInfo.srcToken,\n value: nearSwapInfo.amount,\n decimal: (route as any).srcToken.decimals,\n });\n\n const txHash = await srcWallet.transfer({\n assetValue,\n recipient: depositAddress,\n memo: channelId,\n });\n\n return txHash;\n },\n }),\n});\n"
5
+ "import {\n AssetValue,\n Chain,\n ProviderName,\n SwapKitError,\n type SwapParams,\n createPlugin,\n} from \"@swapkit/helpers\";\nimport { SwapKitApi } from \"@swapkit/helpers/api\";\nimport type { NearWallet } from \"@swapkit/toolboxes/near\";\nimport { calculateNearNameCost, validateNearName } from \"./nearNames\";\nimport type {\n NearDepositChannelParams,\n NearNameRegistrationParams,\n NearSwapResponse,\n NearSwapRoute,\n} from \"./types\";\n\nexport const NearPlugin = createPlugin({\n name: \"near\",\n properties: {\n supportedSwapkitProviders: [ProviderName.NEAR],\n },\n methods: ({ getWallet }) => ({\n async swap({\n route,\n recipient,\n }: SwapParams<{\n route: NearSwapRoute & {\n meta?: {\n nearSwapInfo?: NearDepositChannelParams;\n };\n };\n }>) {\n const { meta } = route as any;\n if (!meta?.nearSwapInfo) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Missing NEAR swap metadata\",\n });\n }\n\n const nearSwapInfo = meta.nearSwapInfo;\n const srcWallet = await getWallet(nearSwapInfo.srcChain);\n\n const nearDepositChannelParams: NearDepositChannelParams = {\n ...nearSwapInfo,\n toAddress: recipient || (await srcWallet.getAddress()),\n };\n\n // TODO: UPSTREAM getNearDepositChannel in SwapKitApi from v3 branch\n const response = await (SwapKitApi as any).getNearDepositChannel?.(nearDepositChannelParams);\n if (!response) {\n throw new SwapKitError(\"core_plugin_not_found\", {\n info: \"NEAR deposit channel API not implemented\",\n });\n }\n const nearResponse = response as NearSwapResponse;\n\n if (!nearResponse.isSuccess) {\n throw new SwapKitError(\"core_swap_invalid_params\", {\n message: \"Failed to create NEAR deposit channel\",\n });\n }\n\n const { channelId, depositAddress } = nearResponse.response;\n\n const assetValue = AssetValue.from({\n chain: nearSwapInfo.srcChain,\n symbol: nearSwapInfo.srcToken,\n value: nearSwapInfo.amount,\n decimal: (route as any).srcToken.decimals,\n });\n\n const txHash = await srcWallet.transfer({\n assetValue,\n recipient: depositAddress,\n memo: channelId,\n });\n\n return txHash;\n },\n\n // NEAR Names functionality\n nearNames: {\n async resolve(name: string) {\n try {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"resolve\",\n args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return response?.owner || null;\n } catch {\n return null;\n }\n },\n\n async isAvailable(name: string) {\n const owner = await this.resolve(name);\n return owner === null;\n },\n\n async getInfo(name: string) {\n try {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"get_info\",\n args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return response || null;\n } catch {\n return null;\n }\n },\n\n async lookupNames(accountId: string) {\n try {\n const wallet = getWallet(Chain.Near);\n\n if (!wallet) {\n throw new SwapKitError(\"plugin_near_no_connection\");\n }\n\n const result = await wallet.provider.query({\n request_type: \"call_function\",\n finality: \"final\",\n account_id: \"near\",\n method_name: \"get_names_by_owner\",\n args_base64: Buffer.from(JSON.stringify({ account_id: accountId })).toString(\"base64\"),\n });\n\n const response = JSON.parse(Buffer.from((result as any).result).toString());\n return Array.isArray(response) ? response.map((n) => `${n}.near`) : [];\n } catch {\n return [];\n }\n },\n\n async register(params: NearNameRegistrationParams) {\n const { name, publicKey: publicKeyOverwrite } = params;\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near) as NearWallet;\n\n const newPublicKey = publicKeyOverwrite || (await wallet.getPublicKey());\n\n const cost = calculateNearNameCost(normalizedName);\n\n return wallet.callFunction({\n contractId: \"near\",\n methodName: \"create_account\",\n args: {\n new_account_id: `${normalizedName}.near`,\n new_public_key: newPublicKey,\n },\n deposit: cost,\n });\n },\n\n transfer(name: string, newOwner: string) {\n const normalizedName = name.toLowerCase().replace(/\\.near$/, \"\");\n\n if (!validateNearName(normalizedName)) {\n throw new SwapKitError(\"plugin_near_invalid_name\");\n }\n\n const wallet = getWallet(Chain.Near) as NearWallet;\n\n return wallet.callFunction({\n contractId: \"near\",\n methodName: \"transfer\",\n args: {\n name: normalizedName,\n new_owner: newOwner,\n },\n deposit: \"1\",\n });\n },\n },\n }),\n});\n",
6
+ "import { parseNearAmount } from \"near-api-js/lib/utils/format\";\n\nconst MINIMUM_NAME_LENGTH = 2;\nconst MAXIMUM_NAME_LENGTH = 64;\n\nexport function validateNearName(name: string): boolean {\n if (name.length < MINIMUM_NAME_LENGTH || name.length > MAXIMUM_NAME_LENGTH) {\n return false;\n }\n\n // Only lowercase letters, numbers, and hyphens\n // Cannot start or end with hyphen\n // No consecutive hyphens\n return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);\n}\n\nexport function calculateNearNameCost(name: string): string {\n // Pricing based on name length\n // These are suggested prices, the actual minimum is ~0.00182 NEAR\n const length = name.length;\n\n let costInNear: string;\n if (length <= 2) {\n costInNear = \"50\"; // 50 NEAR for 2-char names\n } else if (length <= 3) {\n costInNear = \"20\"; // 20 NEAR for 3-char names\n } else if (length <= 4) {\n costInNear = \"5\"; // 5 NEAR for 4-char names\n } else if (length <= 5) {\n costInNear = \"1\"; // 1 NEAR for 5-char names\n } else {\n costInNear = \"0.1\"; // 0.1 NEAR for 6+ characters\n }\n\n // Convert NEAR to yoctoNEAR\n return parseNearAmount(costInNear) || \"0\";\n}\n"
6
7
  ],
7
- "mappings": "6BAAA,qBACE,kBACA,kBACA,kBAEA,yBAEF,qBAAS,6BAGF,IAAM,EAAa,EAAa,CACrC,KAAM,OACN,WAAY,CACV,0BAA2B,CAAC,EAAa,IAAI,CAC/C,EACA,QAAS,EAAG,gBAAiB,MACrB,KAAI,EACR,QACA,aAOE,CACF,IAAQ,QAAS,EACjB,IAAK,GAAM,aACT,MAAM,IAAI,EAAa,2BAA4B,CACjD,QAAS,4BACX,CAAC,EAGH,IAAM,EAAe,EAAK,aACpB,EAAY,MAAM,EAAU,EAAa,QAAQ,EAEjD,EAAqD,IACtD,EACH,UAAW,GAAc,MAAM,EAAU,WAAW,CACtD,EAIM,EAAW,MAAO,EAAmB,wBAAwB,CAAwB,EAC3F,IAAK,EACH,MAAM,IAAI,EAAa,wBAAyB,CAC9C,KAAM,0CACR,CAAC,EAEH,IAAM,EAAe,EAErB,IAAK,EAAa,UAChB,MAAM,IAAI,EAAa,2BAA4B,CACjD,QAAS,uCACX,CAAC,EAGH,IAAQ,YAAW,kBAAmB,EAAa,SAE7C,EAAa,EAAW,KAAK,CACjC,MAAO,EAAa,SACpB,OAAQ,EAAa,SACrB,MAAO,EAAa,OACpB,QAAU,EAAc,SAAS,QACnC,CAAC,EAQD,OANe,MAAM,EAAU,SAAS,CACtC,aACA,UAAW,EACX,KAAM,CACR,CAAC,EAIL,EACF,CAAC",
8
- "debugId": "40DC44646B72361164756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "D977A83716DD691F64756E2164756E21",
9
10
  "names": []
10
11
  }
package/package.json CHANGED
@@ -4,8 +4,8 @@
4
4
  "@polkadot/keyring": "13.5.1",
5
5
  "@polkadot/util": "13.5.1",
6
6
  "@solana/web3.js": "1.98.2",
7
- "@swapkit/helpers": "3.0.0-beta.14",
8
- "@swapkit/toolboxes": "1.0.0-beta.19",
7
+ "@swapkit/helpers": "3.0.0-beta.15",
8
+ "@swapkit/toolboxes": "1.0.0-beta.20",
9
9
  "ts-pattern": "5.7.1"
10
10
  },
11
11
  "description": "SwapKit Plugin - ChainFlip",
@@ -68,5 +68,5 @@
68
68
  "type-check:go": "tsgo"
69
69
  },
70
70
  "type": "module",
71
- "version": "1.0.0-beta.19"
71
+ "version": "1.0.0-beta.20"
72
72
  }
package/src/near/index.ts CHANGED
@@ -4,4 +4,6 @@ export type {
4
4
  NearSwapResponse,
5
5
  NearSwapRoute,
6
6
  NearTokenInfo,
7
+ NearNameInfo,
8
+ NearNameRegistrationParams,
7
9
  } from "./types";
@@ -0,0 +1,37 @@
1
+ import { parseNearAmount } from "near-api-js/lib/utils/format";
2
+
3
+ const MINIMUM_NAME_LENGTH = 2;
4
+ const MAXIMUM_NAME_LENGTH = 64;
5
+
6
+ export function validateNearName(name: string): boolean {
7
+ if (name.length < MINIMUM_NAME_LENGTH || name.length > MAXIMUM_NAME_LENGTH) {
8
+ return false;
9
+ }
10
+
11
+ // Only lowercase letters, numbers, and hyphens
12
+ // Cannot start or end with hyphen
13
+ // No consecutive hyphens
14
+ return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
15
+ }
16
+
17
+ export function calculateNearNameCost(name: string): string {
18
+ // Pricing based on name length
19
+ // These are suggested prices, the actual minimum is ~0.00182 NEAR
20
+ const length = name.length;
21
+
22
+ let costInNear: string;
23
+ if (length <= 2) {
24
+ costInNear = "50"; // 50 NEAR for 2-char names
25
+ } else if (length <= 3) {
26
+ costInNear = "20"; // 20 NEAR for 3-char names
27
+ } else if (length <= 4) {
28
+ costInNear = "5"; // 5 NEAR for 4-char names
29
+ } else if (length <= 5) {
30
+ costInNear = "1"; // 1 NEAR for 5-char names
31
+ } else {
32
+ costInNear = "0.1"; // 0.1 NEAR for 6+ characters
33
+ }
34
+
35
+ // Convert NEAR to yoctoNEAR
36
+ return parseNearAmount(costInNear) || "0";
37
+ }
@@ -1,12 +1,20 @@
1
1
  import {
2
2
  AssetValue,
3
+ Chain,
3
4
  ProviderName,
4
5
  SwapKitError,
5
6
  type SwapParams,
6
7
  createPlugin,
7
8
  } from "@swapkit/helpers";
8
9
  import { SwapKitApi } from "@swapkit/helpers/api";
9
- import type { NearDepositChannelParams, NearSwapResponse, NearSwapRoute } from "./types";
10
+ import type { NearWallet } from "@swapkit/toolboxes/near";
11
+ import { calculateNearNameCost, validateNearName } from "./nearNames";
12
+ import type {
13
+ NearDepositChannelParams,
14
+ NearNameRegistrationParams,
15
+ NearSwapResponse,
16
+ NearSwapRoute,
17
+ } from "./types";
10
18
 
11
19
  export const NearPlugin = createPlugin({
12
20
  name: "near",
@@ -39,8 +47,7 @@ export const NearPlugin = createPlugin({
39
47
  toAddress: recipient || (await srcWallet.getAddress()),
40
48
  };
41
49
 
42
- // TODO: Implement getNearDepositChannel in SwapKitApi
43
- // This endpoint needs to be added to the API for NEAR support
50
+ // TODO: UPSTREAM getNearDepositChannel in SwapKitApi from v3 branch
44
51
  const response = await (SwapKitApi as any).getNearDepositChannel?.(nearDepositChannelParams);
45
52
  if (!response) {
46
53
  throw new SwapKitError("core_plugin_not_found", {
@@ -72,5 +79,139 @@ export const NearPlugin = createPlugin({
72
79
 
73
80
  return txHash;
74
81
  },
82
+
83
+ // NEAR Names functionality
84
+ nearNames: {
85
+ async resolve(name: string) {
86
+ try {
87
+ const normalizedName = name.toLowerCase().replace(/\.near$/, "");
88
+
89
+ if (!validateNearName(normalizedName)) {
90
+ throw new SwapKitError("plugin_near_invalid_name");
91
+ }
92
+
93
+ const wallet = getWallet(Chain.Near);
94
+
95
+ if (!wallet) {
96
+ throw new SwapKitError("plugin_near_no_connection");
97
+ }
98
+
99
+ const result = await wallet.provider.query({
100
+ request_type: "call_function",
101
+ finality: "final",
102
+ account_id: "near",
103
+ method_name: "resolve",
104
+ args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString("base64"),
105
+ });
106
+
107
+ const response = JSON.parse(Buffer.from((result as any).result).toString());
108
+ return response?.owner || null;
109
+ } catch {
110
+ return null;
111
+ }
112
+ },
113
+
114
+ async isAvailable(name: string) {
115
+ const owner = await this.resolve(name);
116
+ return owner === null;
117
+ },
118
+
119
+ async getInfo(name: string) {
120
+ try {
121
+ const normalizedName = name.toLowerCase().replace(/\.near$/, "");
122
+
123
+ if (!validateNearName(normalizedName)) {
124
+ throw new SwapKitError("plugin_near_invalid_name");
125
+ }
126
+
127
+ const wallet = getWallet(Chain.Near);
128
+
129
+ if (!wallet) {
130
+ throw new SwapKitError("plugin_near_no_connection");
131
+ }
132
+
133
+ const result = await wallet.provider.query({
134
+ request_type: "call_function",
135
+ finality: "final",
136
+ account_id: "near",
137
+ method_name: "get_info",
138
+ args_base64: Buffer.from(JSON.stringify({ name: normalizedName })).toString("base64"),
139
+ });
140
+
141
+ const response = JSON.parse(Buffer.from((result as any).result).toString());
142
+ return response || null;
143
+ } catch {
144
+ return null;
145
+ }
146
+ },
147
+
148
+ async lookupNames(accountId: string) {
149
+ try {
150
+ const wallet = getWallet(Chain.Near);
151
+
152
+ if (!wallet) {
153
+ throw new SwapKitError("plugin_near_no_connection");
154
+ }
155
+
156
+ const result = await wallet.provider.query({
157
+ request_type: "call_function",
158
+ finality: "final",
159
+ account_id: "near",
160
+ method_name: "get_names_by_owner",
161
+ args_base64: Buffer.from(JSON.stringify({ account_id: accountId })).toString("base64"),
162
+ });
163
+
164
+ const response = JSON.parse(Buffer.from((result as any).result).toString());
165
+ return Array.isArray(response) ? response.map((n) => `${n}.near`) : [];
166
+ } catch {
167
+ return [];
168
+ }
169
+ },
170
+
171
+ async register(params: NearNameRegistrationParams) {
172
+ const { name, publicKey: publicKeyOverwrite } = params;
173
+ const normalizedName = name.toLowerCase().replace(/\.near$/, "");
174
+
175
+ if (!validateNearName(normalizedName)) {
176
+ throw new SwapKitError("plugin_near_invalid_name");
177
+ }
178
+
179
+ const wallet = getWallet(Chain.Near) as NearWallet;
180
+
181
+ const newPublicKey = publicKeyOverwrite || (await wallet.getPublicKey());
182
+
183
+ const cost = calculateNearNameCost(normalizedName);
184
+
185
+ return wallet.callFunction({
186
+ contractId: "near",
187
+ methodName: "create_account",
188
+ args: {
189
+ new_account_id: `${normalizedName}.near`,
190
+ new_public_key: newPublicKey,
191
+ },
192
+ deposit: cost,
193
+ });
194
+ },
195
+
196
+ transfer(name: string, newOwner: string) {
197
+ const normalizedName = name.toLowerCase().replace(/\.near$/, "");
198
+
199
+ if (!validateNearName(normalizedName)) {
200
+ throw new SwapKitError("plugin_near_invalid_name");
201
+ }
202
+
203
+ const wallet = getWallet(Chain.Near) as NearWallet;
204
+
205
+ return wallet.callFunction({
206
+ contractId: "near",
207
+ methodName: "transfer",
208
+ args: {
209
+ name: normalizedName,
210
+ new_owner: newOwner,
211
+ },
212
+ deposit: "1",
213
+ });
214
+ },
215
+ },
75
216
  }),
76
217
  });
package/src/near/types.ts CHANGED
@@ -53,3 +53,15 @@ export type NearSwapResponse = {
53
53
  srcChain: string;
54
54
  srcToken: string;
55
55
  };
56
+
57
+ export type NearNameInfo = {
58
+ owner: string;
59
+ price?: string;
60
+ expiresAt?: string;
61
+ registeredAt?: string;
62
+ };
63
+
64
+ export type NearNameRegistrationParams = {
65
+ name: string;
66
+ publicKey?: string;
67
+ };
package/src/types.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ChainflipPlugin } from "./chainflip";
2
2
  import type { EVMPlugin } from "./evm";
3
+ import type { NearPlugin } from "./near";
3
4
  import type { RadixPlugin } from "./radix";
4
5
  import type { SolanaPlugin } from "./solana/plugin";
5
6
  import type { ThorchainPlugin } from "./thorchain";
@@ -11,6 +12,7 @@ export type SKPlugins = typeof ChainflipPlugin &
11
12
  typeof ThorchainPlugin &
12
13
  typeof RadixPlugin &
13
14
  typeof SolanaPlugin &
14
- typeof EVMPlugin;
15
+ typeof EVMPlugin &
16
+ typeof NearPlugin;
15
17
 
16
18
  export type PluginName = keyof SKPlugins;
package/src/utils.ts CHANGED
@@ -24,6 +24,10 @@ export async function loadPlugin<P extends PluginName>(pluginName: P) {
24
24
  const { SolanaPlugin } = await import("./solana");
25
25
  return SolanaPlugin;
26
26
  })
27
+ .with("near", async () => {
28
+ const { NearPlugin } = await import("./near");
29
+ return NearPlugin;
30
+ })
27
31
  .exhaustive();
28
32
 
29
33
  return plugin as unknown as SKPlugins[P];