@moonbeam-network/xcm-utils 0.0.4 → 0.0.5

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/build/index.cjs CHANGED
@@ -30,6 +30,7 @@ __export(src_exports, {
30
30
  createExtrinsicEventHandler: () => createExtrinsicEventHandler,
31
31
  createTxEventHandler: () => createTxEventHandler,
32
32
  getPolkadotApi: () => getPolkadotApi,
33
+ hasDecimalOverflow: () => hasDecimalOverflow,
33
34
  toBigInt: () => toBigInt,
34
35
  toDecimal: () => toDecimal
35
36
  });
@@ -148,12 +149,16 @@ function toDecimal(number, decimals, maxDecimal = 6, roundType) {
148
149
  const dividend = (0, import_big.default)(number.toString().replace(/[^0-9]/g, ""));
149
150
  const divisor = (0, import_big.default)(10).pow(decimals);
150
151
  const result = dividend.div(divisor).round(maxDecimal, roundType);
151
- return result.toNumber();
152
+ return result;
152
153
  }
153
154
  function toBigInt(amount, decimals) {
154
155
  const multiplier = (0, import_big.default)(10).pow(decimals);
155
156
  const result = (0, import_big.default)(amount).mul(multiplier);
156
- return BigInt(result.toFixed());
157
+ return BigInt(result.toFixed(0, import_big.default.roundDown));
158
+ }
159
+ function hasDecimalOverflow(fl, maxDecimal) {
160
+ const parts = fl.toString().split(".");
161
+ return parts.length > 1 && parts[1].length > maxDecimal;
157
162
  }
158
163
  // Annotate the CommonJS export names for ESM import in node:
