@uswap/toolboxes 4.3.10 → 4.3.11
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/src/cardano/index.cjs.map +2 -2
- package/dist/src/cardano/index.js.map +2 -2
- package/dist/src/cosmos/index.cjs +2 -2
- package/dist/src/cosmos/index.cjs.map +8 -8
- package/dist/src/cosmos/index.js +2 -2
- package/dist/src/cosmos/index.js.map +8 -8
- package/dist/src/evm/index.cjs +2 -2
- package/dist/src/evm/index.cjs.map +5 -5
- package/dist/src/evm/index.js +2 -2
- package/dist/src/evm/index.js.map +5 -5
- package/dist/src/index.cjs +3 -3
- package/dist/src/index.cjs.map +32 -32
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +32 -32
- package/dist/src/near/index.cjs +2 -2
- package/dist/src/near/index.cjs.map +5 -5
- package/dist/src/near/index.js +2 -2
- package/dist/src/near/index.js.map +5 -5
- package/dist/src/radix/index.cjs +2 -2
- package/dist/src/radix/index.cjs.map +3 -3
- package/dist/src/radix/index.js +2 -2
- package/dist/src/radix/index.js.map +3 -3
- package/dist/src/ripple/index.cjs +2 -2
- package/dist/src/ripple/index.cjs.map +3 -3
- package/dist/src/ripple/index.js +2 -2
- package/dist/src/ripple/index.js.map +3 -3
- package/dist/src/solana/index.cjs.map +2 -2
- package/dist/src/solana/index.js.map +2 -2
- package/dist/src/substrate/index.cjs +2 -2
- package/dist/src/substrate/index.cjs.map +4 -4
- package/dist/src/substrate/index.js +2 -2
- package/dist/src/substrate/index.js.map +4 -4
- package/dist/src/sui/index.cjs.map +2 -2
- package/dist/src/sui/index.js.map +2 -2
- package/dist/src/ton/index.cjs +2 -2
- package/dist/src/ton/index.cjs.map +3 -3
- package/dist/src/ton/index.js +2 -2
- package/dist/src/ton/index.js.map +3 -3
- package/dist/src/tron/index.cjs.map +3 -3
- package/dist/src/tron/index.js.map +3 -3
- package/dist/src/utxo/index.cjs +3 -3
- package/dist/src/utxo/index.cjs.map +11 -11
- package/dist/src/utxo/index.js +3 -3
- package/dist/src/utxo/index.js.map +11 -11
- package/dist/types/cardano/toolbox.d.ts +0 -2
- package/dist/types/cardano/toolbox.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts +0 -2
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/messages.d.ts +0 -2
- package/dist/types/cosmos/thorchainUtils/messages.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/cosmos.d.ts +4 -6
- package/dist/types/cosmos/toolbox/cosmos.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/index.d.ts +0 -2
- package/dist/types/cosmos/toolbox/index.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/thorchain.d.ts +4 -6
- package/dist/types/cosmos/toolbox/thorchain.d.ts.map +1 -1
- package/dist/types/cosmos/util.d.ts +0 -2
- package/dist/types/cosmos/util.d.ts.map +1 -1
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +0 -2
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts.map +1 -1
- package/dist/types/evm/toolbox/evm.d.ts.map +1 -1
- package/dist/types/evm/toolbox/op.d.ts +0 -2
- package/dist/types/evm/toolbox/op.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/near/helpers/core.d.ts +0 -2
- package/dist/types/near/helpers/core.d.ts.map +1 -1
- package/dist/types/near/toolbox.d.ts +0 -2
- package/dist/types/near/toolbox.d.ts.map +1 -1
- package/dist/types/radix/index.d.ts +2 -4
- package/dist/types/radix/index.d.ts.map +1 -1
- package/dist/types/ripple/index.d.ts +0 -2
- package/dist/types/ripple/index.d.ts.map +1 -1
- package/dist/types/solana/toolbox.d.ts +0 -2
- package/dist/types/solana/toolbox.d.ts.map +1 -1
- package/dist/types/substrate/balance.d.ts +3 -0
- package/dist/types/substrate/balance.d.ts.map +1 -1
- package/dist/types/substrate/substrate.d.ts +0 -2
- package/dist/types/substrate/substrate.d.ts.map +1 -1
- package/dist/types/sui/toolbox.d.ts +0 -2
- package/dist/types/sui/toolbox.d.ts.map +1 -1
- package/dist/types/ton/toolbox.d.ts +0 -2
- package/dist/types/ton/toolbox.d.ts.map +1 -1
- package/dist/types/tron/helpers/trongrid.d.ts +0 -2
- package/dist/types/tron/helpers/trongrid.d.ts.map +1 -1
- package/dist/types/tron/toolbox.d.ts +0 -2
- package/dist/types/tron/toolbox.d.ts.map +1 -1
- package/dist/types/utils.d.ts +3 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/utxo/helpers/api.d.ts +0 -2
- package/dist/types/utxo/helpers/api.d.ts.map +1 -1
- package/dist/types/utxo/helpers/bchaddrjs.d.ts +0 -2
- package/dist/types/utxo/helpers/bchaddrjs.d.ts.map +1 -1
- package/dist/types/utxo/helpers/coinselect.d.ts +0 -2
- package/dist/types/utxo/helpers/coinselect.d.ts.map +1 -1
- package/dist/types/utxo/helpers/txSize.d.ts +0 -2
- package/dist/types/utxo/helpers/txSize.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts +0 -2
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/index.d.ts +0 -2
- package/dist/types/utxo/toolbox/index.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/utxo.d.ts +0 -2
- package/dist/types/utxo/toolbox/utxo.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/zcash.d.ts +0 -2
- package/dist/types/utxo/toolbox/zcash.d.ts.map +1 -1
- package/package.json +5 -11
- package/src/cardano/toolbox.ts +0 -2
- package/src/cosmos/thorchainUtils/addressFormat.ts +0 -2
- package/src/cosmos/thorchainUtils/messages.ts +0 -2
- package/src/cosmos/toolbox/cosmos.ts +9 -11
- package/src/cosmos/toolbox/index.ts +0 -2
- package/src/cosmos/toolbox/thorchain.ts +6 -8
- package/src/cosmos/util.ts +1 -3
- package/src/evm/__tests__/ethereum.test.ts +6 -2
- package/src/evm/toolbox/baseEVMToolbox.ts +4 -6
- package/src/evm/toolbox/op.ts +0 -2
- package/src/index.ts +0 -2
- package/src/near/helpers/core.ts +0 -2
- package/src/near/toolbox.ts +0 -2
- package/src/radix/index.ts +3 -5
- package/src/ripple/index.ts +2 -4
- package/src/solana/toolbox.ts +0 -2
- package/src/substrate/balance.ts +9 -5
- package/src/substrate/substrate.ts +2 -4
- package/src/sui/toolbox.ts +0 -2
- package/src/ton/toolbox.ts +2 -4
- package/src/tron/__tests__/toolbox.test.ts +6 -2
- package/src/tron/helpers/trongrid.ts +0 -2
- package/src/tron/toolbox.ts +1 -3
- package/src/utils.ts +6 -2
- package/src/utxo/helpers/api.ts +2 -4
- package/src/utxo/helpers/bchaddrjs.ts +0 -2
- package/src/utxo/helpers/coinselect.ts +0 -2
- package/src/utxo/helpers/txSize.ts +0 -2
- package/src/utxo/toolbox/bitcoinCash.ts +0 -2
- package/src/utxo/toolbox/index.ts +0 -2
- package/src/utxo/toolbox/utxo.ts +2 -4
- package/src/utxo/toolbox/zcash.ts +2 -4
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/radix/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type {\n FungibleResourcesCollectionItem,\n GatewayApiClient,\n StateEntityDetailsVaultResponseItem,\n StateEntityFungiblesPageRequest,\n StateEntityFungiblesPageResponse,\n} from \"@radixdlt/babylon-gateway-api-sdk\";\nimport { AssetValue, Chain, USwapConfig, type USwapConfigIntegrations, USwapError } from \"@uswap/helpers\";\n\nexport type RadixWallet = Awaited<ReturnType<typeof RadixToolbox>>;\n\ntype RadixGetBalanceParams = { address: string; networkApi: GatewayApiClient };\n// Could not find anything sync in SDK, ask Radix team\nexport function radixValidateAddress(address: string) {\n return address.startsWith(\"account_rdx1\") && address.length === 66;\n}\n\nfunction getBalance({ networkApi }: { networkApi: GatewayApiClient }) {\n return async function getBalance(address: string) {\n const fungibleResources = await fetchFungibleResources({ address, networkApi });\n const fungibleBalances = await convertResourcesToBalances({ networkApi, resources: fungibleResources });\n\n const hasNativeAsset = fungibleBalances.some((asset) => asset.isGasAsset);\n if (!hasNativeAsset) {\n return [AssetValue.from({ chain: Chain.Radix }), ...fungibleBalances];\n }\n\n return fungibleBalances;\n };\n}\n\nasync function fetchFungibleResources({\n address,\n networkApi,\n}: RadixGetBalanceParams): Promise<FungibleResourcesCollectionItem[]> {\n let hasNextPage = true;\n let nextCursor: string | undefined;\n let fungibleResources: FungibleResourcesCollectionItem[] = [];\n const stateVersion = await currentStateVersion(networkApi);\n while (hasNextPage) {\n const stateEntityFungiblesPageRequest: StateEntityFungiblesPageRequest = {\n address: address,\n at_ledger_state: { state_version: stateVersion },\n cursor: nextCursor,\n limit_per_page: 100,\n };\n\n const stateEntityFungiblesPageResponse: StateEntityFungiblesPageResponse =\n await networkApi.state.innerClient.entityFungiblesPage({\n stateEntityFungiblesPageRequest: stateEntityFungiblesPageRequest,\n });\n\n fungibleResources = fungibleResources.concat(stateEntityFungiblesPageResponse.items);\n if (stateEntityFungiblesPageResponse.next_cursor) {\n nextCursor = stateEntityFungiblesPageResponse.next_cursor;\n } else {\n hasNextPage = false;\n }\n }\n return fungibleResources;\n}\n\nasync function convertResourcesToBalances({\n resources,\n networkApi,\n}: {\n resources: FungibleResourcesCollectionItem[]; //| NonFungibleResourcesCollectionItem[];\n networkApi: GatewayApiClient;\n}): Promise<AssetValue[]> {\n const balances: AssetValue[] = [];\n const BATCH_SIZE = 50;\n\n // Split resources into batches of up to 50 items\n const resourceBatches: FungibleResourcesCollectionItem[][] = [];\n for (let i = 0; i < resources.length; i += BATCH_SIZE) {\n resourceBatches.push(resources.slice(i, i + BATCH_SIZE));\n }\n\n for (const batch of resourceBatches) {\n const addresses = batch.map((item) => item.resource_address);\n const response: StateEntityDetailsVaultResponseItem[] =\n await networkApi.state.getEntityDetailsVaultAggregated(addresses);\n\n const divisibilities = new Map<string, { decimals: number; symbol: string }>();\n\n for (const result of response) {\n if (result.details !== undefined) {\n const metaDataSymbol = result.metadata?.items.find((item) => item.key === \"symbol\");\n const symbol = metaDataSymbol?.value.typed.type === \"String\" ? metaDataSymbol.value.typed.value : \"?\";\n\n if (result.details.type === \"FungibleResource\") {\n divisibilities.set(result.address, { decimals: result.details.divisibility, symbol });\n }\n }\n }\n\n for (const item of batch) {\n if (item.aggregation_level === \"Global\") {\n const assetInfo = divisibilities.get(item.resource_address) || { decimals: 0, symbol: \"?\" };\n\n const balance = AssetValue.from({\n asset:\n assetInfo.symbol !== Chain.Radix\n ? `${Chain.Radix}.${assetInfo.symbol}-${item.resource_address}`\n : \"XRD.XRD\",\n value: item.amount,\n });\n balances.push(balance);\n }\n }\n }\n\n return balances;\n}\n\nfunction currentStateVersion(networkApi: GatewayApiClient) {\n return networkApi.status.getCurrent().then((status) => status.ledger_state.state_version);\n}\n\nexport const RadixToolbox = async ({ dappConfig }: { dappConfig?: USwapConfigIntegrations[\"radix\"] } = {}) => {\n const { RadixDappToolkit } = await import(\"@radixdlt/radix-dapp-toolkit\");\n const { GatewayApiClient } = await import(\"@radixdlt/babylon-gateway-api-sdk\");\n const config = dappConfig || USwapConfig.get(\"integrations\").radix;\n\n const radixToolkit = RadixDappToolkit({ ...config, networkId: config.network?.networkId || 1 });\n\n const networkApi = GatewayApiClient.initialize(radixToolkit.gatewayApi.clientConfig);\n\n return {\n getAddress: () => \"\",\n getBalance: getBalance({ networkApi }),\n networkApi,\n signAndBroadcast: (() => {\n throw new USwapError(\"toolbox_radix_method_not_supported\", { method: \"signAndBroadcast\" });\n }) as (params: any) => Promise<string>,\n validateAddress: radixValidateAddress,\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "qvBAWA,qBAAS,WAAY,iBAAO,gBAA2C,uBAMhE,SAAS,CAAoB,CAAC,EAAiB,CACpD,OAAO,EAAQ,WAAW,cAAc,GAAK,EAAQ,SAAW,GAGlE,SAAS,CAAU,EAAG,cAAgD,CACpE,OAAO,cAAyB,CAAC,EAAiB,CAChD,IAAM,EAAoB,MAAM,EAAuB,CAAE,UAAS,YAAW,CAAC,EACxE,EAAmB,MAAM,EAA2B,CAAE,aAAY,UAAW,CAAkB,CAAC,EAGtG,GAAI,CADmB,EAAiB,KAAK,CAAC,IAAU,EAAM,UAAU,EAEtE,MAAO,CAAC,EAAW,KAAK,CAAE,MAAO,EAAM,KAAM,CAAC,EAAG,GAAG,CAAgB,EAGtE,OAAO,GAIX,eAAe,CAAsB,EACnC,UACA,cACoE,CACpE,IAAI,EAAc,GACd,EACA,EAAuD,CAAC,EACtD,EAAe,MAAM,EAAoB,CAAU,EACzD,MAAO,EAAa,CAClB,IAAM,EAAmE,CACvE,QAAS,EACT,gBAAiB,CAAE,cAAe,CAAa,EAC/C,OAAQ,EACR,eAAgB,GAClB,EAEM,EACJ,MAAM,EAAW,MAAM,YAAY,oBAAoB,CACrD,gCAAiC,CACnC,CAAC,EAGH,GADA,EAAoB,EAAkB,OAAO,EAAiC,KAAK,EAC/E,EAAiC,YACnC,EAAa,EAAiC,YAE9C,OAAc,GAGlB,OAAO,EAGT,eAAe,CAA0B,EACvC,YACA,cAIwB,CACxB,IAAM,EAAyB,CAAC,EAC1B,EAAa,GAGb,EAAuD,CAAC,EAC9D,QAAS,EAAI,EAAG,EAAI,EAAU,OAAQ,GAJnB,GAKjB,EAAgB,KAAK,EAAU,MAAM,EAAG,EALvB,EAKqC,CAAC,EAGzD,QAAW,KAAS,EAAiB,CACnC,IAAM,EAAY,EAAM,IAAI,CAAC,IAAS,EAAK,gBAAgB,EACrD,EACJ,MAAM,EAAW,MAAM,gCAAgC,CAAS,EAE5D,EAAiB,IAAI,IAE3B,QAAW,KAAU,EACnB,GAAI,EAAO,UAAY,OAAW,CAChC,IAAM,EAAiB,EAAO,UAAU,MAAM,KAAK,CAAC,IAAS,EAAK,MAAQ,QAAQ,EAC5E,EAAS,GAAgB,MAAM,MAAM,OAAS,SAAW,EAAe,MAAM,MAAM,MAAQ,IAElG,GAAI,EAAO,QAAQ,OAAS,mBAC1B,EAAe,IAAI,EAAO,QAAS,CAAE,SAAU,EAAO,QAAQ,aAAc,QAAO,CAAC,EAK1F,QAAW,KAAQ,EACjB,GAAI,EAAK,oBAAsB,SAAU,CACvC,IAAM,EAAY,EAAe,IAAI,EAAK,gBAAgB,GAAK,CAAE,SAAU,EAAG,OAAQ,GAAI,EAEpF,EAAU,EAAW,KAAK,CAC9B,MACE,EAAU,SAAW,EAAM,MACvB,GAAG,EAAM,SAAS,EAAU,UAAU,EAAK,mBAC3C,UACN,MAAO,EAAK,MACd,CAAC,EACD,EAAS,KAAK,CAAO,GAK3B,OAAO,EAGT,SAAS,CAAmB,CAAC,EAA8B,CACzD,OAAO,EAAW,OAAO,WAAW,EAAE,KAAK,CAAC,IAAW,EAAO,aAAa,aAAa,MAG7E,EAAe,OAAS,cAAkE,CAAC,IAAM,CAC5G,IAAQ,oBAAqB,KAAa,yCAClC,oBAAqB,KAAa,6CACpC,EAAS,GAAc,EAAY,IAAI,cAAc,EAAE,MAEvD,EAAe,EAAiB,IAAK,EAAQ,UAAW,EAAO,SAAS,WAAa,CAAE,CAAC,EAExF,EAAa,EAAiB,WAAW,EAAa,WAAW,YAAY,EAEnF,MAAO,CACL,WAAY,IAAM,GAClB,WAAY,EAAW,CAAE,YAAW,CAAC,EACrC,aACA,iBAAmB,IAAM,CACvB,MAAM,IAAI,EAAW,qCAAsC,CAAE,OAAQ,kBAAmB,CAAC,GAE3F,gBAAiB,CACnB",
|
|
8
|
+
"debugId": "633BEA2D0D8D689664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var f=Object.create;var{getPrototypeOf:R,defineProperty:
|
|
1
|
+
var f=Object.create;var{getPrototypeOf:R,defineProperty:Y,getOwnPropertyNames:N,getOwnPropertyDescriptor:D}=Object,W=Object.prototype.hasOwnProperty;var u=(j,q,z)=>{z=j!=null?f(R(j)):{};let y=q||!j||!j.__esModule?Y(z,"default",{value:j,enumerable:!0}):z;for(let Q of N(j))if(!W.call(y,Q))Y(y,Q,{get:()=>j[Q],enumerable:!0});return y},L=new WeakMap,b=(j)=>{var q=L.get(j),z;if(q)return q;if(q=Y({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")N(j).map((y)=>!W.call(q,y)&&Y(q,y,{get:()=>j[y],enumerable:!(z=D(j,y))||z.enumerable}));return L.set(j,q),q};var A=(j,q)=>{for(var z in q)Y(j,z,{get:q[z],enumerable:!0,configurable:!0,set:(y)=>q[z]=()=>y})};var T=(j,q)=>()=>(j&&(q=j(j=0)),q);var S={};A(S,{rippleValidateAddress:()=>$,hashes:()=>O.hashes,getRippleToolbox:()=>E});module.exports=b(S);function H(j){let q=M.Wallet.fromMnemonic(j);return{getAddress:()=>Promise.resolve(q.address),signTransaction:(z)=>Promise.resolve(q.sign(z))}}function $(j){return M.isValidAddress(j)}var k,M,O,w,E=async(j={})=>{let q="signer"in j&&j.signer?j.signer:("phrase"in j)&&j.phrase?H(j.phrase):void 0,z=await k.getRPCUrl(k.Chain.Ripple);if(!z)throw new k.USwapError({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:k.Chain.Ripple}});let y=new M.Client(z);await y.connect();let Q=()=>{if(!q)throw new k.USwapError({errorKey:"toolbox_ripple_signer_not_found"});return q.getAddress()},_=async(G)=>{let K=G||await Q(),{baseDecimal:J}=k.getChainConfig(k.Chain.Ripple);try{let Z=(await y.request({account:K,command:"account_info"})).result.account_data.Balance;return[k.AssetValue.from({chain:k.Chain.Ripple,fromBaseDecimal:J,value:Z})]}catch(X){if(X.data.error_code===w.ACCOUNT_NOT_FOUND)return[k.AssetValue.from({chain:k.Chain.Ripple,value:0})];throw new k.USwapError("toolbox_ripple_get_balance_error",{info:{address:K,error:X}})}},P=async()=>{let K=(await y.request({command:"fee"})).result.drops.open_ledger_fee,{baseDecimal:J}=k.getChainConfig(k.Chain.Ripple);return k.AssetValue.from({chain:k.Chain.Ripple,fromBaseDecimal:J,value:k.USwapNumber.fromBigInt(BigInt(K),J)})},v=async({assetValue:G,recipient:K,memo:J,sender:X})=>{if(!$(K))throw new k.USwapError({errorKey:"core_transaction_invalid_recipient_address"});let Z=X||await Q();if(!G.isGasAsset||G.chain!==k.Chain.Ripple)throw new k.USwapError({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:G.toString()}});let I={Account:Z,Amount:M.xrpToDrops(G.getValue("string")),Destination:K,TransactionType:"Payment"};if(J)I.Memos=[{Memo:{MemoData:Buffer.from(J).toString("hex")}}];return await y.autofill(I)},B=(G)=>{if(!q)throw new k.USwapError({errorKey:"toolbox_ripple_signer_not_found"});return q.signTransaction(G)},F=async(G)=>{let J=(await y.submitAndWait(G)).result;if(J.validated)return J.hash;throw new k.USwapError({errorKey:"toolbox_ripple_broadcast_error",info:{chain:k.Chain.Ripple}})};return{broadcastTransaction:F,createSigner:H,createTransaction:v,disconnect:()=>y.disconnect(),estimateTransactionFee:P,getAddress:Q,getBalance:_,signer:q,signTransaction:B,transfer:async(G)=>{if(!q)throw new k.USwapError({errorKey:"toolbox_ripple_signer_not_found"});let K=await q.getAddress(),J=await v({...G,sender:K}),X=await B(J);return F(X.tx_blob)},validateAddress:$}};var U=T(()=>{k=require("@uswap/helpers"),M=require("xrpl"),O=require("xrpl"),w={ACCOUNT_NOT_FOUND:19}});U();
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=2ADD354EAB2FE6A564756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ripple/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AssetValue,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n getChainConfig,\n getRPCUrl,\n USwapError,\n USwapNumber,\n} from \"@uswap/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, isValidAddress, type Payment, Wallet, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\nexport { hashes, type Transaction } from \"xrpl\";\n\nconst RIPPLE_ERROR_CODES = { ACCOUNT_NOT_FOUND: 19 } as const;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase?: string }\n | { signer?: ChainSigner<Transaction, { tx_blob: string; hash: string }> };\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = await getRPCUrl(Chain.Ripple);\n if (!rpcUrl) {\n throw new USwapError({ errorKey: \"toolbox_ripple_rpc_not_configured\", info: { chain: Chain.Ripple } });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n const { baseDecimal } = getChainConfig(Chain.Ripple);\n\n try {\n const accountInfo = await client.request({ account: addr, command: \"account_info\" });\n\n const balance = accountInfo.result.account_data.Balance;\n\n return [AssetValue.from({ chain: Chain.Ripple, fromBaseDecimal: baseDecimal, value: balance })];\n } catch (error) {\n // empty account\n if ((error as any).data.error_code === RIPPLE_ERROR_CODES.ACCOUNT_NOT_FOUND) {\n return [AssetValue.from({ chain: Chain.Ripple, value: 0 })];\n }\n throw new USwapError(\"toolbox_ripple_get_balance_error\", { info: { address: addr, error } });\n }\n };\n\n const estimateTransactionFee = async () => {\n const feeResponse = await client.request({ command: \"fee\" });\n const feeDrops = feeResponse.result.drops.open_ledger_fee; // Fee in drops\n\n const { baseDecimal } = getChainConfig(Chain.Ripple);\n\n return AssetValue.from({\n chain: Chain.Ripple,\n fromBaseDecimal: baseDecimal,\n value: USwapNumber.fromBigInt(BigInt(feeDrops), baseDecimal),\n });\n };\n\n const createTransaction = async ({\n assetValue,\n recipient,\n memo,\n sender,\n }: {\n assetValue: AssetValue;\n recipient: string;\n sender?: string;\n memo?: string;\n }) => {\n if (!rippleValidateAddress(recipient)) {\n throw new USwapError({ errorKey: \"core_transaction_invalid_recipient_address\" });\n }\n\n const senderAddress = sender || (await getAddress());\n\n if (!assetValue.isGasAsset || assetValue.chain !== Chain.Ripple) {\n throw new USwapError({ errorKey: \"toolbox_ripple_asset_not_supported\", info: { asset: assetValue.toString() } });\n }\n\n const transaction: Payment = {\n Account: senderAddress,\n Amount: xrpToDrops(assetValue.getValue(\"string\")),\n Destination: recipient,\n TransactionType: \"Payment\",\n };\n\n if (memo) {\n transaction.Memos = [{ Memo: { MemoData: Buffer.from(memo).toString(\"hex\") } }];\n }\n\n const preparedTx = await client.autofill(transaction);\n return preparedTx;\n };\n\n const signTransaction = (tx: Transaction) => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.signTransaction(tx);\n };\n\n const broadcastTransaction = async (signedTxHex: string) => {\n const submitResult = await client.submitAndWait(signedTxHex);\n const result = submitResult.result;\n\n if (result.validated) {\n return result.hash;\n }\n\n throw new USwapError({ errorKey: \"toolbox_ripple_broadcast_error\", info: { chain: Chain.Ripple } });\n };\n\n const transfer = async (params: GenericTransferParams) => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n const sender = await signer.getAddress();\n const tx = await createTransaction({ ...params, sender });\n const signedTx = await signTransaction(tx);\n return broadcastTransaction(signedTx.tx_blob);\n };\n\n const disconnect = () => client.disconnect();\n\n return {\n broadcastTransaction,\n createSigner, // Expose the helper\n createTransaction,\n disconnect,\n estimateTransactionFee,\n // Core methods\n getAddress,\n getBalance,\n // Signer related\n signer, // Expose the signer instance if created/provided\n signTransaction,\n transfer,\n validateAddress: rippleValidateAddress,\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "2ADD354EAB2FE6A564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/src/ripple/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var _=Object.create;var{getPrototypeOf:P,defineProperty
|
|
1
|
+
var _=Object.create;var{getPrototypeOf:P,defineProperty:Z,getOwnPropertyNames:f}=Object;var R=Object.prototype.hasOwnProperty;var c=(j,k,q)=>{q=j!=null?_(P(j)):{};let z=k||!j||!j.__esModule?Z(q,"default",{value:j,enumerable:!0}):q;for(let Q of f(j))if(!R.call(z,Q))Z(z,Q,{get:()=>j[Q],enumerable:!0});return z};var D=(j,k)=>{for(var q in k)Z(j,q,{get:k[q],enumerable:!0,configurable:!0,set:(z)=>k[q]=()=>z})};var b=(j,k)=>()=>(j&&(k=j(j=0)),k);var d=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(k,q)=>(typeof require<"u"?require:k)[q]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});var h={};D(h,{rippleValidateAddress:()=>v,hashes:()=>u,getRippleToolbox:()=>V});import{AssetValue as $,Chain as K,getChainConfig as N,getRPCUrl as A,USwapError as M,USwapNumber as T}from"@uswap/helpers";import{Client as w,isValidAddress as E,Wallet as S,xrpToDrops as U}from"xrpl";import{hashes as u}from"xrpl";function W(j){let k=S.fromMnemonic(j);return{getAddress:()=>Promise.resolve(k.address),signTransaction:(q)=>Promise.resolve(k.sign(q))}}function v(j){return E(j)}var x,V=async(j={})=>{let k="signer"in j&&j.signer?j.signer:("phrase"in j)&&j.phrase?W(j.phrase):void 0,q=await A(K.Ripple);if(!q)throw new M({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:K.Ripple}});let z=new w(q);await z.connect();let Q=()=>{if(!k)throw new M({errorKey:"toolbox_ripple_signer_not_found"});return k.getAddress()},H=async(y)=>{let J=y||await Q(),{baseDecimal:G}=N(K.Ripple);try{let Y=(await z.request({account:J,command:"account_info"})).result.account_data.Balance;return[$.from({chain:K.Ripple,fromBaseDecimal:G,value:Y})]}catch(X){if(X.data.error_code===x.ACCOUNT_NOT_FOUND)return[$.from({chain:K.Ripple,value:0})];throw new M("toolbox_ripple_get_balance_error",{info:{address:J,error:X}})}},O=async()=>{let J=(await z.request({command:"fee"})).result.drops.open_ledger_fee,{baseDecimal:G}=N(K.Ripple);return $.from({chain:K.Ripple,fromBaseDecimal:G,value:T.fromBigInt(BigInt(J),G)})},B=async({assetValue:y,recipient:J,memo:G,sender:X})=>{if(!v(J))throw new M({errorKey:"core_transaction_invalid_recipient_address"});let Y=X||await Q();if(!y.isGasAsset||y.chain!==K.Ripple)throw new M({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:y.toString()}});let L={Account:Y,Amount:U(y.getValue("string")),Destination:J,TransactionType:"Payment"};if(G)L.Memos=[{Memo:{MemoData:Buffer.from(G).toString("hex")}}];return await z.autofill(L)},F=(y)=>{if(!k)throw new M({errorKey:"toolbox_ripple_signer_not_found"});return k.signTransaction(y)},I=async(y)=>{let G=(await z.submitAndWait(y)).result;if(G.validated)return G.hash;throw new M({errorKey:"toolbox_ripple_broadcast_error",info:{chain:K.Ripple}})};return{broadcastTransaction:I,createSigner:W,createTransaction:B,disconnect:()=>z.disconnect(),estimateTransactionFee:O,getAddress:Q,getBalance:H,signer:k,signTransaction:F,transfer:async(y)=>{if(!k)throw new M({errorKey:"toolbox_ripple_signer_not_found"});let J=await k.getAddress(),G=await B({...y,sender:J}),X=await F(G);return I(X.tx_blob)},validateAddress:v}};var C=b(()=>{x={ACCOUNT_NOT_FOUND:19}});C();export{v as rippleValidateAddress,u as hashes,V as getRippleToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=500234AADA5AC07564756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ripple/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AssetValue,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n getChainConfig,\n getRPCUrl,\n USwapError,\n USwapNumber,\n} from \"@uswap/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, isValidAddress, type Payment, Wallet, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\nexport { hashes, type Transaction } from \"xrpl\";\n\nconst RIPPLE_ERROR_CODES = { ACCOUNT_NOT_FOUND: 19 } as const;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase?: string }\n | { signer?: ChainSigner<Transaction, { tx_blob: string; hash: string }> };\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = await getRPCUrl(Chain.Ripple);\n if (!rpcUrl) {\n throw new USwapError({ errorKey: \"toolbox_ripple_rpc_not_configured\", info: { chain: Chain.Ripple } });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n const { baseDecimal } = getChainConfig(Chain.Ripple);\n\n try {\n const accountInfo = await client.request({ account: addr, command: \"account_info\" });\n\n const balance = accountInfo.result.account_data.Balance;\n\n return [AssetValue.from({ chain: Chain.Ripple, fromBaseDecimal: baseDecimal, value: balance })];\n } catch (error) {\n // empty account\n if ((error as any).data.error_code === RIPPLE_ERROR_CODES.ACCOUNT_NOT_FOUND) {\n return [AssetValue.from({ chain: Chain.Ripple, value: 0 })];\n }\n throw new USwapError(\"toolbox_ripple_get_balance_error\", { info: { address: addr, error } });\n }\n };\n\n const estimateTransactionFee = async () => {\n const feeResponse = await client.request({ command: \"fee\" });\n const feeDrops = feeResponse.result.drops.open_ledger_fee; // Fee in drops\n\n const { baseDecimal } = getChainConfig(Chain.Ripple);\n\n return AssetValue.from({\n chain: Chain.Ripple,\n fromBaseDecimal: baseDecimal,\n value: USwapNumber.fromBigInt(BigInt(feeDrops), baseDecimal),\n });\n };\n\n const createTransaction = async ({\n assetValue,\n recipient,\n memo,\n sender,\n }: {\n assetValue: AssetValue;\n recipient: string;\n sender?: string;\n memo?: string;\n }) => {\n if (!rippleValidateAddress(recipient)) {\n throw new USwapError({ errorKey: \"core_transaction_invalid_recipient_address\" });\n }\n\n const senderAddress = sender || (await getAddress());\n\n if (!assetValue.isGasAsset || assetValue.chain !== Chain.Ripple) {\n throw new USwapError({ errorKey: \"toolbox_ripple_asset_not_supported\", info: { asset: assetValue.toString() } });\n }\n\n const transaction: Payment = {\n Account: senderAddress,\n Amount: xrpToDrops(assetValue.getValue(\"string\")),\n Destination: recipient,\n TransactionType: \"Payment\",\n };\n\n if (memo) {\n transaction.Memos = [{ Memo: { MemoData: Buffer.from(memo).toString(\"hex\") } }];\n }\n\n const preparedTx = await client.autofill(transaction);\n return preparedTx;\n };\n\n const signTransaction = (tx: Transaction) => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.signTransaction(tx);\n };\n\n const broadcastTransaction = async (signedTxHex: string) => {\n const submitResult = await client.submitAndWait(signedTxHex);\n const result = submitResult.result;\n\n if (result.validated) {\n return result.hash;\n }\n\n throw new USwapError({ errorKey: \"toolbox_ripple_broadcast_error\", info: { chain: Chain.Ripple } });\n };\n\n const transfer = async (params: GenericTransferParams) => {\n if (!signer) {\n throw new USwapError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n const sender = await signer.getAddress();\n const tx = await createTransaction({ ...params, sender });\n const signedTx = await signTransaction(tx);\n return broadcastTransaction(signedTx.tx_blob);\n };\n\n const disconnect = () => client.disconnect();\n\n return {\n broadcastTransaction,\n createSigner, // Expose the helper\n createTransaction,\n disconnect,\n estimateTransactionFee,\n // Core methods\n getAddress,\n getBalance,\n // Signer related\n signer, // Expose the signer instance if created/provided\n signTransaction,\n transfer,\n validateAddress: rippleValidateAddress,\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "500234AADA5AC07564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/solana/toolbox.ts", "../src/solana/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Based on code from SwapKit (https://github.com/swapkit/SwapKit),\n * licensed under the Apache License 2.0.\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n type GenericCreateTransactionParams,\n getChainConfig,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n} from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \"./index\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n id: string; // mint address\n};\n\nexport async function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n const assetValue = AssetValue.from({ address: mintAddress, chain: Chain.Solana });\n if (assetValue.symbol !== \"UNKNOWN\") {\n return {\n decimals: assetValue.decimal || 0,\n id: mintAddress,\n logoURI: assetValue.getIconUrl(),\n name: assetValue.symbol,\n symbol: assetValue.ticker,\n };\n }\n\n const url = `https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(mintAddress)}`;\n\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n\n const arr = (await res.json()) as TokenMetadata[];\n if (!Array.isArray(arr) || arr.length === 0) return null;\n\n const exact = arr.find((t) => t.id === mintAddress);\n return exact || null;\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n const solBalance = await connection.getBalance(publicKey);\n const balances = [AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: solBalance || 0 })];\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, { programId: TOKEN_PROGRAM_ID });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n const metadata = await fetchTokenMetaData(mintAddress);\n const ticker = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({ asset: `${Chain.Solana}.${ticker}-${mintAddress}`, fromBaseDecimal: decimals, value: amount }),\n );\n }\n\n return balances;\n}\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSolanaToolbox(\n toolboxParams?: { signer?: SolanaSigner } | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ derivationPath, phrase }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n function getBalance(addressParam?: string) {\n const address = addressParam || getAddress();\n if (!address) throw new USwapError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n }\n\n return {\n broadcastTransaction: broadcastTransaction(getConnection),\n createKeysForPath,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n estimateTransactionFee: estimateTransactionFee(getConnection),\n getAddress,\n getAddressFromPubKey,\n getAddressValidator: getSolanaAddressValidator,\n getBalance,\n getConnection,\n getPubkeyFromAddress,\n signTransaction: signTransaction(getConnection, signer),\n transfer: transfer(getConnection, signer),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new USwapError(\"toolbox_solana_fee_estimation_failed\", \"Could not estimate Solana fee.\");\n }\n\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n return AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: feeInLamports.value });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n const rpcUrl = await getRPCUrl(Chain.Solana);\n return new Connection(rpcUrl, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({ assetValue, recipient, sender, isProgramDerivedAddress }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n isProgramDerivedAddress,\n recipient,\n tokenAddress: assetValue.address,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(from, recipientSPLAddress, recipientPublicKey, tokenPublicKey),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(fromSPLAddress, tokenPublicKey, recipientSPLAddress, from, amount, decimals),\n );\n\n return transaction;\n}\n\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress, sender }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new USwapError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n recipient,\n sender,\n });\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: {\n instructions: TransactionInstruction[];\n isProgramDerivedAddress?: boolean;\n}) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender = signer.publicKey?.toString() ?? (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n if (\"signTransaction\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new USwapError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: {\n phrase: string;\n derivationPath?: string;\n}) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n",
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n type GenericCreateTransactionParams,\n getChainConfig,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n} from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \"./index\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n id: string; // mint address\n};\n\nexport async function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n const assetValue = AssetValue.from({ address: mintAddress, chain: Chain.Solana });\n if (assetValue.symbol !== \"UNKNOWN\") {\n return {\n decimals: assetValue.decimal || 0,\n id: mintAddress,\n logoURI: assetValue.getIconUrl(),\n name: assetValue.symbol,\n symbol: assetValue.ticker,\n };\n }\n\n const url = `https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(mintAddress)}`;\n\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n\n const arr = (await res.json()) as TokenMetadata[];\n if (!Array.isArray(arr) || arr.length === 0) return null;\n\n const exact = arr.find((t) => t.id === mintAddress);\n return exact || null;\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n const solBalance = await connection.getBalance(publicKey);\n const balances = [AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: solBalance || 0 })];\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, { programId: TOKEN_PROGRAM_ID });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n const metadata = await fetchTokenMetaData(mintAddress);\n const ticker = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({ asset: `${Chain.Solana}.${ticker}-${mintAddress}`, fromBaseDecimal: decimals, value: amount }),\n );\n }\n\n return balances;\n}\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSolanaToolbox(\n toolboxParams?: { signer?: SolanaSigner } | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ derivationPath, phrase }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n function getBalance(addressParam?: string) {\n const address = addressParam || getAddress();\n if (!address) throw new USwapError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n }\n\n return {\n broadcastTransaction: broadcastTransaction(getConnection),\n createKeysForPath,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n estimateTransactionFee: estimateTransactionFee(getConnection),\n getAddress,\n getAddressFromPubKey,\n getAddressValidator: getSolanaAddressValidator,\n getBalance,\n getConnection,\n getPubkeyFromAddress,\n signTransaction: signTransaction(getConnection, signer),\n transfer: transfer(getConnection, signer),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new USwapError(\"toolbox_solana_fee_estimation_failed\", \"Could not estimate Solana fee.\");\n }\n\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n return AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: feeInLamports.value });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n const rpcUrl = await getRPCUrl(Chain.Solana);\n return new Connection(rpcUrl, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({ assetValue, recipient, sender, isProgramDerivedAddress }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n isProgramDerivedAddress,\n recipient,\n tokenAddress: assetValue.address,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(from, recipientSPLAddress, recipientPublicKey, tokenPublicKey),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(fromSPLAddress, tokenPublicKey, recipientSPLAddress, from, amount, decimals),\n );\n\n return transaction;\n}\n\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress, sender }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new USwapError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n recipient,\n sender,\n });\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: {\n instructions: TransactionInstruction[];\n isProgramDerivedAddress?: boolean;\n}) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender = signer.publicKey?.toString() ?? (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n if (\"signTransaction\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new USwapError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: {\n phrase: string;\n derivationPath?: string;\n}) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n",
|
|
6
6
|
"import type { PublicKey, Transaction, VersionedTransaction } from \"@solana/web3.js\";\nimport type { GenericCreateTransactionParams, GenericTransferParams } from \"@uswap/helpers\";\nimport type { getSolanaToolbox } from \"./toolbox\";\n\n// type DisplayEncoding = \"utf8\" | \"hex\";\n\n// type PhantomRequestMethod =\n// | \"connect\"\n// | \"disconnect\"\n// | \"signAndSendTransaction\"\n// | \"signAndSendTransactionV0\"\n// | \"signAndSendTransactionV0WithLookupTable\"\n// | \"signTransaction\"\n// | \"signAllTransactions\"\n// | \"signMessage\";\n\ninterface ConnectOpts {\n onlyIfTrusted: boolean;\n}\n\nexport * from \"./toolbox\";\n\nexport type SolanaWallet = Awaited<ReturnType<typeof getSolanaToolbox>>;\n\nexport interface SolanaProvider {\n connect: (opts?: Partial<ConnectOpts>) => Promise<{ publicKey: PublicKey }>;\n disconnect: () => Promise<void>;\n publicKey: PublicKey | null;\n signTransaction: <T extends Transaction | VersionedTransaction = Transaction>(transaction: T) => Promise<T>;\n}\n\nexport type SolanaCreateTransactionParams = Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n};\n\nexport type SolanaTransferParams = Omit<GenericTransferParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean };\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
8
|
+
"mappings": "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",
|
|
9
9
|
"debugId": "68A405449BF2FB2C64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/solana/toolbox.ts", "../src/solana/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Based on code from SwapKit (https://github.com/swapkit/SwapKit),\n * licensed under the Apache License 2.0.\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n type GenericCreateTransactionParams,\n getChainConfig,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n} from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \"./index\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n id: string; // mint address\n};\n\nexport async function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n const assetValue = AssetValue.from({ address: mintAddress, chain: Chain.Solana });\n if (assetValue.symbol !== \"UNKNOWN\") {\n return {\n decimals: assetValue.decimal || 0,\n id: mintAddress,\n logoURI: assetValue.getIconUrl(),\n name: assetValue.symbol,\n symbol: assetValue.ticker,\n };\n }\n\n const url = `https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(mintAddress)}`;\n\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n\n const arr = (await res.json()) as TokenMetadata[];\n if (!Array.isArray(arr) || arr.length === 0) return null;\n\n const exact = arr.find((t) => t.id === mintAddress);\n return exact || null;\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n const solBalance = await connection.getBalance(publicKey);\n const balances = [AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: solBalance || 0 })];\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, { programId: TOKEN_PROGRAM_ID });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n const metadata = await fetchTokenMetaData(mintAddress);\n const ticker = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({ asset: `${Chain.Solana}.${ticker}-${mintAddress}`, fromBaseDecimal: decimals, value: amount }),\n );\n }\n\n return balances;\n}\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSolanaToolbox(\n toolboxParams?: { signer?: SolanaSigner } | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ derivationPath, phrase }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n function getBalance(addressParam?: string) {\n const address = addressParam || getAddress();\n if (!address) throw new USwapError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n }\n\n return {\n broadcastTransaction: broadcastTransaction(getConnection),\n createKeysForPath,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n estimateTransactionFee: estimateTransactionFee(getConnection),\n getAddress,\n getAddressFromPubKey,\n getAddressValidator: getSolanaAddressValidator,\n getBalance,\n getConnection,\n getPubkeyFromAddress,\n signTransaction: signTransaction(getConnection, signer),\n transfer: transfer(getConnection, signer),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new USwapError(\"toolbox_solana_fee_estimation_failed\", \"Could not estimate Solana fee.\");\n }\n\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n return AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: feeInLamports.value });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n const rpcUrl = await getRPCUrl(Chain.Solana);\n return new Connection(rpcUrl, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({ assetValue, recipient, sender, isProgramDerivedAddress }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n isProgramDerivedAddress,\n recipient,\n tokenAddress: assetValue.address,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(from, recipientSPLAddress, recipientPublicKey, tokenPublicKey),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(fromSPLAddress, tokenPublicKey, recipientSPLAddress, from, amount, decimals),\n );\n\n return transaction;\n}\n\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress, sender }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new USwapError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n recipient,\n sender,\n });\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: {\n instructions: TransactionInstruction[];\n isProgramDerivedAddress?: boolean;\n}) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender = signer.publicKey?.toString() ?? (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n if (\"signTransaction\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new USwapError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: {\n phrase: string;\n derivationPath?: string;\n}) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n",
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n type GenericCreateTransactionParams,\n getChainConfig,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n} from \"@uswap/helpers\";\nimport { match, P } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \"./index\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n id: string; // mint address\n};\n\nexport async function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n const assetValue = AssetValue.from({ address: mintAddress, chain: Chain.Solana });\n if (assetValue.symbol !== \"UNKNOWN\") {\n return {\n decimals: assetValue.decimal || 0,\n id: mintAddress,\n logoURI: assetValue.getIconUrl(),\n name: assetValue.symbol,\n symbol: assetValue.ticker,\n };\n }\n\n const url = `https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(mintAddress)}`;\n\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n\n const arr = (await res.json()) as TokenMetadata[];\n if (!Array.isArray(arr) || arr.length === 0) return null;\n\n const exact = arr.find((t) => t.id === mintAddress);\n return exact || null;\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n const solBalance = await connection.getBalance(publicKey);\n const balances = [AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: solBalance || 0 })];\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, { programId: TOKEN_PROGRAM_ID });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n const metadata = await fetchTokenMetaData(mintAddress);\n const ticker = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({ asset: `${Chain.Solana}.${ticker}-${mintAddress}`, fromBaseDecimal: decimals, value: amount }),\n );\n }\n\n return balances;\n}\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch {\n return false;\n }\n };\n}\n\nexport async function getSolanaToolbox(\n toolboxParams?: { signer?: SolanaSigner } | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ derivationPath, phrase }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n function getBalance(addressParam?: string) {\n const address = addressParam || getAddress();\n if (!address) throw new USwapError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n }\n\n return {\n broadcastTransaction: broadcastTransaction(getConnection),\n createKeysForPath,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n estimateTransactionFee: estimateTransactionFee(getConnection),\n getAddress,\n getAddressFromPubKey,\n getAddressValidator: getSolanaAddressValidator,\n getBalance,\n getConnection,\n getPubkeyFromAddress,\n signTransaction: signTransaction(getConnection, signer),\n transfer: transfer(getConnection, signer),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new USwapError(\"toolbox_solana_fee_estimation_failed\", \"Could not estimate Solana fee.\");\n }\n\n const { baseDecimal } = getChainConfig(Chain.Solana);\n\n return AssetValue.from({ chain: Chain.Solana, fromBaseDecimal: baseDecimal, value: feeInLamports.value });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n const rpcUrl = await getRPCUrl(Chain.Solana);\n return new Connection(rpcUrl, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({ assetValue, recipient, sender, isProgramDerivedAddress }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n isProgramDerivedAddress,\n recipient,\n tokenAddress: assetValue.address,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(from, recipientSPLAddress, recipientPublicKey, tokenPublicKey),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(fromSPLAddress, tokenPublicKey, recipientSPLAddress, from, amount, decimals),\n );\n\n return transaction;\n}\n\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress, sender }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new USwapError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n recipient,\n sender,\n });\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: {\n instructions: TransactionInstruction[];\n isProgramDerivedAddress?: boolean;\n}) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new USwapError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender = signer.publicKey?.toString() ?? (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n assetValue,\n isProgramDerivedAddress,\n memo,\n recipient,\n sender,\n });\n\n if (\"signTransaction\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new USwapError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: {\n phrase: string;\n derivationPath?: string;\n}) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n",
|
|
6
6
|
"import type { PublicKey, Transaction, VersionedTransaction } from \"@solana/web3.js\";\nimport type { GenericCreateTransactionParams, GenericTransferParams } from \"@uswap/helpers\";\nimport type { getSolanaToolbox } from \"./toolbox\";\n\n// type DisplayEncoding = \"utf8\" | \"hex\";\n\n// type PhantomRequestMethod =\n// | \"connect\"\n// | \"disconnect\"\n// | \"signAndSendTransaction\"\n// | \"signAndSendTransactionV0\"\n// | \"signAndSendTransactionV0WithLookupTable\"\n// | \"signTransaction\"\n// | \"signAllTransactions\"\n// | \"signMessage\";\n\ninterface ConnectOpts {\n onlyIfTrusted: boolean;\n}\n\nexport * from \"./toolbox\";\n\nexport type SolanaWallet = Awaited<ReturnType<typeof getSolanaToolbox>>;\n\nexport interface SolanaProvider {\n connect: (opts?: Partial<ConnectOpts>) => Promise<{ publicKey: PublicKey }>;\n disconnect: () => Promise<void>;\n publicKey: PublicKey | null;\n signTransaction: <T extends Transaction | VersionedTransaction = Transaction>(transaction: T) => Promise<T>;\n}\n\nexport type SolanaCreateTransactionParams = Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n};\n\nexport type SolanaTransferParams = Omit<GenericTransferParams, \"feeRate\"> & { isProgramDerivedAddress?: boolean };\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "
|
|
8
|
+
"mappings": "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",
|
|
9
9
|
"debugId": "163AF3CC0C28763464756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var B=Object.create;var{getPrototypeOf:U,defineProperty:f,getOwnPropertyNames:A,getOwnPropertyDescriptor:V}=Object,C=Object.prototype.hasOwnProperty;var P=(t,e,n)=>{n=t!=null?B(U(t)):{};let r=e||!t||!t.__esModule?f(n,"default",{value:t,enumerable:!0}):n;for(let i of A(t))if(!C.call(r,i))f(r,i,{get:()=>t[i],enumerable:!0});return r},v=new WeakMap,H=(t)=>{var e=v.get(t),n;if(e)return e;if(e=f({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")A(t).map((r)=>!C.call(e,r)&&f(e,r,{get:()=>t[r],enumerable:!(n=V(t,r))||n.enumerable}));return v.set(t,e),e};var L=(t,e)=>{for(var n in e)f(t,n,{get:e[n],enumerable:!0,configurable:!0,set:(r)=>e[n]=()=>r})};var g=(t,e)=>()=>(t&&(e=t(t=0)),e);async function W(t,e,n){try{let r=await t.query.system?.account?.(n);if(!r)return[e.set(0)];let{data:{free:i}}=r,o=l.USwapNumber.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching substrate balance: ${i}`),[e.set(0)]}}async function O(t,e,n){try{let r=await t.query.flip?.account?.(n);if(!r)return[e.set(0)];let i=r.balance||r.data?.balance;if(!i||i.isEmpty)return[e.set(0)];let o=l.USwapNumber.fromBigInt(BigInt(i.toString()),e.decimal).getValue("string");return[e.set(o)]}catch(r){let i=r instanceof Error?r.message:String(r);return console.error(`Error fetching chainflip balance: ${i}`),[e.set(0)]}}function E(t,e){return function(r){let i=l.AssetValue.from({chain:t});switch(t){case l.Chain.Chainflip:return O(e,i,r);default:return W(e,i,r)}}}var l;var K=g(()=>{l=require("@uswap/helpers")});var q,z,J,d;var x=g(()=>{q={decimals:[10],displayName:"Polkadot Relay Chain",network:"polkadot",prefix:0,standardAccount:"*25519",symbols:["DOT"],website:"https://polkadot.network"},z={decimals:[18],displayName:"Chainflip",network:"chainflip",prefix:2112,standardAccount:"*25519",symbols:["FLIP"],website:"https://chainflip.io/"},J={decimals:[],displayName:"Substrate",network:"substrate",prefix:42,standardAccount:"*25519",symbols:[],website:"https://substrate.io/"},d={DOT:q,FLIP:z,GENERIC:J}});function Q(t,e){switch(t){case a.Chain.Chainflip:return N(e);case a.Chain.Polkadot:return j(e);default:throw new a.USwapError("toolbox_substrate_not_supported",{chain:t})}}function p(t){return"address"in t}async function S(t,e){let{Keyring:n}=await import("@polkadot/api"),{cryptoWaitReady:r}=await import("@polkadot/util-crypto");return await r(),new n({ss58Format:e,type:"sr25519"}).addFromUri(t)}function rt(t,e){let n=m.decodeAddress(t);return m.encodeAddress(n,e)}function R(t,e){return u.isHex(t)?u.hexToU8a(t):m.decodeAddress(t,void 0,e)}function D(t,e="ss58",n){if(e==="hex")return u.u8aToHex(t);return m.encodeAddress(t,n)}async function T({generic:t,chain:e,...n}){let{ApiPromise:r,WsProvider:i}=await import("@polkadot/api"),o=await a.getRPCUrl(e),s=new i(o),c=await r.create({noInitWarn:!0,provider:s}),y=a.AssetValue.from({chain:e}),_=t?d.GENERIC:d[e],G=await b.match(n).with({phrase:b.P.string},({phrase:w})=>S(w,d[e].prefix)).with({signer:b.P.any},({signer:w})=>w).otherwise(()=>{return});return F({api:c,chain:e,gasAsset:y,network:_,signer:G})}var u,m,a,b,j=({generic:t=!1,...e}={})=>{return T({chain:a.Chain.Polkadot,generic:t,...e})},N=async({generic:t=!1,...e}={})=>{return{...await T({chain:a.Chain.Chainflip,generic:t,...e})}},k=(t,e)=>t.rpc.system.accountNextIndex(e),h=(t,e)=>{try{let n=R(t,e);return D(n,"ss58",e),!0}catch{return!1}},I=(t,{recipient:e,assetValue:n})=>t.tx.balances?.transferAllowDeath?.(e,n.getBaseValue("number")),X=async(t,e,{recipient:n,assetValue:r,sender:i})=>{let o=I(t,{assetValue:r,recipient:n});if(!o)throw new a.USwapError("toolbox_substrate_transfer_error");let s=p(e),c=s?e.address:i;if(!c)throw new a.USwapError("core_transaction_invalid_sender_address");let y=await k(t,c);return(await o.signAndSend(s?e:c,{nonce:y,signer:s?void 0:e})).toString()},Y=async(t,e,n,{recipient:r,assetValue:i,sender:o})=>{let s=I(t,{assetValue:i,recipient:r}),c=p(e)?e.address:o;if(!c)return;let y=await s?.paymentInfo(c,{nonce:await k(t,c)})||{partialFee:0};return n.set(a.USwapNumber.fromBigInt(BigInt(y.partialFee.toString()),n.decimal).getValue("string"))},Z=async(t,e)=>{if(e)return t.send(e);return(await t.send()).toString()},$=async(t,e)=>{return await e.signAsync(t)},tt=(t,e,n)=>{if(n)return e.signAndSend(t,n);return e.signAndSend(t).toString()},et=async({signer:t,address:e,tx:n,callback:r,api:i})=>{let o=await k(i,e);if(r)n.signAndSend(e,{nonce:o,signer:t},r);return n.signAndSend(e,{nonce:o,signer:t}).toString()},F=({api:t,network:e,gasAsset:n,signer:r,chain:i})=>({api:t,broadcast:Z,convertAddress:rt,createKeyring:(o)=>S(o,e.prefix),createTransaction:(o)=>I(t,o),decodeAddress:R,encodeAddress:D,estimateTransactionFee:(o)=>{if(!r)throw new a.USwapError("core_wallet_not_keypair_wallet");return Y(t,r,n,o)},gasAsset:n,getAddress:(o)=>{let s=o||r;if(!s)throw new a.USwapError("core_wallet_not_keypair_wallet");return p(s)?s.address:void 0},getBalance:E(i||a.Chain.Polkadot,t),network:e,sign:(o)=>{if(!r)throw new a.USwapError("core_wallet_not_keypair_wallet");if(p(r))return $(r,o);throw new a.USwapError("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},signAndBroadcast:({tx:o,callback:s,address:c})=>{if(!r)throw new a.USwapError("core_wallet_not_keypair_wallet");if(p(r))return tt(r,o,s);if(c)return et({address:c,api:t,callback:s,signer:r,tx:o});throw new a.USwapError("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},transfer:(o)=>{if(!r)throw new a.USwapError("core_wallet_not_keypair_wallet");return X(t,r,o)},validateAddress:(o)=>h(o,e.prefix)}),nt=({address:t,chain:e})=>{let{prefix:n}=e===a.Chain.Polkadot?d.DOT:d.FLIP;return h(t,n)||h(t,d.GENERIC.prefix)};var M=g(()=>{K();x();u=require("@polkadot/util"),m=require("@polkadot/util-crypto"),a=require("@uswap/helpers"),b=require("ts-pattern")});var ot={};L(ot,{substrateValidateAddress:()=>nt,isKeyringPair:()=>p,getSubstrateToolbox:()=>Q,createSubstrateToolbox:()=>T,createKeyring:()=>S,SubstrateNetwork:()=>d,PolkadotToolbox:()=>j,ChainflipToolbox:()=>N,BaseSubstrateToolbox:()=>F});module.exports=H(ot);var it=g(()=>{M();x()});it();
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=A807CAEB3E904D7D64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/substrate/balance.ts", "../src/substrate/types.ts", "../src/substrate/substrate.ts", "../src/substrate/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { ApiPromise } from \"@polkadot/api\";\nimport { AssetValue, Chain, USwapNumber } from \"@uswap/helpers\";\n\n/**\n * Get balance for standard Substrate chains (Polkadot, etc.)\n * Uses api.query.system.account to query free and reserved balances\n */\nexport async function getSubstrateBalance(\n api: ApiPromise,\n gasAsset: AssetValue,\n address: string,\n): Promise<AssetValue[]> {\n try {\n const account = await api.query.system?.account?.(address);\n\n if (!account) {\n return [gasAsset.set(0)];\n }\n\n const {\n // @ts-expect-error\n data: { free },\n } = account;\n\n // Convert the free balance to string using USwapNumber for proper decimal handling\n const freeBalance = USwapNumber.fromBigInt(BigInt(free.toString()), gasAsset.decimal).getValue(\"string\");\n\n return [gasAsset.set(freeBalance)];\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Error fetching substrate balance: ${errorMessage}`);\n return [gasAsset.set(0)];\n }\n}\n\n/**\n * Get balance for Chainflip chain\n * Uses api.query.flip.account to query FLIP balances\n */\nexport async function getChainflipBalance(\n api: ApiPromise,\n gasAsset: AssetValue,\n address: string,\n): Promise<AssetValue[]> {\n try {\n // Chainflip uses a custom flip pallet for account balances\n const flipAccount = await api.query.flip?.account?.(address);\n\n if (!flipAccount) {\n return [gasAsset.set(0)];\n }\n\n // Extract balance from the flip account structure\n // The structure has a balance field directly\n //@ts-expect-error\n const balance = flipAccount.balance || flipAccount.data?.balance;\n\n if (!balance || balance.isEmpty) {\n return [gasAsset.set(0)];\n }\n\n // Convert balance to string using USwapNumber\n const balanceStr = USwapNumber.fromBigInt(BigInt(balance.toString()), gasAsset.decimal).getValue(\"string\");\n\n return [gasAsset.set(balanceStr)];\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Error fetching chainflip balance: ${errorMessage}`);\n return [gasAsset.set(0)];\n }\n}\n\n/**\n * Factory function to create chain-specific balance getter\n */\nexport function createBalanceGetter(chain: Chain, api: ApiPromise) {\n return function getBalance(address: string): Promise<AssetValue[]> {\n const gasAsset = AssetValue.from({ chain });\n\n switch (chain) {\n case Chain.Chainflip:\n return getChainflipBalance(api, gasAsset, address);\n\n default:\n return getSubstrateBalance(api, gasAsset, address);\n }\n };\n}\n",
|
|
6
6
|
"import type { Signer as InjectedSigner } from \"@polkadot/api/types\";\nimport type { ProviderInterface } from \"@polkadot/rpc-provider/types\";\nimport type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\";\nimport type { KeypairType } from \"@polkadot/util-crypto/types\";\nimport type { GenericTransferParams, SubstrateChain } from \"@uswap/helpers\";\n\nconst polkadotNetwork = {\n decimals: [10],\n displayName: \"Polkadot Relay Chain\",\n network: \"polkadot\",\n prefix: 0,\n standardAccount: \"*25519\",\n symbols: [\"DOT\"],\n website: \"https://polkadot.network\",\n};\n\nconst chainflipNetwork = {\n decimals: [18],\n displayName: \"Chainflip\",\n network: \"chainflip\",\n prefix: 2112,\n standardAccount: \"*25519\",\n symbols: [\"FLIP\"],\n website: \"https://chainflip.io/\",\n};\n\nconst subtrateNetwork = {\n decimals: [],\n displayName: \"Substrate\",\n network: \"substrate\",\n prefix: 42,\n standardAccount: \"*25519\",\n symbols: [],\n website: \"https://substrate.io/\",\n};\n\nexport const SubstrateNetwork: Record<SubstrateChain | \"GENERIC\", SubstrateNetwork> = {\n DOT: polkadotNetwork,\n FLIP: chainflipNetwork,\n GENERIC: subtrateNetwork,\n};\n\nexport type SubstrateNetwork = typeof polkadotNetwork | typeof chainflipNetwork | typeof subtrateNetwork;\n\nexport type SubstrateTransferParams = GenericTransferParams & { sender?: string };\n\ntype Unsubcall = () => void;\n\ninterface InjectedAccount {\n address: string;\n genesisHash?: string | null;\n name?: string;\n type?: KeypairType;\n}\n\ninterface InjectedAccounts {\n get: (anyType?: boolean) => Promise<InjectedAccount[]>;\n subscribe: (cb: (accounts: InjectedAccount[]) => void | Promise<void>) => Unsubcall;\n}\ninterface InjectedExtensionInfo {\n name: string;\n version: string;\n}\ninterface ProviderMeta {\n network: string;\n node: \"full\" | \"light\";\n source: string;\n transport: string;\n}\ninterface MetadataDefBase {\n chain: string;\n genesisHash: string;\n icon: string;\n ss58Format: number;\n chainType?: \"substrate\" | \"ethereum\";\n}\ninterface MetadataDef extends MetadataDefBase {\n color?: string;\n specVersion: number;\n tokenDecimals: number;\n tokenSymbol: string;\n types: Record<string, Record<string, string> | string>;\n metaCalls?: string;\n userExtensions?: ExtDef;\n}\ninterface InjectedMetadataKnown {\n genesisHash: string;\n specVersion: number;\n}\ninterface InjectedMetadata {\n get: () => Promise<InjectedMetadataKnown[]>;\n provide: (definition: MetadataDef) => Promise<boolean>;\n}\ntype ProviderList = Record<string, ProviderMeta>;\n\ninterface InjectedProvider extends ProviderInterface {\n listProviders: () => Promise<ProviderList>;\n startProvider: (key: string) => Promise<ProviderMeta>;\n}\n\ntype InjectedWalletData = {\n accounts: InjectedAccounts;\n metadata?: InjectedMetadata;\n provider?: InjectedProvider;\n signer: InjectedSigner;\n};\n\nexport type SubstrateInjectedExtension = Record<\n string,\n {\n connect?: (origin: string) => Promise<InjectedExtensionInfo & InjectedWalletData>;\n enable?: (origin: string) => Promise<InjectedWalletData>;\n version?: string;\n }\n>;\n",
|
|
7
|
-
"/**\n *
|
|
7
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { Callback, IKeyringPair, ISubmittableResult, Signer } from \"@polkadot/types/types\";\nimport { hexToU8a, isHex, u8aToHex } from \"@polkadot/util\";\nimport { decodeAddress as decodePolkadotAddress, encodeAddress as encodePolkadotAddress } from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n getRPCUrl,\n type SubstrateChain,\n USwapError,\n USwapNumber,\n} from \"@uswap/helpers\";\n\nimport { match, P } from \"ts-pattern\";\nimport { createBalanceGetter } from \"./balance\";\nimport { SubstrateNetwork, type SubstrateTransferParams } from \"./types\";\n\nexport const PolkadotToolbox = ({ generic = false, ...signerParams }: ToolboxParams = {}) => {\n return createSubstrateToolbox({ chain: Chain.Polkadot, generic, ...signerParams });\n};\n\nexport const ChainflipToolbox = async ({ generic = false, ...signerParams }: ToolboxParams = {}) => {\n const toolbox = await createSubstrateToolbox({ chain: Chain.Chainflip, generic, ...signerParams });\n\n return { ...toolbox };\n};\n\nexport type SubstrateToolboxes = {\n DOT: Awaited<ReturnType<typeof PolkadotToolbox>>;\n FLIP: Awaited<ReturnType<typeof ChainflipToolbox>>;\n};\n\nexport function getSubstrateToolbox<T extends SubstrateChain>(chain: T, params?: ToolboxParams) {\n switch (chain) {\n case Chain.Chainflip: {\n return ChainflipToolbox(params);\n }\n case Chain.Polkadot: {\n return PolkadotToolbox(params);\n }\n default:\n throw new USwapError(\"toolbox_substrate_not_supported\", { chain });\n }\n}\n\nexport function isKeyringPair(account: IKeyringPair | Signer): account is IKeyringPair {\n return \"address\" in account;\n}\n\nexport async function createKeyring(phrase: string, networkPrefix: number) {\n const { Keyring } = await import(\"@polkadot/api\");\n const { cryptoWaitReady } = await import(\"@polkadot/util-crypto\");\n await cryptoWaitReady();\n\n return new Keyring({ ss58Format: networkPrefix, type: \"sr25519\" }).addFromUri(phrase);\n}\n\nconst getNonce = (api: ApiPromise, address: string) => api.rpc.system.accountNextIndex(address);\n\nconst validateAddress = (address: string, networkPrefix: number) => {\n try {\n const decodedAddress = decodeAddress(address, networkPrefix);\n\n encodeAddress(decodedAddress, \"ss58\", networkPrefix);\n\n return true;\n } catch {\n return false;\n }\n};\n\nconst createTransaction = (api: ApiPromise, { recipient, assetValue }: SubstrateTransferParams) =>\n api.tx.balances?.transferAllowDeath?.(recipient, assetValue.getBaseValue(\"number\"));\n\nconst transfer = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n { recipient, assetValue, sender }: SubstrateTransferParams,\n) => {\n const transfer = createTransaction(api, { assetValue, recipient });\n if (!transfer) throw new USwapError(\"toolbox_substrate_transfer_error\");\n\n const isKeyring = isKeyringPair(signer);\n\n const address = isKeyring ? (signer as IKeyringPair).address : sender;\n if (!address) throw new USwapError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n nonce,\n signer: isKeyring ? undefined : signer,\n });\n\n return tx.toString();\n};\n\nconst estimateTransactionFee = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n gasAsset: AssetValue,\n { recipient, assetValue, sender }: SubstrateTransferParams,\n) => {\n const transfer = createTransaction(api, { assetValue, recipient });\n\n const address = isKeyringPair(signer) ? signer.address : sender;\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, { nonce: await getNonce(api, address) })) || {\n partialFee: 0,\n };\n return gasAsset.set(\n USwapNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\"string\"),\n );\n};\n\nconst broadcast = async (tx: SubmittableExtrinsic<\"promise\">, callback?: Callback<ISubmittableResult>) => {\n if (callback) return tx.send(callback);\n const hash = await tx.send();\n return hash.toString();\n};\n\nconst sign = async (signer: IKeyringPair, tx: SubmittableExtrinsic<\"promise\">) => {\n const signedTx = await tx.signAsync(signer);\n return signedTx;\n};\n\nconst signAndBroadcastKeyring = (\n signer: IKeyringPair,\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.signAndSend(signer, callback);\n const hash = tx.signAndSend(signer);\n return hash.toString();\n};\n\nconst signAndBroadcast = async ({\n signer,\n address,\n tx,\n callback,\n api,\n}: {\n signer: Signer;\n address: string;\n tx: SubmittableExtrinsic<\"promise\">;\n api: ApiPromise;\n callback?: Callback<ISubmittableResult>;\n}) => {\n const nonce = await getNonce(api, address);\n if (callback) {\n tx.signAndSend(address, { nonce, signer }, callback);\n }\n const hash = tx.signAndSend(address, { nonce, signer });\n return hash.toString();\n};\n\nfunction convertAddress(address: string, newPrefix: number) {\n const decodedAddress = decodePolkadotAddress(address);\n const convertedAddress = encodePolkadotAddress(decodedAddress, newPrefix);\n return convertedAddress;\n}\n\nfunction decodeAddress(address: string, networkPrefix?: number) {\n return isHex(address) ? hexToU8a(address) : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(address: Uint8Array, encoding: \"ss58\" | \"hex\" = \"ss58\", networkPrefix?: number) {\n if (encoding === \"hex\") {\n return u8aToHex(address);\n }\n\n return encodePolkadotAddress(address, networkPrefix);\n}\n\nexport const BaseSubstrateToolbox = ({\n api,\n network,\n gasAsset,\n signer,\n chain,\n}: {\n api: ApiPromise;\n network: SubstrateNetwork;\n gasAsset: AssetValue;\n signer?: IKeyringPair | Signer;\n chain?: SubstrateChain;\n}) => ({\n api,\n broadcast,\n convertAddress,\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n createTransaction: (params: GenericCreateTransactionParams) => createTransaction(api, params),\n decodeAddress,\n encodeAddress,\n estimateTransactionFee: (params: SubstrateTransferParams) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n return estimateTransactionFee(api, signer, gasAsset, params);\n },\n gasAsset,\n getAddress: (keyring?: IKeyringPair | Signer) => {\n const keyringPair = keyring || signer;\n if (!keyringPair) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n\n return isKeyringPair(keyringPair) ? keyringPair.address : undefined;\n },\n getBalance: createBalanceGetter(chain || Chain.Polkadot, api),\n network,\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return sign(signer, tx);\n\n throw new USwapError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n signAndBroadcast: ({\n tx,\n callback,\n address,\n }: {\n tx: SubmittableExtrinsic<\"promise\">;\n callback?: Callback<ISubmittableResult>;\n address?: string;\n }) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n if (isKeyringPair(signer)) return signAndBroadcastKeyring(signer, tx, callback);\n\n if (address) {\n return signAndBroadcast({ address, api, callback, signer, tx });\n }\n\n throw new USwapError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n transfer: (params: SubstrateTransferParams) => {\n if (!signer) throw new USwapError(\"core_wallet_not_keypair_wallet\");\n return transfer(api, signer, params);\n },\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n});\n\nexport const substrateValidateAddress = ({ address, chain }: { address: string; chain: SubstrateChain }) => {\n const { prefix } = chain === Chain.Polkadot ? SubstrateNetwork.DOT : SubstrateNetwork.FLIP;\n\n return validateAddress(address, prefix) || validateAddress(address, SubstrateNetwork.GENERIC.prefix);\n};\n\nexport async function createSubstrateToolbox({\n generic,\n chain,\n ...signerParams\n}: ToolboxParams & { chain: SubstrateChain }) {\n const { ApiPromise, WsProvider } = await import(\"@polkadot/api\");\n\n const rpcUrl = await getRPCUrl(chain);\n const provider = new WsProvider(rpcUrl);\n const api = await ApiPromise.create({ noInitWarn: true, provider });\n const gasAsset = AssetValue.from({ chain });\n const network = generic ? SubstrateNetwork.GENERIC : SubstrateNetwork[chain];\n\n const signer = await match(signerParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeyring(phrase, SubstrateNetwork[chain].prefix))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n return BaseSubstrateToolbox({ api, chain, gasAsset, network, signer });\n}\n\nexport type ToolboxParams = { generic?: boolean } & (\n | { signer?: KeyringPair | Signer }\n | { phrase?: string; derivationPath?: DerivationPathArray; index?: number }\n);\n",
|
|
8
8
|
"export * from \"./substrate\";\nexport * from \"./types\";\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "A807CAEB3E904D7D64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|