Skip to content

Commit

Permalink
Bit.Country Pioneer integration with Moonbase (#39)
Browse files Browse the repository at this point in the history
* initial pioneer configuration

* WIP neer config and balance interface change

* adapt neer config to interface

* add initial bit configuration

* fix and remove unnecessary test

* small adjustments and remove obsolete snapshots

* add enum constant

* add enum constant when missing

* add tokens function for each type to avoid clustering configs

* fix tests and add new

* Update packages/config/src/balance/balance.ts

Co-authored-by: Elmar Kenigs <[email protected]>

* improve typing on AssetSymbols

* implement the functionality to transfer multiple assets in Withdraw with transferMultiCurrencies from the precompiles

* update snapshot

* move precompile function call to Contract handler

* consideration of min amount of auxiliar that pays for fees

* pass origin account to sdk and do balance calculations inside

* Update packages/config/src/config/moonbase/assets/bit.ts

Co-authored-by: Elmar Kenigs <[email protected]>

* return 2 different mins from withdraw and make origin account optional

* return origin balance and not calculations for enough balance

* update simple example

* change origin account param to have no breaking changes

* go back to returning min in withdraw to avoid having breaking changes

* remove originAccount param

* update example

Co-authored-by: Elmar Kenigs <[email protected]>
  • Loading branch information
mmaurello and Elmar Kenigs committed Nov 21, 2022
1 parent 652c13a commit 811f6ae
Show file tree
Hide file tree
Showing 36 changed files with 471 additions and 145 deletions.
30 changes: 29 additions & 1 deletion packages/config/src/balance/__snapshots__/balance.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,39 @@ exports[`balance tokens should be correct balance config 1`] = `
}
`;
exports[`balance tokens should be correct balance config foreignAsset 1`] = `
{
"calc": [Function],
"function": "accounts",
"getParams": [Function],
"pallet": "tokens",
"path": [],
}
`;
exports[`balance tokens should be correct params with ForeignAsset 1`] = `
[
"<ACCOUNT>",
{
"ForeignAsset": 5,
"ForeignAsset": 0,
},
]
`;
exports[`balance tokens should be correct params with FungibleToken 1`] = `
[
"<ACCOUNT>",
{
"FungibleToken": 0,
},
]
`;
exports[`balance tokens should be correct params with MiningResource 1`] = `
[
"<ACCOUNT>",
{
"MiningResource": 0,
},
]
`;
Expand Down
9 changes: 9 additions & 0 deletions packages/config/src/balance/balance.constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,12 @@ export enum BalanceFunction {
AssetMetadatas = 'assetMetadatas',
CurrencyMetadatas = 'currencyMetadatas',
}

export enum BalanceCurrencyTypes {
Token = 'Token',
Token2 = 'Token2',
ForeignAsset = 'ForeignAsset',
NativeToken = 'NativeToken',
MiningResource = 'MiningResource',
FungibleToken = 'FungibleToken',
}
27 changes: 16 additions & 11 deletions packages/config/src/balance/balance.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { u128 } from '@polkadot/types';
import { PalletBalancesAccountData } from '@polkadot/types/lookup';
import { AssetSymbol } from '../constants';
import { AssetId } from '../interfaces';
import { BalanceFunction, BalancePallet } from './balance.constants';
import {
BalanceCurrencyTypes,
BalanceFunction,
BalancePallet,
} from './balance.constants';

export type BalanceConfig<Symbols extends AssetSymbol = AssetSymbol> =
| SystemBalanceConfig
Expand Down Expand Up @@ -46,19 +50,20 @@ export interface TokensBalanceConfig<
pallet: BalancePallet.Tokens;
function: BalanceFunction.Accounts;
path: [];
getParams: (account: string) => [
string,
(
| {
Token: Symbols | 'MOVR' | 'KUSD';
}
| { ForeignAsset: AssetId }
| { Token2: AssetId }
),
];
getParams: (account: string) => [string, TokensBalanceParamAsset<Symbols>];
calc: (data: TokensPalletAccountData) => bigint;
}

export type TokensBalanceParamAsset<Symbols extends AssetSymbol = AssetSymbol> =

| {
[BalanceCurrencyTypes.Token]: Symbols | AssetSymbol.KUSD;
}
| { [BalanceCurrencyTypes.ForeignAsset]: AssetId }
| { [BalanceCurrencyTypes.MiningResource]: AssetId }
| { [BalanceCurrencyTypes.FungibleToken]: AssetId }
| { [BalanceCurrencyTypes.Token2]: AssetId };

export type MinBalanceConfig =
| MinBalanceAssetsConfig
| MinBalanceAssetRegistryConfig;
Expand Down
27 changes: 22 additions & 5 deletions packages/config/src/balance/balance.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { AssetSymbol } from '../constants';
import { createBalanceBuilder } from './balance';