159
164
  0 && (module.exports = {
@@ -161,6 +166,7 @@ function toBigInt(amount, decimals) {
161
166
  createExtrinsicEventHandler,
162
167
  createTxEventHandler,
163
168
  getPolkadotApi,
169
+ hasDecimalOverflow,
164
170
  toBigInt,
165
171
  toDecimal
166
172
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api/polkadot.api.ts","../src/handlers/handlers.interfaces.ts","../src/handlers/createExtrinsicEventHandler.ts","../src/handlers/createTxEventHandler.ts","../src/numbers/decimals.ts"],"sourcesContent":["export * from './api';\nexport * from './handlers';\nexport * from './numbers';\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(\n ws: string,\n onDisconnect?: VoidFunction,\n): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n if (onDisconnect) {\n api.once('disconnected', onDisconnect);\n }\n\n return api;\n}\n","export type Hash = string;\n\nexport type ExtrinsicEventsCallback = (event: ExtrinsicEvent) => void;\n\nexport type ExtrinsicEvent =\n | ExtrinsicFailedEvent\n | ExtrinsicSentEvent\n | ExtrinsicSuccessEvent;\n\nexport interface ExtrinsicFailedEvent {\n blockHash: Hash;\n message?: string;\n status: ExtrinsicStatus.Failed;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSentEvent {\n status: ExtrinsicStatus.Sent;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSuccessEvent {\n blockHash: Hash;\n status: ExtrinsicStatus.Success;\n txHash: Hash;\n}\n\nexport enum ExtrinsicStatus {\n Failed = 'Failed',\n Sent = 'Sent',\n Success = 'Success',\n}\n","import type { ISubmittableResult } from '@polkadot/types/types';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n} from './handlers.interfaces';\n\nexport function createExtrinsicEventHandler(\n pallet: string,\n successEvent: string,\n cb: ExtrinsicEventsCallback,\n) {\n return ({ events = [], status, txHash }: ISubmittableResult) => {\n const hash = txHash.toHex();\n\n if (status.isReady) {\n cb({ status: ExtrinsicStatus.Sent, txHash: hash });\n }\n\n if (status.isInBlock) {\n const block = status.asInBlock.toString();\n\n events.forEach(({ event: { data, method, section } }) => {\n if (section === pallet && method === successEvent) {\n if (method === 'Attempted') {\n const eventData = data.at(0) as any;\n\n if (eventData.isIncomplete) {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: eventData.asIncomplete?.toHuman().join('; '),\n });\n\n return;\n }\n }\n\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: block,\n txHash: hash,\n });\n }\n\n if (section === 'system' && method === 'ExtrinsicFailed') {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: data.join('; '),\n });\n }\n });\n }\n };\n}\n","import type { Signer as EthersSigner } from 'ethers';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n Hash,\n} from './handlers.interfaces';\n\nexport async function createTxEventHandler(\n ethersSigner: EthersSigner,\n txHash: Hash,\n cb: ExtrinsicEventsCallback,\n skipSentEvent = false,\n) {\n if (!ethersSigner.provider) {\n throw new Error('options.ethersSigner has not provider');\n }\n\n if (!skipSentEvent) {\n cb({ status: ExtrinsicStatus.Sent, txHash });\n }\n\n const tx = await ethersSigner.provider.getTransactionReceipt(txHash);\n\n if (!tx) {\n setTimeout(\n () => createTxEventHandler(ethersSigner, txHash, cb, true),\n 2000,\n );\n return;\n }\n\n if (tx.status === 1) {\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: tx.blockHash,\n txHash,\n });\n } else {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: tx.blockHash,\n txHash,\n });\n }\n}\n","import Big, { RoundingMode } from 'big.js';\n\nexport function toDecimal(\n number: bigint | number | string,\n decimals: number,\n maxDecimal = 6,\n roundType?: RoundingMode,\n): number {\n const dividend = Big(number.toString().replace(/[^0-9]/g, ''));\n const divisor = Big(10).pow(decimals);\n const result = dividend.div(divisor).round(maxDecimal, roundType);\n\n return result.toNumber();\n}\n\nexport function toBigInt(amount: string | number, decimals: number): bigint {\n const multiplier = Big(10).pow(decimals);\n const result = Big(amount).mul(multiplier);\n\n return BigInt(result.toFixed());\n}\n"],"mappings":"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","names":["LRU","ExtrinsicStatus","Big"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api/polkadot.api.ts","../src/handlers/handlers.interfaces.ts","../src/handlers/createExtrinsicEventHandler.ts","../src/handlers/createTxEventHandler.ts","../src/numbers/decimals.ts"],"sourcesContent":["export * from './api';\nexport * from './handlers';\nexport * from './numbers';\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(\n ws: string,\n onDisconnect?: VoidFunction,\n): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n if (onDisconnect) {\n api.once('disconnected', onDisconnect);\n }\n\n return api;\n}\n","export type Hash = string;\n\nexport type ExtrinsicEventsCallback = (event: ExtrinsicEvent) => void;\n\nexport type ExtrinsicEvent =\n | ExtrinsicFailedEvent\n | ExtrinsicSentEvent\n | ExtrinsicSuccessEvent;\n\nexport interface ExtrinsicFailedEvent {\n blockHash: Hash;\n message?: string;\n status: ExtrinsicStatus.Failed;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSentEvent {\n status: ExtrinsicStatus.Sent;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSuccessEvent {\n blockHash: Hash;\n status: ExtrinsicStatus.Success;\n txHash: Hash;\n}\n\nexport enum ExtrinsicStatus {\n Failed = 'Failed',\n Sent = 'Sent',\n Success = 'Success',\n}\n","import type { ISubmittableResult } from '@polkadot/types/types';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n} from './handlers.interfaces';\n\nexport function createExtrinsicEventHandler(\n pallet: string,\n successEvent: string,\n cb: ExtrinsicEventsCallback,\n) {\n return ({ events = [], status, txHash }: ISubmittableResult) => {\n const hash = txHash.toHex();\n\n if (status.isReady) {\n cb({ status: ExtrinsicStatus.Sent, txHash: hash });\n }\n\n if (status.isInBlock) {\n const block = status.asInBlock.toString();\n\n events.forEach(({ event: { data, method, section } }) => {\n if (section === pallet && method === successEvent) {\n if (method === 'Attempted') {\n const eventData = data.at(0) as any;\n\n if (eventData.isIncomplete) {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: eventData.asIncomplete?.toHuman().join('; '),\n });\n\n return;\n }\n }\n\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: block,\n txHash: hash,\n });\n }\n\n if (section === 'system' && method === 'ExtrinsicFailed') {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: data.join('; '),\n });\n }\n });\n }\n };\n}\n","import type { Signer as EthersSigner } from 'ethers';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n Hash,\n} from './handlers.interfaces';\n\nexport async function createTxEventHandler(\n ethersSigner: EthersSigner,\n txHash: Hash,\n cb: ExtrinsicEventsCallback,\n skipSentEvent = false,\n) {\n if (!ethersSigner.provider) {\n throw new Error('options.ethersSigner has not provider');\n }\n\n if (!skipSentEvent) {\n cb({ status: ExtrinsicStatus.Sent, txHash });\n }\n\n const tx = await ethersSigner.provider.getTransactionReceipt(txHash);\n\n if (!tx) {\n setTimeout(\n () => createTxEventHandler(ethersSigner, txHash, cb, true),\n 2000,\n );\n return;\n }\n\n if (tx.status === 1) {\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: tx.blockHash,\n txHash,\n });\n } else {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: tx.blockHash,\n txHash,\n });\n }\n}\n","import Big, { RoundingMode } from 'big.js';\n\nexport function toDecimal(\n number: bigint | number | string,\n decimals: number,\n maxDecimal = 6,\n roundType?: RoundingMode,\n): Big {\n const dividend = Big(number.toString().replace(/[^0-9]/g, ''));\n const divisor = Big(10).pow(decimals);\n const result = dividend.div(divisor).round(maxDecimal, roundType);\n\n return result;\n}\n\nexport function toBigInt(amount: string | number, decimals: number): bigint {\n const multiplier = Big(10).pow(decimals);\n const result = Big(amount).mul(multiplier);\n\n return BigInt(result.toFixed(0, Big.roundDown));\n}\n\nexport function hasDecimalOverflow(fl: number | string, maxDecimal: number) {\n const parts = fl.toString().split('.');\n return parts.length > 1 && parts[1].length > maxDecimal;\n}\n"],"mappings":"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","names":["LRU","ExtrinsicStatus","Big"]}
package/build/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ApiPromise } from '@polkadot/api';
2
2
  import { ISubmittableResult } from '@polkadot/types/types';
