diff --git a/packages/config/src/chains.ts b/packages/config/src/chains.ts index 39085ddf..624eef9c 100644 --- a/packages/config/src/chains.ts +++ b/packages/config/src/chains.ts @@ -1400,9 +1400,12 @@ export const zeitgeist = new Parachain({ assetsData: [ { asset: usdcwh, - decimals: 10, id: { ForeignAsset: 1 }, }, + { + asset: glmr, + id: { ForeignAsset: 3 }, + }, ], ecosystem: Ecosystem.Polkadot, genesisHash: @@ -1411,6 +1414,7 @@ export const zeitgeist = new Parachain({ name: 'Zeitgeist', parachainId: 2092, ss58Format: 73, + usesOwnDecimalsInternally: true, ws: 'wss://zeitgeist-rpc.dwellir.com', }); diff --git a/packages/config/src/configs/moonbeam.ts b/packages/config/src/configs/moonbeam.ts index 9a36c4b2..e5883d5a 100644 --- a/packages/config/src/configs/moonbeam.ts +++ b/packages/config/src/configs/moonbeam.ts @@ -165,7 +165,18 @@ export const moonbeamConfig = new ChainConfig({ contract: ContractBuilder().Xtokens().transfer(), destination: pendulum, destinationFee: { - amount: 0.0002, // + amount: 0.0002, + asset: glmr, + balance: BalanceBuilder().substrate().system().account(), + }, + }), + new AssetConfig({ + asset: glmr, + balance: BalanceBuilder().substrate().system().account(), + contract: ContractBuilder().Xtokens().transfer(), + destination: zeitgeist, + destinationFee: { + amount: 0.3, asset: glmr, balance: BalanceBuilder().substrate().system().account(), }, @@ -521,7 +532,7 @@ export const moonbeamConfig = new ChainConfig({ contract: ContractBuilder().Xtokens().transfer(), destination: zeitgeist, destinationFee: { - amount: 0.001, + amount: 0.101, asset: usdcwh, balance: BalanceBuilder().evm().erc20(), }, diff --git a/packages/config/src/configs/zeitgeist.ts b/packages/config/src/configs/zeitgeist.ts index 3e761b12..2fbf5d5f 100644 --- a/packages/config/src/configs/zeitgeist.ts +++ b/packages/config/src/configs/zeitgeist.ts @@ -3,7 +3,7 @@ import { ExtrinsicBuilder, FeeBuilder, } from '@moonbeam-network/xcm-builder'; -import { usdcwh, ztg } from '../assets'; +import { glmr, usdcwh, ztg } from '../assets'; import { moonbeam, zeitgeist } from '../chains'; import { AssetConfig } from '../types/AssetConfig'; import { ChainConfig } from '../types/ChainConfig'; @@ -27,7 +27,22 @@ export const zeitgeistConfig = new ChainConfig({ destination: moonbeam, destinationFee: { amount: 0.04, + asset: glmr, + balance: BalanceBuilder().substrate().tokens().accounts(), + }, + extrinsic: ExtrinsicBuilder().xTokens().transferMultiCurrencies(), + fee: { asset: ztg, + balance: BalanceBuilder().substrate().system().account(), + }, + }), + new AssetConfig({ + asset: glmr, + balance: BalanceBuilder().substrate().tokens().accounts(), + destination: moonbeam, + destinationFee: { + amount: 0.01, + asset: glmr, balance: BalanceBuilder().substrate().tokens().accounts(), }, extrinsic: ExtrinsicBuilder().xTokens().transfer(), diff --git a/packages/sdk/src/getTransferData/getDestinationData.ts b/packages/sdk/src/getTransferData/getDestinationData.ts index d6e51256..fbfe0ee3 100644 --- a/packages/sdk/src/getTransferData/getDestinationData.ts +++ b/packages/sdk/src/getTransferData/getDestinationData.ts @@ -29,6 +29,7 @@ export async function getDestinationData({ amount: 0n, decimals: await getDecimals({ address: destinationAddress, + chain, config, evmSigner, polkadot, @@ -37,7 +38,9 @@ export async function getDestinationData({ const balance = await getBalance({ address: destinationAddress, + chain, config, + decimals: zeroAmount.decimals, evmSigner, polkadot, }); @@ -53,7 +56,6 @@ export async function getDestinationData({ polkadot, }); const minAmount = zeroAmount.copyWith({ amount: min }); - return { balance: balanceAmount, chain, diff --git a/packages/sdk/src/getTransferData/getSourceData.ts b/packages/sdk/src/getTransferData/getSourceData.ts index c5b2ff6b..c25105e3 100644 --- a/packages/sdk/src/getTransferData/getSourceData.ts +++ b/packages/sdk/src/getTransferData/getSourceData.ts @@ -5,13 +5,18 @@ import { SubstrateQueryConfig, } from '@moonbeam-network/xcm-builder'; import { FeeAssetConfig, TransferConfig } from '@moonbeam-network/xcm-config'; -import { AssetAmount } from '@moonbeam-network/xcm-types'; +import { AnyChain, AssetAmount } from '@moonbeam-network/xcm-types'; import { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils'; import Big from 'big.js'; import { TransferContractInterface, createContract } from '../contract'; import { PolkadotService } from '../polkadot'; import { EvmSigner, SourceChainTransferData } from '../sdk.interfaces'; -import { getBalance, getDecimals, getMin } from './getTransferData.utils'; +import { + GetBalancesParams, + getBalance, + getDecimals, + getMin, +} from './getTransferData.utils'; export interface GetSourceDataParams { transferConfig: TransferConfig; @@ -39,6 +44,7 @@ export async function getSourceData({ amount: 0n, decimals: await getDecimals({ address: destinationAddress, + chain, config, evmSigner, polkadot, @@ -50,6 +56,7 @@ export async function getSourceData({ decimals: await getDecimals({ address: destinationAddress, asset: config.fee.asset, + chain, config, evmSigner, polkadot, @@ -62,6 +69,7 @@ export async function getSourceData({ decimals: await getDecimals({ address: destinationAddress, asset: config.destinationFee.asset, + chain, config, evmSigner, polkadot, @@ -71,14 +79,18 @@ export async function getSourceData({ const balance = await getBalance({ address: sourceAddress, + chain, config, + decimals: zeroAmount.decimals, evmSigner, polkadot, }); - const feeBalance = await getFeeBalances({ + const feeBalance = await getFeeBalance({ address: sourceAddress, balance, + chain, + decimals: zeroFeeAmount.decimals, feeConfig: config.fee, polkadot, }); @@ -87,9 +99,11 @@ export async function getSourceData({ config.destinationFee.asset, ) ? balance - : await getFeeBalances({ + : await getFeeBalance({ address: sourceAddress, balance, + chain, + decimals: zeroDestinationFeeAmount.decimals, feeConfig: config.destinationFee, polkadot, }); @@ -117,6 +131,7 @@ export async function getSourceData({ }); const fee = await getFee({ balance, + chain, contract, decimals: zeroFeeAmount.decimals, evmSigner, @@ -134,6 +149,7 @@ export async function getSourceData({ amount: destinationFeeBalance, }); const minAmount = zeroAmount.copyWith({ amount: min }); + const maxAmount = getMax({ balanceAmount, existentialDeposit, @@ -153,32 +169,41 @@ export async function getSourceData({ }; } -export interface GetBalancesParams { - address: string; +export interface GetFeeBalanceParams + extends Omit { balance: bigint; feeConfig: FeeAssetConfig | undefined; - polkadot: PolkadotService; } -export async function getFeeBalances({ +export async function getFeeBalance({ address, balance, + chain, + decimals, feeConfig, polkadot, -}: GetBalancesParams) { - return feeConfig - ? polkadot.query( - feeConfig.balance.build({ - address, - asset: polkadot.chain.getBalanceAssetId(feeConfig.asset), - }) as SubstrateQueryConfig, - ) - : balance; +}: GetFeeBalanceParams) { + if (!feeConfig) { + return balance; + } + + const convertAmount = chain.usesOwnDecimalsInternally; + const feeBalance = await polkadot.query( + feeConfig.balance.build({ + address, + asset: polkadot.chain.getBalanceAssetId(feeConfig.asset), + }) as SubstrateQueryConfig, + ); + + return convertAmount + ? convertDecimals(feeBalance, polkadot.decimals, decimals) + : feeBalance; } export interface GetFeeParams { balance: bigint; contract?: ContractConfig; + chain: AnyChain; decimals: number; evmSigner?: EvmSigner; extrinsic?: ExtrinsicConfig; @@ -189,6 +214,7 @@ export interface GetFeeParams { export async function getFee({ balance, + chain, contract, decimals, evmSigner, @@ -215,7 +241,13 @@ export async function getFee({ const xcmDeliveryFee = getXcmDeliveryFee(decimals, feeConfig); - return extrinsicFee + xcmDeliveryFee; + const convertAmount = chain.usesOwnDecimalsInternally; + + const totalFee = extrinsicFee + xcmDeliveryFee; + + return convertAmount + ? convertDecimals(totalFee, polkadot.decimals, decimals) + : totalFee; } throw new Error('Either contract or extrinsic must be provided'); diff --git a/packages/sdk/src/getTransferData/getTransferData.utils.ts b/packages/sdk/src/getTransferData/getTransferData.utils.ts index f0c4b1ac..29ca2c40 100644 --- a/packages/sdk/src/getTransferData/getTransferData.utils.ts +++ b/packages/sdk/src/getTransferData/getTransferData.utils.ts @@ -1,32 +1,42 @@ import { CallType, SubstrateQueryConfig } from '@moonbeam-network/xcm-builder'; import { AssetConfig } from '@moonbeam-network/xcm-config'; -import { Asset } from '@moonbeam-network/xcm-types'; -import { toBigInt } from '@moonbeam-network/xcm-utils'; +import { AnyChain, Asset } from '@moonbeam-network/xcm-types'; +import { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils'; import { BalanceContractInterface, createContract } from '../contract'; import { PolkadotService } from '../polkadot'; import { EvmSigner } from '../sdk.interfaces'; -export interface GetFeeBalancesParams { +export interface GetBalancesParams { address: string; + asset?: Asset; + chain: AnyChain; config: AssetConfig; + decimals: number; evmSigner?: EvmSigner; polkadot: PolkadotService; - asset?: Asset; } +export type GetDecimalsParams = Omit; + export async function getBalance({ address, + chain, config, + decimals, evmSigner, polkadot, -}: GetFeeBalancesParams) { +}: GetBalancesParams) { const cfg = config.balance.build({ address, asset: polkadot.chain.getBalanceAssetId(config.asset), }); if (cfg.type === CallType.Substrate) { - return polkadot.query(cfg as SubstrateQueryConfig); + const convertAmount = chain.usesOwnDecimalsInternally; + const balance = await polkadot.query(cfg as SubstrateQueryConfig); + return convertAmount + ? convertDecimals(balance, polkadot.decimals, decimals) + : balance; } if (!evmSigner) { @@ -44,7 +54,7 @@ export async function getDecimals({ config, evmSigner, polkadot, -}: GetFeeBalancesParams) { +}: GetDecimalsParams) { const cfg = config.balance.build({ address, asset: polkadot.chain.getBalanceAssetId(asset || config.asset), diff --git a/packages/types/src/chain/parachain/Parachain.ts b/packages/types/src/chain/parachain/Parachain.ts index 03cb14ae..3094cebb 100644 --- a/packages/types/src/chain/parachain/Parachain.ts +++ b/packages/types/src/chain/parachain/Parachain.ts @@ -10,6 +10,7 @@ export interface ParachainConstructorParams genesisHash: string; parachainId: number; ss58Format: number; + usesOwnDecimalsInternally?: boolean; weight?: number; ws: string; } @@ -23,6 +24,8 @@ export class Parachain extends Chain { readonly ss58Format: number; + readonly usesOwnDecimalsInternally: boolean; + readonly weight: number | undefined; readonly ws: string; @@ -31,6 +34,7 @@ export class Parachain extends Chain { assetsData, genesisHash, parachainId, + usesOwnDecimalsInternally, ss58Format, weight, ws, @@ -46,6 +50,7 @@ export class Parachain extends Chain { this.genesisHash = genesisHash; this.parachainId = parachainId; this.ss58Format = ss58Format; + this.usesOwnDecimalsInternally = !!usesOwnDecimalsInternally; this.weight = weight; this.ws = ws; }