@moonbeam-network/xcm-sdk 3.2.13 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -9
- package/build/index.d.ts +40 -4
- package/build/index.mjs +190 -3
- package/build/index.mjs.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -27,16 +27,16 @@ The following sections contain basic examples of how to work with the XCM SDK to
|
|
|
27
27
|
```js
|
|
28
28
|
import { Sdk } from '@moonbeam-network/xcm-sdk';
|
|
29
29
|
|
|
30
|
-
const
|
|
30
|
+
const fromPolkadot = async () => {
|
|
31
31
|
const transferData = await Sdk()
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
destinationAddress:
|
|
32
|
+
.setAsset(dot)
|
|
33
|
+
.setSource(polkadot)
|
|
34
|
+
.setDestination(moonbeam)
|
|
35
|
+
.setAddresses({
|
|
36
|
+
sourceAddress: pair.address,
|
|
37
|
+
destinationAddress: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
|
|
38
38
|
});
|
|
39
|
-
|
|
39
|
+
};
|
|
40
40
|
|
|
41
41
|
fromPolkadot();
|
|
42
42
|
```
|
|
@@ -46,7 +46,11 @@ fromPolkadot();
|
|
|
46
46
|
```js
|
|
47
47
|
...
|
|
48
48
|
|
|
49
|
-
const hash = await
|
|
49
|
+
const hash = await data.transfer({
|
|
50
|
+
amount: 1,
|
|
51
|
+
signers: { polkadotSigner: pair }, // Insert the signer, in this case a Substrate key pair
|
|
52
|
+
});
|
|
53
|
+
|
|
50
54
|
```
|
|
51
55
|
|
|
52
56
|
# Examples
|
package/build/index.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ import { AssetAmount, AnyChain, AnyParachain, ChainAsset, Asset, EvmChain, EvmPa
|
|
|
4
4
|
import { Signer, SubmittableExtrinsic } from '@polkadot/api/types';
|
|
5
5
|
import { IKeyringPair, ISubmittableResult } from '@polkadot/types/types';
|
|
6
6
|
import { WalletClient, PublicClient, HttpTransport, Hash } from 'viem';
|
|
7
|
-
import { ContractConfig, ExtrinsicConfig, BalanceConfigBuilder, AssetMinConfigBuilder, FeeConfigBuilder, EvmQueryConfig, SubstrateQueryConfig } from '@moonbeam-network/xcm-builder';
|
|
7
|
+
import { ContractConfig, ExtrinsicConfig, BalanceConfigBuilder, AssetMinConfigBuilder, FeeConfigBuilder, EvmQueryConfig, SubstrateQueryConfig, EventMonitoringConfig } from '@moonbeam-network/xcm-builder';
|
|
8
8
|
import { ApiPromise } from '@polkadot/api';
|
|
9
|
-
import { RuntimeDispatchInfo } from '@polkadot/types/interfaces';
|
|
9
|
+
import { RuntimeDispatchInfo, EventRecord } from '@polkadot/types/interfaces';
|
|
10
10
|
import { HexString } from '@polkadot/util/types';
|
|
11
11
|
|
|
12
12
|
type EvmSigner = WalletClient;
|
|
@@ -20,7 +20,16 @@ interface TransferData {
|
|
|
20
20
|
max: AssetAmount;
|
|
21
21
|
min: AssetAmount;
|
|
22
22
|
source: SourceChainTransferData;
|
|
23
|
-
transfer(
|
|
23
|
+
transfer(params: TransferParams): Promise<string>;
|
|
24
|
+
}
|
|
25
|
+
interface TransferParams {
|
|
26
|
+
amount: number | string;
|
|
27
|
+
signers: Partial<Signers>;
|
|
28
|
+
statusCallback?: (status: ISubmittableResult) => void;
|
|
29
|
+
onSourceFinalized?: () => void;
|
|
30
|
+
onSourceError?: (error: Error) => void;
|
|
31
|
+
onDestinationFinalized?: () => void;
|
|
32
|
+
onDestinationError?: (error: Error) => void;
|
|
24
33
|
}
|
|
25
34
|
interface SourceChainTransferData extends ChainTransferData {
|
|
26
35
|
destinationFee: AssetAmount;
|
|
@@ -193,4 +202,31 @@ declare class PolkadotService {
|
|
|
193
202
|
transfer(account: string, config: ExtrinsicConfig, signer: Signer | IKeyringPair, statusCallback?: (params: ISubmittableResult) => void): Promise<string>;
|
|
194
203
|
}
|
|
195
204
|
|
|
196
|
-
|
|
205
|
+
interface ListenToDestinationEventsProps {
|
|
206
|
+
route: AssetRoute;
|
|
207
|
+
monitoringConfig: EventMonitoringConfig;
|
|
208
|
+
messageId?: string;
|
|
209
|
+
onDestinationFinalized?: () => void;
|
|
210
|
+
onDestinationError?: (error: Error) => void;
|
|
211
|
+
}
|
|
212
|
+
declare function listenToDestinationEvents({ route, monitoringConfig, messageId, onDestinationFinalized, onDestinationError, }: ListenToDestinationEventsProps): Promise<void>;
|
|
213
|
+
interface CreateMonitoringCallbackProps {
|
|
214
|
+
sourceAddress: string;
|
|
215
|
+
route: AssetRoute;
|
|
216
|
+
statusCallback?: (status: ISubmittableResult) => void;
|
|
217
|
+
onSourceFinalized?: () => void;
|
|
218
|
+
onSourceError?: (error: Error) => void;
|
|
219
|
+
onDestinationFinalized?: () => void;
|
|
220
|
+
onDestinationError?: (error: Error) => void;
|
|
221
|
+
}
|
|
222
|
+
interface ListenToSourceEventsProps extends CreateMonitoringCallbackProps {
|
|
223
|
+
}
|
|
224
|
+
interface ProcessSourceEventsProps extends ListenToSourceEventsProps {
|
|
225
|
+
events: EventRecord[];
|
|
226
|
+
unsubscribe?: () => void;
|
|
227
|
+
}
|
|
228
|
+
declare function processSourceEvents({ events, sourceAddress, route, onSourceFinalized, onSourceError, onDestinationFinalized, onDestinationError, unsubscribe, }: ProcessSourceEventsProps): void;
|
|
229
|
+
declare function createMonitoringCallback({ sourceAddress, route, statusCallback, onSourceFinalized, onSourceError, onDestinationFinalized, onDestinationError, }: CreateMonitoringCallbackProps): (status: ISubmittableResult) => void;
|
|
230
|
+
declare function listenToSourceEvents({ route, sourceAddress, onSourceFinalized, onSourceError, onDestinationFinalized, onDestinationError, }: ListenToSourceEventsProps): Promise<void>;
|
|
231
|
+
|
|
232
|
+
export { type ChainTransferData, type ConvertToChainDecimalsParams, type DestinationChainTransferData, EvmService, type EvmSigner, type GetAssetsBalancesParams, type GetBalancesParams, type GetContractFeeParams, type GetDestinationDataParams, type GetDestinationFeeBalanceParams, type GetDestinationFeeParams, type GetExtrinsicFeeParams, type GetFeeParams, type GetMaxParams, type GetMinParams, type GetSourceDataParams, PolkadotService, Sdk, type SdkOptions, type Signers, type SourceChainTransferData, type SovereignAccountBalance, type TransferData, type TransferParams, convertToChainDecimals, createMonitoringCallback, getAssetMin, getAssetsBalances, getBalance, getContractFee, getDestinationData, getDestinationFee, getDestinationFeeBalance, getExistentialDeposit, getExtrinsicFee, getFee, getMax, getMin, getParachainBalances, getSourceData, listenToDestinationEvents, listenToSourceEvents, processSourceEvents, validateSovereignAccountBalances };
|
package/build/index.mjs
CHANGED
|
@@ -595,6 +595,160 @@ import {
|
|
|
595
595
|
} from "@moonbeam-network/xcm-types";
|
|
596
596
|
import { toBigInt as toBigInt2 } from "@moonbeam-network/xcm-utils";
|
|
597
597
|
import Big2 from "big.js";
|
|
598
|
+
|
|
599
|
+
// src/utils/monitoring.ts
|
|
600
|
+
import { getPolkadotApi as getPolkadotApi2 } from "@moonbeam-network/xcm-utils";
|
|
601
|
+
var ENABLE_LOGGING = process.env.ENABLE_LOGGING === "true";
|
|
602
|
+
function log(label, message) {
|
|
603
|
+
if (ENABLE_LOGGING) {
|
|
604
|
+
console.log(`[${label}]`, message ?? "");
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
async function listenToDestinationEvents({
|
|
608
|
+
route,
|
|
609
|
+
monitoringConfig,
|
|
610
|
+
messageId,
|
|
611
|
+
onDestinationFinalized,
|
|
612
|
+
onDestinationError
|
|
613
|
+
}) {
|
|
614
|
+
if (!route?.destination?.chain || !("ws" in route.destination.chain)) {
|
|
615
|
+
log("No destination WS endpoint available");
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
try {
|
|
619
|
+
const api = await getPolkadotApi2(route.destination.chain.ws);
|
|
620
|
+
log("Subscribing to destination events...");
|
|
621
|
+
const unsubscribe = await api.query.system.events((events) => {
|
|
622
|
+
log("Destination events", events.toHuman());
|
|
623
|
+
const destinationResult = monitoringConfig.checkDestination(
|
|
624
|
+
events,
|
|
625
|
+
messageId
|
|
626
|
+
);
|
|
627
|
+
if (destinationResult.matched) {
|
|
628
|
+
log("Destination event matched:", destinationResult.event?.toHuman());
|
|
629
|
+
unsubscribe();
|
|
630
|
+
if (destinationResult.success) {
|
|
631
|
+
onDestinationFinalized?.();
|
|
632
|
+
} else {
|
|
633
|
+
const error = new Error(
|
|
634
|
+
`Message processing failed on destination chain: ${route.destination.chain.name}`
|
|
635
|
+
);
|
|
636
|
+
console.error(
|
|
637
|
+
"Destination message processing failed:",
|
|
638
|
+
destinationResult.event?.toHuman()
|
|
639
|
+
);
|
|
640
|
+
onDestinationError?.(error);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
} catch (error) {
|
|
645
|
+
console.error("Error listening to destination events:", error);
|
|
646
|
+
onDestinationError?.(error);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
function processSourceEvents({
|
|
650
|
+
events,
|
|
651
|
+
sourceAddress,
|
|
652
|
+
route,
|
|
653
|
+
onSourceFinalized,
|
|
654
|
+
onSourceError,
|
|
655
|
+
onDestinationFinalized,
|
|
656
|
+
onDestinationError,
|
|
657
|
+
unsubscribe
|
|
658
|
+
}) {
|
|
659
|
+
const monitoringConfig = route.monitoring;
|
|
660
|
+
if (!monitoringConfig) {
|
|
661
|
+
log("No monitoring config found");
|
|
662
|
+
unsubscribe?.();
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
const extrinsicFailedEvent = events.find((event) => {
|
|
666
|
+
return event.event.section === "system" && event.event.method === "ExtrinsicFailed";
|
|
667
|
+
});
|
|
668
|
+
if (extrinsicFailedEvent) {
|
|
669
|
+
onSourceError?.(new Error("Extrinsic failed"));
|
|
670
|
+
unsubscribe?.();
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
try {
|
|
674
|
+
const sourceResult = monitoringConfig.checkSource(events, sourceAddress);
|
|
675
|
+
if (sourceResult.matched) {
|
|
676
|
+
log("Source event matched:", sourceResult.event?.toHuman());
|
|
677
|
+
onSourceFinalized?.();
|
|
678
|
+
if (unsubscribe) {
|
|
679
|
+
log("Unsubscribing from source events...");
|
|
680
|
+
unsubscribe();
|
|
681
|
+
}
|
|
682
|
+
listenToDestinationEvents({
|
|
683
|
+
route,
|
|
684
|
+
monitoringConfig,
|
|
685
|
+
messageId: sourceResult.messageId,
|
|
686
|
+
onDestinationFinalized,
|
|
687
|
+
onDestinationError
|
|
688
|
+
});
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
} catch (error) {
|
|
692
|
+
console.error("Error in MonitoringBuilder config:", error);
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
function createMonitoringCallback({
|
|
697
|
+
sourceAddress,
|
|
698
|
+
route,
|
|
699
|
+
statusCallback,
|
|
700
|
+
onSourceFinalized,
|
|
701
|
+
onSourceError,
|
|
702
|
+
onDestinationFinalized,
|
|
703
|
+
onDestinationError
|
|
704
|
+
}) {
|
|
705
|
+
return (status) => {
|
|
706
|
+
statusCallback?.(status);
|
|
707
|
+
processSourceEvents({
|
|
708
|
+
events: status.events,
|
|
709
|
+
sourceAddress,
|
|
710
|
+
route,
|
|
711
|
+
onSourceFinalized,
|
|
712
|
+
onSourceError,
|
|
713
|
+
onDestinationFinalized,
|
|
714
|
+
onDestinationError
|
|
715
|
+
});
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
async function listenToSourceEvents({
|
|
719
|
+
route,
|
|
720
|
+
sourceAddress,
|
|
721
|
+
onSourceFinalized,
|
|
722
|
+
onSourceError,
|
|
723
|
+
onDestinationFinalized,
|
|
724
|
+
onDestinationError
|
|
725
|
+
}) {
|
|
726
|
+
if (!route?.source?.chain || !("ws" in route.source.chain)) {
|
|
727
|
+
log("No source WS endpoint available");
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
try {
|
|
731
|
+
const api = await getPolkadotApi2(route.source.chain.ws);
|
|
732
|
+
log("Subscribing to source events...");
|
|
733
|
+
const unsubscribe = await api.query.system.events((events) => {
|
|
734
|
+
log("Source events:", events.toHuman());
|
|
735
|
+
processSourceEvents({
|
|
736
|
+
events,
|
|
737
|
+
sourceAddress,
|
|
738
|
+
route,
|
|
739
|
+
onSourceFinalized,
|
|
740
|
+
onSourceError,
|
|
741
|
+
onDestinationFinalized,
|
|
742
|
+
onDestinationError,
|
|
743
|
+
unsubscribe
|
|
744
|
+
});
|
|
745
|
+
});
|
|
746
|
+
} catch (error) {
|
|
747
|
+
console.error("Error listening to source events:", error);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
// src/getTransferData/getTransferData.ts
|
|
598
752
|
async function getTransferData({
|
|
599
753
|
route,
|
|
600
754
|
sourceAddress,
|
|
@@ -630,7 +784,15 @@ async function getTransferData({
|
|
|
630
784
|
max: sourceData.max,
|
|
631
785
|
min: getMin(destinationData),
|
|
632
786
|
source: sourceData,
|
|
633
|
-
async transfer(
|
|
787
|
+
async transfer({
|
|
788
|
+
amount,
|
|
789
|
+
signers: { evmSigner, polkadotSigner },
|
|
790
|
+
statusCallback,
|
|
791
|
+
onSourceFinalized,
|
|
792
|
+
onSourceError,
|
|
793
|
+
onDestinationFinalized,
|
|
794
|
+
onDestinationError
|
|
795
|
+
}) {
|
|
634
796
|
const source = route.source.chain;
|
|
635
797
|
const destination = route.destination.chain;
|
|
636
798
|
const bigintAmount = toBigInt2(amount, sourceData.balance.decimals);
|
|
@@ -664,22 +826,43 @@ async function getTransferData({
|
|
|
664
826
|
sourceAddress,
|
|
665
827
|
sourceApi: sourcePolkadot.api
|
|
666
828
|
});
|
|
829
|
+
const shouldListenToEvents = !!onSourceFinalized || !!onSourceError || !!onDestinationFinalized || !!onDestinationError;
|
|
667
830
|
if (contract) {
|
|
668
831
|
if (!evmSigner) {
|
|
669
832
|
throw new Error("EVM Signer must be provided");
|
|
670
833
|
}
|
|
671
834
|
const evm = EvmService.create(source);
|
|
672
|
-
|
|
835
|
+
const hash = await evm.transfer(evmSigner, contract);
|
|
836
|
+
if (shouldListenToEvents) {
|
|
837
|
+
listenToSourceEvents({
|
|
838
|
+
route,
|
|
839
|
+
sourceAddress,
|
|
840
|
+
onSourceFinalized,
|
|
841
|
+
onSourceError,
|
|
842
|
+
onDestinationFinalized,
|
|
843
|
+
onDestinationError
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
return hash;
|
|
673
847
|
}
|
|
674
848
|
if (extrinsic) {
|
|
675
849
|
if (!polkadotSigner) {
|
|
676
850
|
throw new Error("Polkadot signer must be provided");
|
|
677
851
|
}
|
|
852
|
+
const monitoringCallback = shouldListenToEvents ? createMonitoringCallback({
|
|
853
|
+
sourceAddress,
|
|
854
|
+
route,
|
|
855
|
+
statusCallback,
|
|
856
|
+
onSourceFinalized,
|
|
857
|
+
onSourceError,
|
|
858
|
+
onDestinationFinalized,
|
|
859
|
+
onDestinationError
|
|
860
|
+
}) : void 0;
|
|
678
861
|
return sourcePolkadot.transfer(
|
|
679
862
|
sourceAddress,
|
|
680
863
|
extrinsic,
|
|
681
864
|
polkadotSigner,
|
|
682
|
-
statusCallback
|
|
865
|
+
monitoringCallback || statusCallback
|
|
683
866
|
);
|
|
684
867
|
}
|
|
685
868
|
throw new Error("Either contract or extrinsic must be provided");
|
|
@@ -755,6 +938,7 @@ export {
|
|
|
755
938
|
PolkadotService,
|
|
756
939
|
Sdk,
|
|
757
940
|
convertToChainDecimals,
|
|
941
|
+
createMonitoringCallback,
|
|
758
942
|
getAssetMin,
|
|
759
943
|
getAssetsBalances,
|
|
760
944
|
getBalance,
|
|
@@ -769,6 +953,9 @@ export {
|
|
|
769
953
|
getMin,
|
|
770
954
|
getParachainBalances,
|
|
771
955
|
getSourceData,
|
|
956
|
+
listenToDestinationEvents,
|
|
957
|
+
listenToSourceEvents,
|
|
958
|
+
processSourceEvents,
|
|
772
959
|
validateSovereignAccountBalances
|
|
773
960
|
};
|
|
774
961
|
//# sourceMappingURL=index.mjs.map
|
package/build/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/getTransferData/getDestinationData.ts","../src/getTransferData/getTransferData.utils.ts","../src/services/evm/EvmService.ts","../src/services/polkadot/PolkadotService.ts","../src/getTransferData/getSourceData.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts"],"sourcesContent":["import type {\n AssetRoute,\n DestinationConfig,\n SourceConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Parachain } from '@moonbeam-network/xcm-types';\nimport { getSovereignAccountAddresses } from '@moonbeam-network/xcm-utils';\nimport type { DestinationChainTransferData } from '../sdk.interfaces';\nimport {\n getAssetMin,\n getBalance,\n getDestinationFee,\n getExistentialDeposit,\n} from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n route: AssetRoute;\n destinationAddress: string;\n}\n\nexport async function getDestinationData({\n route,\n destinationAddress,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const destination = route.destination.chain;\n const asset = destination.getChainAsset(route.destination.asset);\n const balance = await getBalance({\n address: destinationAddress,\n asset,\n builder: route.destination.balance,\n chain: destination,\n });\n const min = await getAssetMin({\n asset,\n builder: route.destination.min,\n chain: destination,\n });\n const fee = await getDestinationFee({\n address: destinationAddress,\n feeAsset: route.destination.fee.asset,\n destination,\n fee: route.destination.fee.amount,\n source: route.source.chain,\n asset: route.source.asset,\n });\n const existentialDeposit = await getExistentialDeposit(destination);\n\n return {\n chain: destination,\n balance,\n existentialDeposit,\n fee,\n min,\n sovereignAccountBalances: await getSovereignAccountBalances({\n source: route.source,\n destination: route.destination,\n }),\n };\n}\n\ninterface GetSovereignAccountBalancesProps {\n source: SourceConfig;\n destination: DestinationConfig;\n}\n\nasync function getSovereignAccountBalances({\n destination,\n source,\n}: GetSovereignAccountBalancesProps) {\n if (\n !Parachain.is(source.chain) ||\n !Parachain.is(destination.chain) ||\n !destination.chain.checkSovereignAccountBalances\n ) {\n return undefined;\n }\n\n const sovereignAccountAddresses = getSovereignAccountAddresses(\n source.chain.parachainId,\n );\n\n const destinationFeeAssetBalance = destination.fee.balance;\n\n const sovereignAccountAddress = destination.chain.isRelay\n ? sovereignAccountAddresses.relay\n : sovereignAccountAddresses.generic;\n\n const sovereignAccountBalance = await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.asset),\n builder: destination.balance,\n chain: destination.chain,\n });\n\n const sovereignAccountFeeAssetBalance = destinationFeeAssetBalance\n ? await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.fee.asset),\n builder: destinationFeeAssetBalance,\n chain: destination.chain,\n })\n : undefined;\n return {\n feeAssetBalance: sovereignAccountFeeAssetBalance?.amount,\n transferAssetBalance: sovereignAccountBalance.amount,\n };\n}\n","import {\n type AssetMinConfigBuilder,\n type BalanceConfigBuilder,\n ContractConfig,\n EvmQueryConfig,\n type ExtrinsicConfig,\n type FeeConfigBuilder,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport {\n type AnyChain,\n type AnyParachain,\n type Asset,\n AssetAmount,\n type ChainAsset,\n EvmChain,\n EvmParachain,\n Parachain,\n} from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type {\n DestinationChainTransferData,\n SourceChainTransferData,\n} from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset: ChainAsset;\n builder: BalanceConfigBuilder;\n chain: AnyChain;\n}\nexport async function getBalance({\n address,\n asset,\n builder,\n chain,\n}: GetBalancesParams): Promise<AssetAmount> {\n const config = builder.build({\n address,\n asset,\n });\n const amount = AssetAmount.fromChainAsset(asset, { amount: 0n });\n\n if (SubstrateQueryConfig.is(config) && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const balance = await polkadot.query(config);\n const converted = chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, asset.decimals)\n : balance;\n\n return amount.copyWith({ amount: converted });\n }\n\n if (EvmChain.is(chain) || EvmParachain.is(chain)) {\n const evm = EvmService.create(chain);\n\n if (ContractConfig.is(config)) {\n const balance = await evm.getBalance(address, config);\n\n return amount.copyWith({ amount: balance });\n }\n\n if (EvmQueryConfig.is(config)) {\n const balance = await evm.query(config);\n\n return amount.copyWith({ amount: balance });\n }\n }\n\n throw new Error(\n `Can't get balance for ${address} on chain ${chain.name} and asset ${asset.symbol}`,\n );\n}\n\nexport interface GetMinParams {\n asset: Asset;\n builder?: AssetMinConfigBuilder;\n chain: AnyChain;\n}\n\nexport async function getAssetMin({\n asset,\n builder,\n chain,\n}: GetMinParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(chain.getChainAsset(asset), {\n amount: 0n,\n });\n\n if (builder && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const min = await polkadot.query(\n builder.build({ asset: zero.getMinAssetId(), address: zero.address }),\n );\n\n return zero.copyWith({ amount: min });\n }\n\n if (zero.min) {\n return zero.copyWith({ amount: zero.min });\n }\n\n return zero;\n}\n\nexport function getMin({\n balance,\n existentialDeposit,\n fee,\n min,\n}: DestinationChainTransferData) {\n const result = Big(0)\n .plus(balance.isSame(fee) ? fee.toBig() : Big(0))\n .plus(\n existentialDeposit &&\n balance.isSame(existentialDeposit) &&\n balance.toBig().lt(existentialDeposit.toBig())\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .plus(balance.toBig().lt(min.toBig()) ? min.toBig() : Big(0));\n\n return balance.copyWith({\n amount: BigInt(result.toFixed()),\n });\n}\n\nexport interface GetMaxParams {\n balance: AssetAmount;\n existentialDeposit?: AssetAmount;\n fee: AssetAmount;\n min: AssetAmount;\n}\n\nexport function getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n}: GetMaxParams): AssetAmount {\n const result = balance\n .toBig()\n .minus(min.toBig())\n .minus(\n existentialDeposit && balance.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balance.isSame(fee) ? fee.toBig() : Big(0));\n\n return balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetDestinationFeeParams {\n address: string;\n asset: Asset;\n feeAsset: Asset;\n destination: AnyChain;\n fee: number | FeeConfigBuilder;\n source: AnyChain;\n}\n\nexport async function getDestinationFee({\n address,\n asset,\n destination,\n fee,\n feeAsset,\n source,\n}: GetDestinationFeeParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(destination.getChainAsset(feeAsset), {\n amount: 0n,\n });\n\n if (typeof fee === 'number') {\n return zero.copyWith({\n amount: fee,\n });\n }\n\n if (EvmParachain.isAnyParachain(destination)) {\n const polkadot = await PolkadotService.create(destination);\n const cfg = fee.build({\n address,\n api: polkadot.api,\n asset: destination.getChainAsset(asset),\n destination,\n feeAsset: destination.getChainAsset(feeAsset),\n source,\n });\n\n return zero.copyWith({\n amount: await cfg.call(),\n });\n }\n\n return zero;\n}\n\nexport interface ConvertToChainDecimalsParams {\n asset: AssetAmount;\n target: ChainAsset;\n}\n\nexport function convertToChainDecimals({\n asset,\n target,\n}: ConvertToChainDecimalsParams): AssetAmount {\n return AssetAmount.fromChainAsset(target, {\n amount: asset.convertDecimals(target.decimals).amount,\n });\n}\n\nexport async function getExistentialDeposit(\n chain: AnyChain,\n): Promise<AssetAmount | undefined> {\n if (EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n\n return polkadot.existentialDeposit;\n }\n\n return undefined;\n}\n\nexport interface GetDestinationFeeBalanceParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n route: AssetRoute;\n sourceAddress: string;\n}\n\nexport async function getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n}: GetDestinationFeeBalanceParams): Promise<AssetAmount> {\n if (route.destination.fee.asset.isEqual(balance)) {\n return balance;\n }\n\n if (route.destination.fee.asset.isEqual(feeBalance)) {\n return feeBalance;\n }\n\n if (!route.source.destinationFee?.balance) {\n throw new Error(\n 'BalanceBuilder must be defined for source.destinationFee.balance for AssetRoute',\n );\n }\n\n return getBalance({\n address: sourceAddress,\n asset: route.getDestinationFeeAssetOnSource(),\n builder: route.source.destinationFee?.balance,\n chain: route.source.chain,\n });\n}\n\nexport interface GetExtrinsicFeeParams {\n address: string;\n balance: AssetAmount;\n chain: AnyParachain;\n extrinsic: ExtrinsicConfig;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getExtrinsicFee({\n address,\n balance,\n chain,\n extrinsic,\n feeBalance,\n feeConfig,\n}: GetExtrinsicFeeParams): Promise<AssetAmount> {\n /**\n * If account has no balance (account doesn't exist),\n * we can't get the fee from some chains.\n * Example: Phala - PHA\n */\n try {\n const polkadot = await PolkadotService.create(chain);\n const fee = await polkadot.getFee(address, extrinsic);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n const totalFee = fee + extra;\n\n const converted = chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, feeBalance.decimals)\n : totalFee;\n\n return feeBalance.copyWith({ amount: converted });\n } catch (error) {\n if (balance.amount) {\n throw error;\n }\n\n return feeBalance.copyWith({ amount: 0n });\n }\n}\n\nexport interface GetContractFeeParams {\n address: string;\n balance: AssetAmount;\n chain: EvmChain | EvmParachain;\n contract: ContractConfig;\n destinationFee: AssetAmount;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getContractFee({\n address,\n balance,\n chain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n}: GetContractFeeParams): Promise<AssetAmount> {\n try {\n if (balance.amount === 0n) {\n return feeBalance.copyWith({ amount: 0n });\n }\n const evm = EvmService.create(chain);\n const fee = await evm.getFee(address, contract);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n\n return feeBalance.copyWith({ amount: fee + extra });\n } catch (error) {\n /**\n * Contract can throw an error if user balance is smaller than fee.\n * Or if you try to send 0 as amount.\n */\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFee.toDecimal()} ${destinationFee.getSymbol()} in your source balance, needed for destination fees`,\n { cause: error },\n );\n }\n}\n\ninterface ValidateSovereignAccountBalancesProps {\n amount: bigint;\n destinationData: DestinationChainTransferData;\n sourceData: SourceChainTransferData;\n}\n\nexport function validateSovereignAccountBalances({\n amount,\n sourceData,\n destinationData,\n}: ValidateSovereignAccountBalancesProps): void {\n if (\n !Parachain.is(destinationData.chain) ||\n !destinationData.chain.checkSovereignAccountBalances ||\n !destinationData.sovereignAccountBalances\n ) {\n return;\n }\n const { feeAssetBalance, transferAssetBalance } =\n destinationData.sovereignAccountBalances;\n\n if (amount > transferAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance for this transaction`,\n );\n }\n if (feeAssetBalance && sourceData.destinationFee.amount > feeAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance to pay for fees for this transaction`,\n );\n }\n}\n","import type {\n ContractConfig,\n EvmQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport {\n type Address,\n createPublicClient,\n type Hash,\n type HttpTransport,\n http,\n type PublicClient,\n} from 'viem';\nimport type { EvmSigner } from '../../sdk.interfaces';\n\nexport class EvmService {\n readonly chain: EvmChain | EvmParachain;\n\n readonly client: PublicClient<HttpTransport>;\n\n static create(chain: EvmChain | EvmParachain): EvmService {\n return new EvmService(chain);\n }\n\n constructor(chain: EvmChain | EvmParachain) {\n this.chain = chain;\n this.client = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async query(query: EvmQueryConfig) {\n return this.client[query.func](...query.args);\n }\n\n async getFee(address: string, contract: ContractConfig): Promise<bigint> {\n const gas = await this.client.estimateContractGas({\n abi: contract.abi,\n account: address as Address,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const gasPrice = await this.client.getGasPrice();\n\n return gas * gasPrice;\n }\n\n async getBalance(address: string, contract: ContractConfig): Promise<bigint> {\n const balance = await this.client.readContract({\n abi: contract.abi,\n address: contract.address as Address,\n args: [address],\n functionName: 'balanceOf',\n });\n\n if (typeof balance !== 'bigint') {\n throw new Error(\n `Could not get balance on ${this.chain.name} for ${address} from contract ${contract.address}`,\n );\n }\n\n return balance;\n }\n\n async transfer(signer: EvmSigner, contract: ContractConfig): Promise<Hash> {\n const { request } = await this.client.simulateContract({\n abi: contract.abi,\n account: signer.account,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const hash = await signer.writeContract(request);\n\n return hash;\n }\n}\n","import '@polkadot/api-augment';\n\nimport type {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { type AnyParachain, AssetAmount } from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport type { ApiPromise } from '@polkadot/api';\nimport type {\n Signer as PolkadotSigner,\n SubmittableExtrinsic,\n} from '@polkadot/api/types';\nimport type { u128 } from '@polkadot/types';\nimport type { RuntimeDispatchInfo } from '@polkadot/types/interfaces';\nimport type { IKeyringPair, ISubmittableResult } from '@polkadot/types/types';\nimport type { HexString } from '@polkadot/util/types';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n constructor(api: ApiPromise, chain: AnyParachain) {\n this.api = api;\n this.chain = chain;\n }\n\n static async create(chain: AnyParachain): Promise<PolkadotService> {\n return new PolkadotService(await getPolkadotApi(chain.ws), chain);\n }\n\n static async createMulti(chains: AnyParachain[]): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) => PolkadotService.create(chain)),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get existentialDeposit(): AssetAmount {\n const existentialDeposit = this.api.consts.balances?.existentialDeposit;\n const eqExistentialDeposit = this.api.consts.eqBalances\n ?.existentialDeposit as unknown as u128 | undefined;\n const amount =\n existentialDeposit?.toBigInt() || eqExistentialDeposit?.toBigInt() || 0n;\n\n return AssetAmount.fromChainAsset(this.chain.nativeAsset, { amount });\n }\n\n async query(config: SubstrateQueryConfig): Promise<bigint> {\n const response = await this.api.query[config.module][config.func](\n ...config.args,\n );\n\n return config.transform(response);\n }\n\n getExtrinsic(\n config: ExtrinsicConfig,\n ): SubmittableExtrinsic<'promise', ISubmittableResult> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n return fn(...args);\n }\n\n getExtrinsicCallHash(config: ExtrinsicConfig): HexString {\n return this.getExtrinsic(config).method.toHex();\n }\n\n async getPaymentInfo(\n account: string,\n config: ExtrinsicConfig,\n ): Promise<RuntimeDispatchInfo> {\n const extrinsic = this.getExtrinsic(config);\n\n return extrinsic.paymentInfo(account, { nonce: -1 });\n }\n\n async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const info = await this.getPaymentInfo(account, config);\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n statusCallback?: (params: ISubmittableResult) => void,\n ): Promise<string> {\n const extrinsic = this.getExtrinsic(config);\n\n const isSigner = this.#isSigner(signer);\n const signOptions = {\n nonce: -1,\n signer: isSigner ? signer : undefined,\n withSignedTransaction: true,\n };\n\n const hash = await new Promise<string>((resolve, reject) => {\n extrinsic\n .signAndSend(isSigner ? account : signer, signOptions, (result) => {\n if (result.isError || result.dispatchError) {\n reject(\n new Error(\n result.dispatchError?.toString() || 'Transaction failed',\n ),\n );\n }\n if (result.txHash) {\n resolve(result.txHash.toString());\n }\n statusCallback?.(result);\n })\n .catch(reject);\n });\n\n return hash;\n }\n\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","import type {\n ContractConfig,\n ExtrinsicConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport type {\n AnyParachain,\n AssetAmount,\n EvmChain,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport type { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport { PolkadotService } from '../services/polkadot';\nimport {\n getAssetMin,\n getBalance,\n getContractFee,\n getDestinationFeeBalance,\n getExistentialDeposit,\n getExtrinsicFee,\n getMax,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n route: AssetRoute;\n destinationAddress: string;\n destinationFee: AssetAmount;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n const asset = source.getChainAsset(route.source.asset);\n const feeAsset = route.source.fee\n ? source.getChainAsset(route.source.fee.asset)\n : asset;\n\n const balance = await getBalance({\n address: sourceAddress,\n asset,\n builder: route.source.balance,\n chain: source,\n });\n const feeBalance = await getBalance({\n address: sourceAddress,\n asset: feeAsset,\n builder: route.source.fee.balance,\n chain: source,\n });\n\n const destinationFeeBalance = await getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n });\n\n const existentialDeposit = await getExistentialDeposit(source);\n const min = await getAssetMin({\n asset,\n builder: route.source.min,\n chain: source,\n });\n\n const extrinsic = route.extrinsic?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const contract = route.contract?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const fee = await getFee({\n balance,\n chain: source,\n contract,\n destinationFee,\n extrinsic,\n feeBalance,\n feeConfig: route.source.fee,\n sourceAddress,\n });\n\n const max = getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n });\n\n return {\n balance,\n chain: source,\n destinationFee,\n destinationFeeBalance,\n existentialDeposit,\n fee,\n feeBalance,\n max,\n min,\n };\n}\n\nexport interface GetFeeParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n contract?: ContractConfig;\n chain: AnyParachain;\n destinationFee: AssetAmount;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeConfig;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n feeBalance,\n chain,\n contract,\n destinationFee,\n extrinsic,\n feeConfig,\n sourceAddress,\n}: GetFeeParams): Promise<AssetAmount> {\n if (!contract && !extrinsic) {\n throw new Error('Either contract or extrinsic must be provided');\n }\n\n if (contract) {\n return getContractFee({\n address: sourceAddress,\n balance,\n chain: chain as EvmChain | EvmParachain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n });\n }\n\n return getExtrinsicFee({\n address: sourceAddress,\n balance,\n chain,\n extrinsic: extrinsic as ExtrinsicConfig,\n feeBalance,\n feeConfig,\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyParachain;\n routes: AssetRoute[];\n evmSigner?: EvmSigner;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n routes,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueRoutes = routes.reduce((acc: AssetRoute[], route: AssetRoute) => {\n if (\n !acc.some((a: AssetRoute) => a.source.asset.isEqual(route.source.asset))\n ) {\n // biome-ignore lint/performance/noAccumulatingSpread: I think this is fine here\n return [route, ...acc];\n }\n\n return acc;\n }, []);\n\n const balances = await Promise.all(\n uniqueRoutes.map(async (route: AssetRoute) =>\n getBalance({\n address,\n asset: chain.getChainAsset(route.source.asset),\n builder: route.source.balance,\n chain,\n }),\n ),\n );\n\n return balances;\n}\n","import { ConfigService, xcmRoutesMap } from '@moonbeam-network/xcm-config';\nimport {\n type AnyAsset,\n type AnyChain,\n type AnyParachain,\n type AssetAmount,\n type Ecosystem,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData } from './getTransferData/getTransferData';\nimport type { TransferData } from './sdk.interfaces';\n\nconst DEFAULT_SERVICE = new ConfigService({ routes: xcmRoutesMap });\n\nexport interface SdkOptions {\n configService?: ConfigService;\n ecosystem?: Ecosystem;\n}\n\nexport function Sdk({ configService, ecosystem }: SdkOptions = {}) {\n const service = configService ?? DEFAULT_SERVICE;\n const assets = service.getEcosystemAssets(ecosystem);\n\n return {\n assets,\n setAsset(asset: string | AnyAsset) {\n const sources = service.getSourceChains({ asset, ecosystem });\n\n return {\n sources,\n setSource(source: string | AnyChain) {\n const destinations = service.getDestinationChains({\n asset,\n source,\n });\n\n return {\n destinations,\n setDestination(destination: string | AnyChain) {\n const route = service.getAssetRoute({\n asset,\n source,\n destination,\n });\n\n return {\n setAddresses({\n sourceAddress,\n destinationAddress,\n }: {\n sourceAddress: string;\n destinationAddress: string;\n }): Promise<TransferData> {\n const sourceChain = service.getChain(source);\n\n if (!EvmParachain.isAnyParachain(sourceChain)) {\n throw new Error(\n 'Source chain should be a Parachain or EvmParachain',\n );\n }\n\n if (!EvmParachain.isAnyParachain(route.destination.chain)) {\n throw new Error(\n 'Destination chain should be a Parachain or EvmParachain',\n );\n }\n\n return getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n });\n },\n };\n },\n };\n },\n };\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyParachain,\n address: string,\n service: ConfigService = DEFAULT_SERVICE,\n): Promise<AssetAmount[]> {\n const routes = service.getChainRoutes(chain).getRoutes();\n const balances = await getAssetsBalances({\n chain,\n routes,\n address,\n });\n\n return balances;\n}\n","import type { AssetRoute } from '@moonbeam-network/xcm-config';\nimport {\n type AnyParachain,\n AssetAmount,\n type EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type { Signers, TransferData } from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\nimport {\n convertToChainDecimals,\n getMin,\n validateSovereignAccountBalances,\n} from './getTransferData.utils';\n\ninterface GetTransferDataParams {\n route: AssetRoute;\n sourceAddress: string;\n destinationAddress: string;\n}\n\nexport async function getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n}: GetTransferDataParams): Promise<TransferData> {\n const destinationData = await getDestinationData({\n route,\n destinationAddress,\n });\n\n // NOTE: Here we need to convert the fee on the destination chain\n // to an asset on source chain.\n const destinationFee = convertToChainDecimals({\n asset: destinationData.fee,\n target: route.getDestinationFeeAssetOnSource(),\n });\n\n const sourceData = await getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n });\n\n return {\n destination: destinationData,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, sourceData.balance.decimals).toString(),\n );\n\n const result = bigAmount.minus(\n sourceData.balance.isSame(destinationFee)\n ? destinationFee.toBig()\n : Big(0),\n );\n\n return sourceData.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n max: sourceData.max,\n min: getMin(destinationData),\n source: sourceData,\n async transfer(\n amount,\n { evmSigner, polkadotSigner }: Partial<Signers>,\n statusCallback,\n ): Promise<string> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const bigintAmount = toBigInt(amount, sourceData.balance.decimals);\n validateSovereignAccountBalances({\n amount: bigintAmount,\n destinationData,\n sourceData,\n });\n const asset = AssetAmount.fromChainAsset(\n route.source.chain.getChainAsset(route.source.asset),\n { amount: bigintAmount },\n );\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n\n const contract = route.contract?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n const extrinsic = route.extrinsic?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n const evm = EvmService.create(source as EvmParachain);\n\n return evm.transfer(evmSigner, contract);\n }\n\n if (extrinsic) {\n if (!polkadotSigner) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return sourcePolkadot.transfer(\n sourceAddress,\n extrinsic,\n polkadotSigner,\n statusCallback,\n );\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n"],"mappings":"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","names":["Parachain","AssetAmount","AssetAmount","Parachain","EvmParachain","AssetAmount","toBigInt","Big","Big","toBigInt","AssetAmount","EvmParachain"]}
|
|
1
|
+
{"version":3,"sources":["../src/getTransferData/getDestinationData.ts","../src/getTransferData/getTransferData.utils.ts","../src/services/evm/EvmService.ts","../src/services/polkadot/PolkadotService.ts","../src/getTransferData/getSourceData.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts","../src/utils/monitoring.ts"],"sourcesContent":["import type {\n AssetRoute,\n DestinationConfig,\n SourceConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Parachain } from '@moonbeam-network/xcm-types';\nimport { getSovereignAccountAddresses } from '@moonbeam-network/xcm-utils';\nimport type { DestinationChainTransferData } from '../sdk.interfaces';\nimport {\n getAssetMin,\n getBalance,\n getDestinationFee,\n getExistentialDeposit,\n} from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n route: AssetRoute;\n destinationAddress: string;\n}\n\nexport async function getDestinationData({\n route,\n destinationAddress,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const destination = route.destination.chain;\n const asset = destination.getChainAsset(route.destination.asset);\n const balance = await getBalance({\n address: destinationAddress,\n asset,\n builder: route.destination.balance,\n chain: destination,\n });\n const min = await getAssetMin({\n asset,\n builder: route.destination.min,\n chain: destination,\n });\n const fee = await getDestinationFee({\n address: destinationAddress,\n feeAsset: route.destination.fee.asset,\n destination,\n fee: route.destination.fee.amount,\n source: route.source.chain,\n asset: route.source.asset,\n });\n const existentialDeposit = await getExistentialDeposit(destination);\n\n return {\n chain: destination,\n balance,\n existentialDeposit,\n fee,\n min,\n sovereignAccountBalances: await getSovereignAccountBalances({\n source: route.source,\n destination: route.destination,\n }),\n };\n}\n\ninterface GetSovereignAccountBalancesProps {\n source: SourceConfig;\n destination: DestinationConfig;\n}\n\nasync function getSovereignAccountBalances({\n destination,\n source,\n}: GetSovereignAccountBalancesProps) {\n if (\n !Parachain.is(source.chain) ||\n !Parachain.is(destination.chain) ||\n !destination.chain.checkSovereignAccountBalances\n ) {\n return undefined;\n }\n\n const sovereignAccountAddresses = getSovereignAccountAddresses(\n source.chain.parachainId,\n );\n\n const destinationFeeAssetBalance = destination.fee.balance;\n\n const sovereignAccountAddress = destination.chain.isRelay\n ? sovereignAccountAddresses.relay\n : sovereignAccountAddresses.generic;\n\n const sovereignAccountBalance = await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.asset),\n builder: destination.balance,\n chain: destination.chain,\n });\n\n const sovereignAccountFeeAssetBalance = destinationFeeAssetBalance\n ? await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.fee.asset),\n builder: destinationFeeAssetBalance,\n chain: destination.chain,\n })\n : undefined;\n return {\n feeAssetBalance: sovereignAccountFeeAssetBalance?.amount,\n transferAssetBalance: sovereignAccountBalance.amount,\n };\n}\n","import {\n type AssetMinConfigBuilder,\n type BalanceConfigBuilder,\n ContractConfig,\n EvmQueryConfig,\n type ExtrinsicConfig,\n type FeeConfigBuilder,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport {\n type AnyChain,\n type AnyParachain,\n type Asset,\n AssetAmount,\n type ChainAsset,\n EvmChain,\n EvmParachain,\n Parachain,\n} from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type {\n DestinationChainTransferData,\n SourceChainTransferData,\n} from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset: ChainAsset;\n builder: BalanceConfigBuilder;\n chain: AnyChain;\n}\nexport async function getBalance({\n address,\n asset,\n builder,\n chain,\n}: GetBalancesParams): Promise<AssetAmount> {\n const config = builder.build({\n address,\n asset,\n });\n const amount = AssetAmount.fromChainAsset(asset, { amount: 0n });\n\n if (SubstrateQueryConfig.is(config) && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const balance = await polkadot.query(config);\n const converted = chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, asset.decimals)\n : balance;\n\n return amount.copyWith({ amount: converted });\n }\n\n if (EvmChain.is(chain) || EvmParachain.is(chain)) {\n const evm = EvmService.create(chain);\n\n if (ContractConfig.is(config)) {\n const balance = await evm.getBalance(address, config);\n\n return amount.copyWith({ amount: balance });\n }\n\n if (EvmQueryConfig.is(config)) {\n const balance = await evm.query(config);\n\n return amount.copyWith({ amount: balance });\n }\n }\n\n throw new Error(\n `Can't get balance for ${address} on chain ${chain.name} and asset ${asset.symbol}`,\n );\n}\n\nexport interface GetMinParams {\n asset: Asset;\n builder?: AssetMinConfigBuilder;\n chain: AnyChain;\n}\n\nexport async function getAssetMin({\n asset,\n builder,\n chain,\n}: GetMinParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(chain.getChainAsset(asset), {\n amount: 0n,\n });\n\n if (builder && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const min = await polkadot.query(\n builder.build({ asset: zero.getMinAssetId(), address: zero.address }),\n );\n\n return zero.copyWith({ amount: min });\n }\n\n if (zero.min) {\n return zero.copyWith({ amount: zero.min });\n }\n\n return zero;\n}\n\nexport function getMin({\n balance,\n existentialDeposit,\n fee,\n min,\n}: DestinationChainTransferData) {\n const result = Big(0)\n .plus(balance.isSame(fee) ? fee.toBig() : Big(0))\n .plus(\n existentialDeposit &&\n balance.isSame(existentialDeposit) &&\n balance.toBig().lt(existentialDeposit.toBig())\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .plus(balance.toBig().lt(min.toBig()) ? min.toBig() : Big(0));\n\n return balance.copyWith({\n amount: BigInt(result.toFixed()),\n });\n}\n\nexport interface GetMaxParams {\n balance: AssetAmount;\n existentialDeposit?: AssetAmount;\n fee: AssetAmount;\n min: AssetAmount;\n}\n\nexport function getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n}: GetMaxParams): AssetAmount {\n const result = balance\n .toBig()\n .minus(min.toBig())\n .minus(\n existentialDeposit && balance.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balance.isSame(fee) ? fee.toBig() : Big(0));\n\n return balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetDestinationFeeParams {\n address: string;\n asset: Asset;\n feeAsset: Asset;\n destination: AnyChain;\n fee: number | FeeConfigBuilder;\n source: AnyChain;\n}\n\nexport async function getDestinationFee({\n address,\n asset,\n destination,\n fee,\n feeAsset,\n source,\n}: GetDestinationFeeParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(destination.getChainAsset(feeAsset), {\n amount: 0n,\n });\n\n if (typeof fee === 'number') {\n return zero.copyWith({\n amount: fee,\n });\n }\n\n if (EvmParachain.isAnyParachain(destination)) {\n const polkadot = await PolkadotService.create(destination);\n const cfg = fee.build({\n address,\n api: polkadot.api,\n asset: destination.getChainAsset(asset),\n destination,\n feeAsset: destination.getChainAsset(feeAsset),\n source,\n });\n\n return zero.copyWith({\n amount: await cfg.call(),\n });\n }\n\n return zero;\n}\n\nexport interface ConvertToChainDecimalsParams {\n asset: AssetAmount;\n target: ChainAsset;\n}\n\nexport function convertToChainDecimals({\n asset,\n target,\n}: ConvertToChainDecimalsParams): AssetAmount {\n return AssetAmount.fromChainAsset(target, {\n amount: asset.convertDecimals(target.decimals).amount,\n });\n}\n\nexport async function getExistentialDeposit(\n chain: AnyChain,\n): Promise<AssetAmount | undefined> {\n if (EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n\n return polkadot.existentialDeposit;\n }\n\n return undefined;\n}\n\nexport interface GetDestinationFeeBalanceParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n route: AssetRoute;\n sourceAddress: string;\n}\n\nexport async function getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n}: GetDestinationFeeBalanceParams): Promise<AssetAmount> {\n if (route.destination.fee.asset.isEqual(balance)) {\n return balance;\n }\n\n if (route.destination.fee.asset.isEqual(feeBalance)) {\n return feeBalance;\n }\n\n if (!route.source.destinationFee?.balance) {\n throw new Error(\n 'BalanceBuilder must be defined for source.destinationFee.balance for AssetRoute',\n );\n }\n\n return getBalance({\n address: sourceAddress,\n asset: route.getDestinationFeeAssetOnSource(),\n builder: route.source.destinationFee?.balance,\n chain: route.source.chain,\n });\n}\n\nexport interface GetExtrinsicFeeParams {\n address: string;\n balance: AssetAmount;\n chain: AnyParachain;\n extrinsic: ExtrinsicConfig;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getExtrinsicFee({\n address,\n balance,\n chain,\n extrinsic,\n feeBalance,\n feeConfig,\n}: GetExtrinsicFeeParams): Promise<AssetAmount> {\n /**\n * If account has no balance (account doesn't exist),\n * we can't get the fee from some chains.\n * Example: Phala - PHA\n */\n try {\n const polkadot = await PolkadotService.create(chain);\n const fee = await polkadot.getFee(address, extrinsic);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n const totalFee = fee + extra;\n\n const converted = chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, feeBalance.decimals)\n : totalFee;\n\n return feeBalance.copyWith({ amount: converted });\n } catch (error) {\n if (balance.amount) {\n throw error;\n }\n\n return feeBalance.copyWith({ amount: 0n });\n }\n}\n\nexport interface GetContractFeeParams {\n address: string;\n balance: AssetAmount;\n chain: EvmChain | EvmParachain;\n contract: ContractConfig;\n destinationFee: AssetAmount;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getContractFee({\n address,\n balance,\n chain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n}: GetContractFeeParams): Promise<AssetAmount> {\n try {\n if (balance.amount === 0n) {\n return feeBalance.copyWith({ amount: 0n });\n }\n const evm = EvmService.create(chain);\n const fee = await evm.getFee(address, contract);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n\n return feeBalance.copyWith({ amount: fee + extra });\n } catch (error) {\n /**\n * Contract can throw an error if user balance is smaller than fee.\n * Or if you try to send 0 as amount.\n */\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFee.toDecimal()} ${destinationFee.getSymbol()} in your source balance, needed for destination fees`,\n { cause: error },\n );\n }\n}\n\ninterface ValidateSovereignAccountBalancesProps {\n amount: bigint;\n destinationData: DestinationChainTransferData;\n sourceData: SourceChainTransferData;\n}\n\nexport function validateSovereignAccountBalances({\n amount,\n sourceData,\n destinationData,\n}: ValidateSovereignAccountBalancesProps): void {\n if (\n !Parachain.is(destinationData.chain) ||\n !destinationData.chain.checkSovereignAccountBalances ||\n !destinationData.sovereignAccountBalances\n ) {\n return;\n }\n const { feeAssetBalance, transferAssetBalance } =\n destinationData.sovereignAccountBalances;\n\n if (amount > transferAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance for this transaction`,\n );\n }\n if (feeAssetBalance && sourceData.destinationFee.amount > feeAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance to pay for fees for this transaction`,\n );\n }\n}\n","import type {\n ContractConfig,\n EvmQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport {\n type Address,\n createPublicClient,\n type Hash,\n type HttpTransport,\n http,\n type PublicClient,\n} from 'viem';\nimport type { EvmSigner } from '../../sdk.interfaces';\n\nexport class EvmService {\n readonly chain: EvmChain | EvmParachain;\n\n readonly client: PublicClient<HttpTransport>;\n\n static create(chain: EvmChain | EvmParachain): EvmService {\n return new EvmService(chain);\n }\n\n constructor(chain: EvmChain | EvmParachain) {\n this.chain = chain;\n this.client = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async query(query: EvmQueryConfig) {\n return this.client[query.func](...query.args);\n }\n\n async getFee(address: string, contract: ContractConfig): Promise<bigint> {\n const gas = await this.client.estimateContractGas({\n abi: contract.abi,\n account: address as Address,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const gasPrice = await this.client.getGasPrice();\n\n return gas * gasPrice;\n }\n\n async getBalance(address: string, contract: ContractConfig): Promise<bigint> {\n const balance = await this.client.readContract({\n abi: contract.abi,\n address: contract.address as Address,\n args: [address],\n functionName: 'balanceOf',\n });\n\n if (typeof balance !== 'bigint') {\n throw new Error(\n `Could not get balance on ${this.chain.name} for ${address} from contract ${contract.address}`,\n );\n }\n\n return balance;\n }\n\n async transfer(signer: EvmSigner, contract: ContractConfig): Promise<Hash> {\n const { request } = await this.client.simulateContract({\n abi: contract.abi,\n account: signer.account,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const hash = await signer.writeContract(request);\n\n return hash;\n }\n}\n","import '@polkadot/api-augment';\n\nimport type {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { type AnyParachain, AssetAmount } from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport type { ApiPromise } from '@polkadot/api';\nimport type {\n Signer as PolkadotSigner,\n SubmittableExtrinsic,\n} from '@polkadot/api/types';\nimport type { u128 } from '@polkadot/types';\nimport type { RuntimeDispatchInfo } from '@polkadot/types/interfaces';\nimport type { IKeyringPair, ISubmittableResult } from '@polkadot/types/types';\nimport type { HexString } from '@polkadot/util/types';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n constructor(api: ApiPromise, chain: AnyParachain) {\n this.api = api;\n this.chain = chain;\n }\n\n static async create(chain: AnyParachain): Promise<PolkadotService> {\n return new PolkadotService(await getPolkadotApi(chain.ws), chain);\n }\n\n static async createMulti(chains: AnyParachain[]): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) => PolkadotService.create(chain)),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get existentialDeposit(): AssetAmount {\n const existentialDeposit = this.api.consts.balances?.existentialDeposit;\n const eqExistentialDeposit = this.api.consts.eqBalances\n ?.existentialDeposit as unknown as u128 | undefined;\n const amount =\n existentialDeposit?.toBigInt() || eqExistentialDeposit?.toBigInt() || 0n;\n\n return AssetAmount.fromChainAsset(this.chain.nativeAsset, { amount });\n }\n\n async query(config: SubstrateQueryConfig): Promise<bigint> {\n const response = await this.api.query[config.module][config.func](\n ...config.args,\n );\n\n return config.transform(response);\n }\n\n getExtrinsic(\n config: ExtrinsicConfig,\n ): SubmittableExtrinsic<'promise', ISubmittableResult> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n return fn(...args);\n }\n\n getExtrinsicCallHash(config: ExtrinsicConfig): HexString {\n return this.getExtrinsic(config).method.toHex();\n }\n\n async getPaymentInfo(\n account: string,\n config: ExtrinsicConfig,\n ): Promise<RuntimeDispatchInfo> {\n const extrinsic = this.getExtrinsic(config);\n\n return extrinsic.paymentInfo(account, { nonce: -1 });\n }\n\n async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const info = await this.getPaymentInfo(account, config);\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n statusCallback?: (params: ISubmittableResult) => void,\n ): Promise<string> {\n const extrinsic = this.getExtrinsic(config);\n\n const isSigner = this.#isSigner(signer);\n const signOptions = {\n nonce: -1,\n signer: isSigner ? signer : undefined,\n withSignedTransaction: true,\n };\n\n const hash = await new Promise<string>((resolve, reject) => {\n extrinsic\n .signAndSend(isSigner ? account : signer, signOptions, (result) => {\n if (result.isError || result.dispatchError) {\n reject(\n new Error(\n result.dispatchError?.toString() || 'Transaction failed',\n ),\n );\n }\n if (result.txHash) {\n resolve(result.txHash.toString());\n }\n statusCallback?.(result);\n })\n .catch(reject);\n });\n\n return hash;\n }\n\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","import type {\n ContractConfig,\n ExtrinsicConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport type {\n AnyParachain,\n AssetAmount,\n EvmChain,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport type { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport { PolkadotService } from '../services/polkadot';\nimport {\n getAssetMin,\n getBalance,\n getContractFee,\n getDestinationFeeBalance,\n getExistentialDeposit,\n getExtrinsicFee,\n getMax,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n route: AssetRoute;\n destinationAddress: string;\n destinationFee: AssetAmount;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n const asset = source.getChainAsset(route.source.asset);\n const feeAsset = route.source.fee\n ? source.getChainAsset(route.source.fee.asset)\n : asset;\n\n const balance = await getBalance({\n address: sourceAddress,\n asset,\n builder: route.source.balance,\n chain: source,\n });\n const feeBalance = await getBalance({\n address: sourceAddress,\n asset: feeAsset,\n builder: route.source.fee.balance,\n chain: source,\n });\n\n const destinationFeeBalance = await getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n });\n\n const existentialDeposit = await getExistentialDeposit(source);\n const min = await getAssetMin({\n asset,\n builder: route.source.min,\n chain: source,\n });\n\n const extrinsic = route.extrinsic?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const contract = route.contract?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const fee = await getFee({\n balance,\n chain: source,\n contract,\n destinationFee,\n extrinsic,\n feeBalance,\n feeConfig: route.source.fee,\n sourceAddress,\n });\n\n const max = getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n });\n\n return {\n balance,\n chain: source,\n destinationFee,\n destinationFeeBalance,\n existentialDeposit,\n fee,\n feeBalance,\n max,\n min,\n };\n}\n\nexport interface GetFeeParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n contract?: ContractConfig;\n chain: AnyParachain;\n destinationFee: AssetAmount;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeConfig;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n feeBalance,\n chain,\n contract,\n destinationFee,\n extrinsic,\n feeConfig,\n sourceAddress,\n}: GetFeeParams): Promise<AssetAmount> {\n if (!contract && !extrinsic) {\n throw new Error('Either contract or extrinsic must be provided');\n }\n\n if (contract) {\n return getContractFee({\n address: sourceAddress,\n balance,\n chain: chain as EvmChain | EvmParachain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n });\n }\n\n return getExtrinsicFee({\n address: sourceAddress,\n balance,\n chain,\n extrinsic: extrinsic as ExtrinsicConfig,\n feeBalance,\n feeConfig,\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyParachain;\n routes: AssetRoute[];\n evmSigner?: EvmSigner;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n routes,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueRoutes = routes.reduce((acc: AssetRoute[], route: AssetRoute) => {\n if (\n !acc.some((a: AssetRoute) => a.source.asset.isEqual(route.source.asset))\n ) {\n // biome-ignore lint/performance/noAccumulatingSpread: I think this is fine here\n return [route, ...acc];\n }\n\n return acc;\n }, []);\n\n const balances = await Promise.all(\n uniqueRoutes.map(async (route: AssetRoute) =>\n getBalance({\n address,\n asset: chain.getChainAsset(route.source.asset),\n builder: route.source.balance,\n chain,\n }),\n ),\n );\n\n return balances;\n}\n","import { ConfigService, xcmRoutesMap } from '@moonbeam-network/xcm-config';\nimport {\n type AnyAsset,\n type AnyChain,\n type AnyParachain,\n type AssetAmount,\n type Ecosystem,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData } from './getTransferData/getTransferData';\nimport type { TransferData } from './sdk.interfaces';\n\nconst DEFAULT_SERVICE = new ConfigService({ routes: xcmRoutesMap });\n\nexport interface SdkOptions {\n configService?: ConfigService;\n ecosystem?: Ecosystem;\n}\n\nexport function Sdk({ configService, ecosystem }: SdkOptions = {}) {\n const service = configService ?? DEFAULT_SERVICE;\n const assets = service.getEcosystemAssets(ecosystem);\n\n return {\n assets,\n setAsset(asset: string | AnyAsset) {\n const sources = service.getSourceChains({ asset, ecosystem });\n\n return {\n sources,\n setSource(source: string | AnyChain) {\n const destinations = service.getDestinationChains({\n asset,\n source,\n });\n\n return {\n destinations,\n setDestination(destination: string | AnyChain) {\n const route = service.getAssetRoute({\n asset,\n source,\n destination,\n });\n\n return {\n setAddresses({\n sourceAddress,\n destinationAddress,\n }: {\n sourceAddress: string;\n destinationAddress: string;\n }): Promise<TransferData> {\n const sourceChain = service.getChain(source);\n\n if (!EvmParachain.isAnyParachain(sourceChain)) {\n throw new Error(\n 'Source chain should be a Parachain or EvmParachain',\n );\n }\n\n if (!EvmParachain.isAnyParachain(route.destination.chain)) {\n throw new Error(\n 'Destination chain should be a Parachain or EvmParachain',\n );\n }\n\n return getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n });\n },\n };\n },\n };\n },\n };\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyParachain,\n address: string,\n service: ConfigService = DEFAULT_SERVICE,\n): Promise<AssetAmount[]> {\n const routes = service.getChainRoutes(chain).getRoutes();\n const balances = await getAssetsBalances({\n chain,\n routes,\n address,\n });\n\n return balances;\n}\n","import type { AssetRoute } from '@moonbeam-network/xcm-config';\nimport {\n type AnyParachain,\n AssetAmount,\n type EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type { TransferData, TransferParams } from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\nimport {\n createMonitoringCallback,\n listenToSourceEvents,\n} from '../utils/monitoring';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\nimport {\n convertToChainDecimals,\n getMin,\n validateSovereignAccountBalances,\n} from './getTransferData.utils';\n\ninterface GetTransferDataParams {\n route: AssetRoute;\n sourceAddress: string;\n destinationAddress: string;\n}\n\nexport async function getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n}: GetTransferDataParams): Promise<TransferData> {\n const destinationData = await getDestinationData({\n route,\n destinationAddress,\n });\n\n // NOTE: Here we need to convert the fee on the destination chain\n // to an asset on source chain.\n const destinationFee = convertToChainDecimals({\n asset: destinationData.fee,\n target: route.getDestinationFeeAssetOnSource(),\n });\n\n const sourceData = await getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n });\n\n return {\n destination: destinationData,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, sourceData.balance.decimals).toString(),\n );\n\n const result = bigAmount.minus(\n sourceData.balance.isSame(destinationFee)\n ? destinationFee.toBig()\n : Big(0),\n );\n\n return sourceData.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n max: sourceData.max,\n min: getMin(destinationData),\n source: sourceData,\n async transfer({\n amount,\n signers: { evmSigner, polkadotSigner },\n statusCallback,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n }: TransferParams): Promise<string> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const bigintAmount = toBigInt(amount, sourceData.balance.decimals);\n validateSovereignAccountBalances({\n amount: bigintAmount,\n destinationData,\n sourceData,\n });\n const asset = AssetAmount.fromChainAsset(\n route.source.chain.getChainAsset(route.source.asset),\n { amount: bigintAmount },\n );\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n\n const contract = route.contract?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n const extrinsic = route.extrinsic?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const shouldListenToEvents =\n !!onSourceFinalized ||\n !!onSourceError ||\n !!onDestinationFinalized ||\n !!onDestinationError;\n\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n const evm = EvmService.create(source as EvmParachain);\n\n const hash = await evm.transfer(evmSigner, contract);\n\n if (shouldListenToEvents) {\n listenToSourceEvents({\n route,\n sourceAddress,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n });\n }\n\n return hash;\n }\n\n if (extrinsic) {\n if (!polkadotSigner) {\n throw new Error('Polkadot signer must be provided');\n }\n\n const monitoringCallback = shouldListenToEvents\n ? createMonitoringCallback({\n sourceAddress,\n route,\n statusCallback,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n })\n : undefined;\n\n return sourcePolkadot.transfer(\n sourceAddress,\n extrinsic,\n polkadotSigner,\n monitoringCallback || statusCallback,\n );\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n","import type { EventMonitoringConfig } from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute } from '@moonbeam-network/xcm-config';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport type { ApiPromise } from '@polkadot/api';\nimport type { EventRecord } from '@polkadot/types/interfaces';\nimport type { ISubmittableResult } from '@polkadot/types/types';\n\ninterface ListenToDestinationEventsProps {\n route: AssetRoute;\n monitoringConfig: EventMonitoringConfig;\n messageId?: string;\n onDestinationFinalized?: () => void;\n onDestinationError?: (error: Error) => void;\n}\n\nconst ENABLE_LOGGING = process.env.ENABLE_LOGGING === 'true';\n\nfunction log(label: string, message?: unknown): void {\n if (ENABLE_LOGGING) {\n console.log(`[${label}]`, message ?? '');\n }\n}\n\nexport async function listenToDestinationEvents({\n route,\n monitoringConfig,\n messageId,\n onDestinationFinalized,\n onDestinationError,\n}: ListenToDestinationEventsProps): Promise<void> {\n if (!route?.destination?.chain || !('ws' in route.destination.chain)) {\n log('No destination WS endpoint available');\n return;\n }\n\n try {\n const api: ApiPromise = await getPolkadotApi(route.destination.chain.ws);\n\n log('Subscribing to destination events...');\n const unsubscribe = await api.query.system.events((events) => {\n log('Destination events', events.toHuman());\n\n const destinationResult = monitoringConfig.checkDestination(\n events,\n messageId,\n );\n\n if (destinationResult.matched) {\n log('Destination event matched:', destinationResult.event?.toHuman());\n\n unsubscribe();\n\n if (destinationResult.success) {\n onDestinationFinalized?.();\n } else {\n const error = new Error(\n `Message processing failed on destination chain: ${route.destination.chain.name}`,\n );\n console.error(\n 'Destination message processing failed:',\n destinationResult.event?.toHuman(),\n );\n onDestinationError?.(error);\n }\n }\n });\n } catch (error) {\n console.error('Error listening to destination events:', error);\n onDestinationError?.(error as Error);\n }\n}\n\ninterface CreateMonitoringCallbackProps {\n sourceAddress: string;\n route: AssetRoute;\n statusCallback?: (status: ISubmittableResult) => void;\n onSourceFinalized?: () => void;\n onSourceError?: (error: Error) => void;\n onDestinationFinalized?: () => void;\n onDestinationError?: (error: Error) => void;\n}\n\ninterface ListenToSourceEventsProps extends CreateMonitoringCallbackProps {}\n\ninterface ProcessSourceEventsProps extends ListenToSourceEventsProps {\n events: EventRecord[];\n unsubscribe?: () => void;\n}\n\nexport function processSourceEvents({\n events,\n sourceAddress,\n route,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n unsubscribe,\n}: ProcessSourceEventsProps): void {\n const monitoringConfig = route.monitoring;\n if (!monitoringConfig) {\n log('No monitoring config found');\n unsubscribe?.();\n return;\n }\n\n const extrinsicFailedEvent = events.find((event) => {\n return (\n event.event.section === 'system' &&\n event.event.method === 'ExtrinsicFailed'\n );\n });\n\n if (extrinsicFailedEvent) {\n onSourceError?.(new Error('Extrinsic failed'));\n unsubscribe?.();\n return;\n }\n\n try {\n const sourceResult = monitoringConfig.checkSource(events, sourceAddress);\n\n if (sourceResult.matched) {\n log('Source event matched:', sourceResult.event?.toHuman());\n onSourceFinalized?.();\n\n if (unsubscribe) {\n log('Unsubscribing from source events...');\n unsubscribe();\n }\n\n listenToDestinationEvents({\n route,\n monitoringConfig,\n messageId: sourceResult.messageId,\n onDestinationFinalized,\n onDestinationError,\n });\n\n return;\n }\n } catch (error) {\n console.error('Error in MonitoringBuilder config:', error);\n return;\n }\n}\n\nexport function createMonitoringCallback({\n sourceAddress,\n route,\n statusCallback,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n}: CreateMonitoringCallbackProps) {\n return (status: ISubmittableResult) => {\n // Execute the original user callback\n statusCallback?.(status);\n\n processSourceEvents({\n events: status.events,\n sourceAddress,\n route,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n });\n };\n}\n\nexport async function listenToSourceEvents({\n route,\n sourceAddress,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n}: ListenToSourceEventsProps) {\n if (!route?.source?.chain || !('ws' in route.source.chain)) {\n log('No source WS endpoint available');\n return;\n }\n\n try {\n const api: ApiPromise = await getPolkadotApi(route.source.chain.ws);\n\n log('Subscribing to source events...');\n const unsubscribe = await api.query.system.events((events) => {\n log('Source events:', events.toHuman());\n\n processSourceEvents({\n events,\n sourceAddress,\n route,\n onSourceFinalized,\n onSourceError,\n onDestinationFinalized,\n onDestinationError,\n unsubscribe,\n });\n });\n } catch (error) {\n console.error('Error listening to source events:', error);\n }\n}\n"],"mappings":"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","names":["Parachain","AssetAmount","AssetAmount","Parachain","EvmParachain","AssetAmount","toBigInt","Big","getPolkadotApi","Big","toBigInt","AssetAmount","EvmParachain"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moonbeam-network/xcm-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "The Moonbeam XCM SDK enables developers to easily deposit and withdraw assets to Moonbeam/Moonriver from the relay chain and other parachains in the Polkadot/Kusama ecosystem",
|
|
5
5
|
"author": "moonbeam-foundation",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"main": "./build/index.mjs",
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"big.js": "^7.0.1",
|
|
38
|
-
"@moonbeam-network/xcm-builder": "
|
|
39
|
-
"@moonbeam-network/xcm-config": "
|
|
40
|
-
"@moonbeam-network/xcm-types": "
|
|
41
|
-
"@moonbeam-network/xcm-utils": "
|
|
38
|
+
"@moonbeam-network/xcm-builder": "4.0.0",
|
|
39
|
+
"@moonbeam-network/xcm-config": "4.0.0",
|
|
40
|
+
"@moonbeam-network/xcm-types": "4.0.0",
|
|
41
|
+
"@moonbeam-network/xcm-utils": "4.0.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@polkadot/api": "16.4.1",
|