3
3
  import { Signer } from 'ethers';
4
- import { RoundingMode } from 'big.js';
4
+ import Big, { RoundingMode } from 'big.js';
5
5
 
6
6
  declare function getPolkadotApi(
7
7
  ws: string,
@@ -53,8 +53,12 @@ declare function toDecimal(
53
53
  decimals: number,
54
54
  maxDecimal?: number,
55
55
  roundType?: RoundingMode,
56
- ): number;
56
+ ): Big;
57
57
  declare function toBigInt(amount: string | number, decimals: number): bigint;
58
+ declare function hasDecimalOverflow(
59
+ fl: number | string,
60
+ maxDecimal: number,
61
+ ): boolean;
58
62
 
59
63
  export {
60
64
  ExtrinsicEvent,
@@ -67,6 +71,7 @@ export {
67
71
  createExtrinsicEventHandler,
68
72
  createTxEventHandler,
69
73
  getPolkadotApi,
74
+ hasDecimalOverflow,
70
75
  toBigInt,
71
76
  toDecimal,
72
77
  };
package/build/index.mjs CHANGED
@@ -111,18 +111,23 @@ function toDecimal(number, decimals, maxDecimal = 6, roundType) {
111
111
  const dividend = Big(number.toString().replace(/[^0-9]/g, ""));
112
112
  const divisor = Big(10).pow(decimals);
113
113
  const result = dividend.div(divisor).round(maxDecimal, roundType);
114
- return result.toNumber();
114
+ return result;
115
115
  }
116
116
  function toBigInt(amount, decimals) {
117
117
  const multiplier = Big(10).pow(decimals);
118
118
  const result = Big(amount).mul(multiplier);
119
- return BigInt(result.toFixed());
119
+ return BigInt(result.toFixed(0, Big.roundDown));
120
+ }
121
+ function hasDecimalOverflow(fl, maxDecimal) {
122
+ const parts = fl.toString().split(".");
123
+ return parts.length > 1 && parts[1].length > maxDecimal;
120
124
  }
121
125
  export {
122
126
  ExtrinsicStatus,
123
127
  createExtrinsicEventHandler,
124
128
  createTxEventHandler,
125
129
  getPolkadotApi,
130
+ hasDecimalOverflow,
126
131
  toBigInt,
127
132
  toDecimal
128
133
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/polkadot.api.ts","../src/handlers/handlers.interfaces.ts","../src/handlers/createExtrinsicEventHandler.ts","../src/handlers/createTxEventHandler.ts","../src/numbers/decimals.ts"],"sourcesContent":["import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(\n ws: string,\n onDisconnect?: VoidFunction,\n): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n if (onDisconnect) {\n api.once('disconnected', onDisconnect);\n }\n\n return api;\n}\n","export type Hash = string;\n\nexport type ExtrinsicEventsCallback = (event: ExtrinsicEvent) => void;\n\nexport type ExtrinsicEvent =\n | ExtrinsicFailedEvent\n | ExtrinsicSentEvent\n | ExtrinsicSuccessEvent;\n\nexport interface ExtrinsicFailedEvent {\n blockHash: Hash;\n message?: string;\n status: ExtrinsicStatus.Failed;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSentEvent {\n status: ExtrinsicStatus.Sent;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSuccessEvent {\n blockHash: Hash;\n status: ExtrinsicStatus.Success;\n txHash: Hash;\n}\n\nexport enum ExtrinsicStatus {\n Failed = 'Failed',\n Sent = 'Sent',\n Success = 'Success',\n}\n","import type { ISubmittableResult } from '@polkadot/types/types';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n} from './handlers.interfaces';\n\nexport function createExtrinsicEventHandler(\n pallet: string,\n successEvent: string,\n cb: ExtrinsicEventsCallback,\n) {\n return ({ events = [], status, txHash }: ISubmittableResult) => {\n const hash = txHash.toHex();\n\n if (status.isReady) {\n cb({ status: ExtrinsicStatus.Sent, txHash: hash });\n }\n\n if (status.isInBlock) {\n const block = status.asInBlock.toString();\n\n events.forEach(({ event: { data, method, section } }) => {\n if (section === pallet && method === successEvent) {\n if (method === 'Attempted') {\n const eventData = data.at(0) as any;\n\n if (eventData.isIncomplete) {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: eventData.asIncomplete?.toHuman().join('; '),\n });\n\n return;\n }\n }\n\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: block,\n txHash: hash,\n });\n }\n\n if (section === 'system' && method === 'ExtrinsicFailed') {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: data.join('; '),\n });\n }\n });\n }\n };\n}\n","import type { Signer as EthersSigner } from 'ethers';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n Hash,\n} from './handlers.interfaces';\n\nexport async function createTxEventHandler(\n ethersSigner: EthersSigner,\n txHash: Hash,\n cb: ExtrinsicEventsCallback,\n skipSentEvent = false,\n) {\n if (!ethersSigner.provider) {\n throw new Error('options.ethersSigner has not provider');\n }\n\n if (!skipSentEvent) {\n cb({ status: ExtrinsicStatus.Sent, txHash });\n }\n\n const tx = await ethersSigner.provider.getTransactionReceipt(txHash);\n\n if (!tx) {\n setTimeout(\n () => createTxEventHandler(ethersSigner, txHash, cb, true),\n 2000,\n );\n return;\n }\n\n if (tx.status === 1) {\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: tx.blockHash,\n txHash,\n });\n } else {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: tx.blockHash,\n txHash,\n });\n }\n}\n","import Big, { RoundingMode } from 'big.js';\n\nexport function toDecimal(\n number: bigint | number | string,\n decimals: number,\n maxDecimal = 6,\n roundType?: RoundingMode,\n): number {\n const dividend = Big(number.toString().replace(/[^0-9]/g, ''));\n const divisor = Big(10).pow(decimals);\n const result = dividend.div(divisor).round(maxDecimal, roundType);\n\n return result.toNumber();\n}\n\nexport function toBigInt(amount: string | number, decimals: number): bigint {\n const multiplier = Big(10).pow(decimals);\n const result = Big(amount).mul(multiplier);\n\n return BigInt(result.toFixed());\n}\n"],"mappings":";AAAA,SAAS,YAAY,kBAAkB;AACvC,OAAO,SAAS;AAEhB,IAAM,QAAQ,IAAI,IAAiC;AAAA,EACjD,KAAK;AAAA,EACL,SAAS,OAAO,YAAiC;AAC/C,UAAM,MAAM,MAAM;AAElB,QAAI,IAAI,aAAa;AACnB,UAAI,WAAW;AAAA,IACjB;AAAA,EACF;AACF,CAAC;AAED,eAAsB,eACpB,IACA,cACqB;AACrB,QAAM,UACJ,MAAM,IAAI,EAAE,KACZ,WAAW,OAAO;AAAA,IAChB,UAAU,IAAI,WAAW,EAAE;AAAA,EAC7B,CAAC;AAEH,QAAM,IAAI,IAAI,OAAO;AAErB,QAAM,MAAM,MAAM;AAElB,QAAM,IAAI;AAEV,MAAI,cAAc;AAChB,QAAI,KAAK,gBAAgB,YAAY;AAAA,EACvC;AAEA,SAAO;AACT;;;ACRO,IAAK,kBAAL,kBAAKA,qBAAL;AACL,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,aAAU;AAHA,SAAAA;AAAA,GAAA;;;ACrBL,SAAS,4BACd,QACA,cACA,IACA;AACA,SAAO,CAAC,EAAE,SAAS,CAAC,GAAG,QAAQ,OAAO,MAA0B;AAC9D,UAAM,OAAO,OAAO,MAAM;AAE1B,QAAI,OAAO,SAAS;AAClB,SAAG,EAAE,2BAA8B,QAAQ,KAAK,CAAC;AAAA,IACnD;AAEA,QAAI,OAAO,WAAW;AACpB,YAAM,QAAQ,OAAO,UAAU,SAAS;AAExC,aAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE,MAAM;AArB/D;AAsBQ,YAAI,YAAY,UAAU,WAAW,cAAc;AACjD,cAAI,WAAW,aAAa;AAC1B,kBAAM,YAAY,KAAK,GAAG,CAAC;AAE3B,gBAAI,UAAU,cAAc;AAC1B,iBAAG;AAAA,gBACD;AAAA,gBACA,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,UAAS,eAAU,iBAAV,mBAAwB,UAAU,KAAK;AAAA,cAClD,CAAC;AAED;AAAA,YACF;AAAA,UACF;AAEA,aAAG;AAAA,YACD;AAAA,YACA,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,YAAI,YAAY,YAAY,WAAW,mBAAmB;AACxD,aAAG;AAAA,YACD;AAAA,YACA,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,KAAK,KAAK,IAAI;AAAA,UACzB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjDA,eAAsB,qBACpB,cACA,QACA,IACA,gBAAgB,OAChB;AACA,MAAI,CAAC,aAAa,UAAU;AAC1B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,MAAI,CAAC,eAAe;AAClB,OAAG,EAAE,2BAA8B,OAAO,CAAC;AAAA,EAC7C;AAEA,QAAM,KAAK,MAAM,aAAa,SAAS,sBAAsB,MAAM;AAEnE,MAAI,CAAC,IAAI;AACP;AAAA,MACE,MAAM,qBAAqB,cAAc,QAAQ,IAAI,IAAI;AAAA,MACzD;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,GAAG,WAAW,GAAG;AACnB,OAAG;AAAA,MACD;AAAA,MACA,WAAW,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,OAAG;AAAA,MACD;AAAA,MACA,WAAW,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC5CA,OAAO,SAA2B;AAE3B,SAAS,UACd,QACA,UACA,aAAa,GACb,WACQ;AACR,QAAM,WAAW,IAAI,OAAO,SAAS,EAAE,QAAQ,WAAW,EAAE,CAAC;AAC7D,QAAM,UAAU,IAAI,EAAE,EAAE,IAAI,QAAQ;AACpC,QAAM,SAAS,SAAS,IAAI,OAAO,EAAE,MAAM,YAAY,SAAS;AAEhE,SAAO,OAAO,SAAS;AACzB;AAEO,SAAS,SAAS,QAAyB,UAA0B;AAC1E,QAAM,aAAa,IAAI,EAAE,EAAE,IAAI,QAAQ;AACvC,QAAM,SAAS,IAAI,MAAM,EAAE,IAAI,UAAU;AAEzC,SAAO,OAAO,OAAO,QAAQ,CAAC;AAChC;","names":["ExtrinsicStatus"]}
1
+ {"version":3,"sources":["../src/api/polkadot.api.ts","../src/handlers/handlers.interfaces.ts","../src/handlers/createExtrinsicEventHandler.ts","../src/handlers/createTxEventHandler.ts","../src/numbers/decimals.ts"],"sourcesContent":["import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(\n ws: string,\n onDisconnect?: VoidFunction,\n): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n if (onDisconnect) {\n api.once('disconnected', onDisconnect);\n }\n\n return api;\n}\n","export type Hash = string;\n\nexport type ExtrinsicEventsCallback = (event: ExtrinsicEvent) => void;\n\nexport type ExtrinsicEvent =\n | ExtrinsicFailedEvent\n | ExtrinsicSentEvent\n | ExtrinsicSuccessEvent;\n\nexport interface ExtrinsicFailedEvent {\n blockHash: Hash;\n message?: string;\n status: ExtrinsicStatus.Failed;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSentEvent {\n status: ExtrinsicStatus.Sent;\n txHash: Hash;\n}\n\nexport interface ExtrinsicSuccessEvent {\n blockHash: Hash;\n status: ExtrinsicStatus.Success;\n txHash: Hash;\n}\n\nexport enum ExtrinsicStatus {\n Failed = 'Failed',\n Sent = 'Sent',\n Success = 'Success',\n}\n","import type { ISubmittableResult } from '@polkadot/types/types';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n} from './handlers.interfaces';\n\nexport function createExtrinsicEventHandler(\n pallet: string,\n successEvent: string,\n cb: ExtrinsicEventsCallback,\n) {\n return ({ events = [], status, txHash }: ISubmittableResult) => {\n const hash = txHash.toHex();\n\n if (status.isReady) {\n cb({ status: ExtrinsicStatus.Sent, txHash: hash });\n }\n\n if (status.isInBlock) {\n const block = status.asInBlock.toString();\n\n events.forEach(({ event: { data, method, section } }) => {\n if (section === pallet && method === successEvent) {\n if (method === 'Attempted') {\n const eventData = data.at(0) as any;\n\n if (eventData.isIncomplete) {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: eventData.asIncomplete?.toHuman().join('; '),\n });\n\n return;\n }\n }\n\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: block,\n txHash: hash,\n });\n }\n\n if (section === 'system' && method === 'ExtrinsicFailed') {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: block,\n txHash: hash,\n message: data.join('; '),\n });\n }\n });\n }\n };\n}\n","import type { Signer as EthersSigner } from 'ethers';\nimport {\n ExtrinsicEventsCallback,\n ExtrinsicStatus,\n Hash,\n} from './handlers.interfaces';\n\nexport async function createTxEventHandler(\n ethersSigner: EthersSigner,\n txHash: Hash,\n cb: ExtrinsicEventsCallback,\n skipSentEvent = false,\n) {\n if (!ethersSigner.provider) {\n throw new Error('options.ethersSigner has not provider');\n }\n\n if (!skipSentEvent) {\n cb({ status: ExtrinsicStatus.Sent, txHash });\n }\n\n const tx = await ethersSigner.provider.getTransactionReceipt(txHash);\n\n if (!tx) {\n setTimeout(\n () => createTxEventHandler(ethersSigner, txHash, cb, true),\n 2000,\n );\n return;\n }\n\n if (tx.status === 1) {\n cb({\n status: ExtrinsicStatus.Success,\n blockHash: tx.blockHash,\n txHash,\n });\n } else {\n cb({\n status: ExtrinsicStatus.Failed,\n blockHash: tx.blockHash,\n txHash,\n });\n }\n}\n","import Big, { RoundingMode } from 'big.js';\n\nexport function toDecimal(\n number: bigint | number | string,\n decimals: number,\n maxDecimal = 6,\n roundType?: RoundingMode,\n): Big {\n const dividend = Big(number.toString().replace(/[^0-9]/g, ''));\n const divisor = Big(10).pow(decimals);\n const result = dividend.div(divisor).round(maxDecimal, roundType);\n\n return result;\n}\n\nexport function toBigInt(amount: string | number, decimals: number): bigint {\n const multiplier = Big(10).pow(decimals);\n const result = Big(amount).mul(multiplier);\n\n return BigInt(result.toFixed(0, Big.roundDown));\n}\n\nexport function hasDecimalOverflow(fl: number | string, maxDecimal: number) {\n const parts = fl.toString().split('.');\n return parts.length > 1 && parts[1].length > maxDecimal;\n}\n"],"mappings":";AAAA,SAAS,YAAY,kBAAkB;AACvC,OAAO,SAAS;AAEhB,IAAM,QAAQ,IAAI,IAAiC;AAAA,EACjD,KAAK;AAAA,EACL,SAAS,OAAO,YAAiC;AAC/C,UAAM,MAAM,MAAM;AAElB,QAAI,IAAI,aAAa;AACnB,UAAI,WAAW;AAAA,IACjB;AAAA,EACF;AACF,CAAC;AAED,eAAsB,eACpB,IACA,cACqB;AACrB,QAAM,UACJ,MAAM,IAAI,EAAE,KACZ,WAAW,OAAO;AAAA,IAChB,UAAU,IAAI,WAAW,EAAE;AAAA,EAC7B,CAAC;AAEH,QAAM,IAAI,IAAI,OAAO;AAErB,QAAM,MAAM,MAAM;AAElB,QAAM,IAAI;AAEV,MAAI,cAAc;AAChB,QAAI,KAAK,gBAAgB,YAAY;AAAA,EACvC;AAEA,SAAO;AACT;;;ACRO,IAAK,kBAAL,kBAAKA,qBAAL;AACL,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,aAAU;AAHA,SAAAA;AAAA,GAAA;;;ACrBL,SAAS,4BACd,QACA,cACA,IACA;AACA,SAAO,CAAC,EAAE,SAAS,CAAC,GAAG,QAAQ,OAAO,MAA0B;AAC9D,UAAM,OAAO,OAAO,MAAM;AAE1B,QAAI,OAAO,SAAS;AAClB,SAAG,EAAE,2BAA8B,QAAQ,KAAK,CAAC;AAAA,IACnD;AAEA,QAAI,OAAO,WAAW;AACpB,YAAM,QAAQ,OAAO,UAAU,SAAS;AAExC,aAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE,MAAM;AArB/D;AAsBQ,YAAI,YAAY,UAAU,WAAW,cAAc;AACjD,cAAI,WAAW,aAAa;AAC1B,kBAAM,YAAY,KAAK,GAAG,CAAC;AAE3B,gBAAI,UAAU,cAAc;AAC1B,iBAAG;AAAA,gBACD;AAAA,gBACA,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,UAAS,eAAU,iBAAV,mBAAwB,UAAU,KAAK;AAAA,cAClD,CAAC;AAED;AAAA,YACF;AAAA,UACF;AAEA,aAAG;AAAA,YACD;AAAA,YACA,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,YAAI,YAAY,YAAY,WAAW,mBAAmB;AACxD,aAAG;AAAA,YACD;AAAA,YACA,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,KAAK,KAAK,IAAI;AAAA,UACzB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjDA,eAAsB,qBACpB,cACA,QACA,IACA,gBAAgB,OAChB;AACA,MAAI,CAAC,aAAa,UAAU;AAC1B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,MAAI,CAAC,eAAe;AAClB,OAAG,EAAE,2BAA8B,OAAO,CAAC;AAAA,EAC7C;AAEA,QAAM,KAAK,MAAM,aAAa,SAAS,sBAAsB,MAAM;AAEnE,MAAI,CAAC,IAAI;AACP;AAAA,MACE,MAAM,qBAAqB,cAAc,QAAQ,IAAI,IAAI;AAAA,MACzD;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,GAAG,WAAW,GAAG;AACnB,OAAG;AAAA,MACD;AAAA,MACA,WAAW,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,OAAG;AAAA,MACD;AAAA,MACA,WAAW,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC5CA,OAAO,SAA2B;AAE3B,SAAS,UACd,QACA,UACA,aAAa,GACb,WACK;AACL,QAAM,WAAW,IAAI,OAAO,SAAS,EAAE,QAAQ,WAAW,EAAE,CAAC;AAC7D,QAAM,UAAU,IAAI,EAAE,EAAE,IAAI,QAAQ;AACpC,QAAM,SAAS,SAAS,IAAI,OAAO,EAAE,MAAM,YAAY,SAAS;AAEhE,SAAO;AACT;AAEO,SAAS,SAAS,QAAyB,UAA0B;AAC1E,QAAM,aAAa,IAAI,EAAE,EAAE,IAAI,QAAQ;AACvC,QAAM,SAAS,IAAI,MAAM,EAAE,IAAI,UAAU;AAEzC,SAAO,OAAO,OAAO,QAAQ,GAAG,IAAI,SAAS,CAAC;AAChD;AAEO,SAAS,mBAAmB,IAAqB,YAAoB;AAC1E,QAAM,QAAQ,GAAG,SAAS,EAAE,MAAM,GAAG;AACrC,SAAO,MAAM,SAAS,KAAK,MAAM,GAAG,SAAS;AAC/C;","names":["ExtrinsicStatus"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonbeam-network/xcm-utils",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Moonbeam XCM utilities",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -51,7 +51,7 @@
51
51
  "main": "./build/index.cjs",
52
52
  "dependencies": {
53
53
  "big.js": "^6.2.1",
54
- "lru-cache": "^7.14.0"
54
+ "lru-cache": "^7.17.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/big.js": "^6.1.6"