describe('balance', () => {
Expand Down Expand Up @@ -39,7 +40,7 @@ describe('balance', () => {
});

describe('tokens', () => {
const cfg = balance.tokens('MOVR');
const cfg = balance.tokens().token(AssetSymbol.MOVR);

it('should be correct balance config', () => {
expect(cfg).toMatchSnapshot();
Expand All @@ -49,16 +50,32 @@ describe('balance', () => {
expect(cfg.getParams(account)).toMatchSnapshot();
});

it('should be correct params with ForeignAsset', () => {
const cfg2 = balance.tokens(5);
const cfg2 = balance.tokens().foreignAsset(0);

it('should be correct balance config foreignAsset', () => {
expect(cfg2).toMatchSnapshot();
});

it('should be correct params with ForeignAsset', () => {
expect(cfg2.getParams(account)).toMatchSnapshot();
});

const cfg3 = balance.tokens().miningResource(0);

it('should be correct params with MiningResource', () => {
expect(cfg3.getParams(account)).toMatchSnapshot();
});

const cfg4 = balance.tokens().fungibleToken(0);

it('should be correct params with FungibleToken', () => {
expect(cfg4.getParams(account)).toMatchSnapshot();
});

it('should be correct params with Token2', () => {
const cfg2 = balance.tokens2(1);
const cfg5 = balance.tokens().token2(1);

expect(cfg2.getParams(account)).toMatchSnapshot();
expect(cfg5.getParams(account)).toMatchSnapshot();
});
});
});
48 changes: 23 additions & 25 deletions packages/config/src/balance/balance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@ import { u128 } from '@polkadot/types';
import { PalletBalancesAccountData } from '@polkadot/types/lookup';
import { AssetSymbol } from '../constants';
import { AssetId } from '../interfaces';
import { BalanceFunction, BalancePallet } from './balance.constants';
import {
BalanceCurrencyTypes,
BalanceFunction,
BalancePallet,
} from './balance.constants';
import {
AssetsBalanceConfig,
MinBalanceAssetRegistryConfig,
MinBalanceAssetsConfig,
OrmlTokensBalanceConfig,
SystemBalanceConfig,
TokensBalanceConfig,
TokensBalanceParamAsset,
TokensPalletAccountData,
} from './balance.interfaces';

Expand All @@ -26,9 +31,7 @@ export function createBalanceBuilder<
minCurrencyMetadata,
ormlTokens,
system,
tokens: (asset: number | bigint | Symbols | 'MOVR' | 'KUSD' | 'AUSD') =>
tokens<Symbols>(asset),
tokens2: (asset: AssetId) => tokens2<Symbols>(asset),
tokens: () => tokens<Symbols>(),
};
}

Expand Down Expand Up @@ -91,35 +94,30 @@ function system(): SystemBalanceConfig {
};
}

function calcTokensBalance({ free, frozen }: TokensPalletAccountData): bigint {
return BigInt(free.sub(frozen).toString());
}

function tokens<Symbols extends AssetSymbol = AssetSymbol>(
asset: number | bigint | Symbols | 'MOVR' | 'KUSD' | 'AUSD',
): TokensBalanceConfig<Symbols> {
function tokens<Symbols extends AssetSymbol = AssetSymbol>() {
return {
pallet: BalancePallet.Tokens,
function: BalanceFunction.Accounts,
path: [],
getParams: (account: string) => [
account,
Number.isInteger(asset)
? { ForeignAsset: asset as number }
: { Token: asset as Symbols },
],
calc: calcTokensBalance,
foreignAsset: (asset: AssetId | Symbols) =>
tokensBase<Symbols>({ [BalanceCurrencyTypes.ForeignAsset]: asset }),
fungibleToken: (asset: AssetId) =>
tokensBase<Symbols>({ [BalanceCurrencyTypes.FungibleToken]: asset }),
miningResource: (asset: AssetId) =>
tokensBase<Symbols>({ [BalanceCurrencyTypes.MiningResource]: asset }),
token: (asset: Symbols | AssetSymbol.KUSD) =>
tokensBase<Symbols>({ [BalanceCurrencyTypes.Token]: asset }),
token2: (asset: AssetId) =>
tokensBase<Symbols>({ [BalanceCurrencyTypes.Token2]: asset }),
};
}

function tokens2<Symbols extends AssetSymbol = AssetSymbol>(
asset: AssetId,
function tokensBase<Symbols extends AssetSymbol = AssetSymbol>(
asset: TokensBalanceParamAsset<Symbols>,
): TokensBalanceConfig<Symbols> {
return {
pallet: BalancePallet.Tokens,
function: BalanceFunction.Accounts,
path: [],
getParams: (account: string) => [account, { Token2: asset }],
calc: calcTokensBalance,
getParams: (account: string) => [account, asset],
calc: ({ free, frozen }: TokensPalletAccountData) =>
BigInt(free.sub(frozen).toString()),
};
}
66 changes: 66 additions & 0 deletions packages/config/src/config/moonbase/assets/bit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { AssetSymbol, ChainKey } from '../../../constants';
import {
XTokensExtrinsicCurrencyTypes,
XTokensExtrinsicSuccessEvent,
} from '../../../extrinsic';
import { WithdrawConfig } from '../../../withdraw';
import {
assets,
balance,
chains,
extrinsic,
withdraw,
} from '../moonbase.common';
import { MoonbaseXcmConfig } from '../moonbase.interfaces';
import { NEER } from './neer';

const asset = assets[AssetSymbol.BIT];
const feeAsset = assets[AssetSymbol.NEER];
const origin = chains[ChainKey.BitCountryPioneer];
const neerWithdrawConfig = NEER.withdraw[
origin.key
] as WithdrawConfig<AssetSymbol.NEER>;

export const BIT: MoonbaseXcmConfig = {
asset,
origin,
deposit: {
[origin.key]: {
source: origin,
balance: balance.tokens().miningResource(0),
sourceFeeBalance: balance.system(),
xcmFeeAsset: {
asset: feeAsset,
balance: balance.system(),
},
extrinsic: extrinsic
.xTokens()
.transferMultiCurrencies()
.successEvent(XTokensExtrinsicSuccessEvent.TransferredMultiAssets)
.origin(origin)
.assets(
{
[XTokensExtrinsicCurrencyTypes.MiningResource]: 0,
},
{
[XTokensExtrinsicCurrencyTypes.NativeToken]: 0,
},
),
},
},
withdraw: {
[origin.key]: withdraw.xTokens({
balance: balance.tokens().miningResource(0),
destination: origin,
feePerWeight: neerWithdrawConfig.feePerWeight,
weight: neerWithdrawConfig.weight,
xcmFeeAsset: {
asset: feeAsset,
balance: {
destination: balance.system(),
origin: balance.assets(feeAsset.id),
},
},
}),
},
};
18 changes: 18 additions & 0 deletions packages/config/src/config/moonbase/assets/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ import { MoonbaseXcmConfig } from '../moonbase.interfaces';

const asset = assets[AssetSymbol.DEV];
const clover = chains[ChainKey.CloverAlphanet];
const pioneer = chains[ChainKey.BitCountryPioneer];

const cloverDevId = getMoonAssetId(clover);
const pioneerDevId = getMoonAssetId(pioneer);

export const DEV: MoonbaseXcmConfig = {
asset,
Expand All @@ -36,12 +38,28 @@ export const DEV: MoonbaseXcmConfig = {
[XTokensExtrinsicCurrencyTypes.OtherReserve]: cloverDevId,
}),
},
[pioneer.key]: {
source: pioneer,
balance: balance.tokens().fungibleToken(pioneerDevId),
sourceFeeBalance: balance.system(),
extrinsic: extrinsic
.xTokens()
.transfer()
.successEvent(XTokensExtrinsicSuccessEvent.TransferredMultiAssets)
.origin(pioneer)
.asset({ [XTokensExtrinsicCurrencyTypes.FungibleToken]: pioneerDevId }),
},
},
withdraw: {
[clover.key]: withdraw.xTokens({
balance: balance.assets(cloverDevId),
destination: clover,
feePerWeight: 50_000,
}),
[pioneer.key]: withdraw.xTokens({
balance: balance.tokens().fungibleToken(pioneerDevId),
destination: pioneer,
feePerWeight: 50_000,
}),
},
};
40 changes: 40 additions & 0 deletions packages/config/src/config/moonbase/assets/neer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { AssetSymbol, ChainKey } from '../../../constants';
import {
XTokensExtrinsicCurrencyTypes,
XTokensExtrinsicSuccessEvent,
} from '../../../extrinsic';
import {
assets,
balance,
chains,
extrinsic,
withdraw,
} from '../moonbase.common';
import { MoonbaseXcmConfig } from '../moonbase.interfaces';

const asset = assets[AssetSymbol.NEER];
const origin = chains[ChainKey.BitCountryPioneer];

export const NEER: MoonbaseXcmConfig = {
asset,
origin,
deposit: {
[origin.key]: {
source: origin,
balance: balance.system(),
extrinsic: extrinsic
.xTokens()
.transfer()
.successEvent(XTokensExtrinsicSuccessEvent.TransferredMultiAssets)
.origin(origin)
.asset({ [XTokensExtrinsicCurrencyTypes.NativeToken]: 0 }),
},
},
withdraw: {
[origin.key]: withdraw.xTokens({
balance: balance.system(),
destination: origin,
feePerWeight: 8_000_000,
}),
},
};
Loading

0 comments on commit 811f6ae

Please sign in to comment.